Merge "add drmserver64 for 64bit only projects"
diff --git a/apps/CameraITS/config.yml b/apps/CameraITS/config.yml
index bc35cb1..fc712b3 100644
--- a/apps/CameraITS/config.yml
+++ b/apps/CameraITS/config.yml
@@ -44,7 +44,7 @@
       test_length: 7
       debug_mode: "False"  # quotes are needed here
       chart_distance: 25
-      rotator_cntl: <controller-type>  # can be arduino or canakit
+      rotator_cntl: <controller-type>  # arduino, canakit, or as-is for manual
       rotator_ch: <controller-channel>
       camera: <camera-id>
 
diff --git a/apps/CameraITS/tests/its_base_test.py b/apps/CameraITS/tests/its_base_test.py
index d488a6f..937edfc 100644
--- a/apps/CameraITS/tests/its_base_test.py
+++ b/apps/CameraITS/tests/its_base_test.py
@@ -160,6 +160,7 @@
     self.tablet.adb.shell('am force-stop com.google.android.apps.docs')
     self.tablet.adb.shell('am force-stop com.google.android.apps.photos')
     self.tablet.adb.shell('am force-stop com.android.gallery3d')
+    self.tablet.adb.shell('am force-stop com.sec.android.gallery3d')
 
   def set_tablet_landscape_orientation(self):
     """Sets the screen orientation to landscape.
diff --git a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
index 5b1b74b..01fbb77 100644
--- a/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
+++ b/apps/CameraITS/tests/scene0/test_solid_color_test_pattern.py
@@ -226,8 +226,12 @@
                         'testPatternData: %s', captured_pattern,
                         str(cap['metadata']['android.sensor.testPatternData']))
           # Save test pattern image
-          img = image_processing_utils.convert_capture_to_rgb_image(
-              cap, props=props)
+          if fmt['format'] == 'yuv':
+            img = image_processing_utils.convert_capture_to_rgb_image(
+                cap, props=props)
+          else:
+            img = image_processing_utils.convert_capture_to_rgb_image(
+                cap, props=props, apply_ccm_raw_to_rgb=False)
           captured_color = color['color']
           image_processing_utils.write_image(
               img,
diff --git a/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py b/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
index 4f589ce..710e207 100644
--- a/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
+++ b/apps/CameraITS/tests/scene1_1/test_ev_compensation_advanced.py
@@ -15,11 +15,11 @@
 
 
 import logging
+import math
 import os.path
 import matplotlib
 from matplotlib import pylab
 from mobly import test_runner
-import numpy as np
 
 import its_base_test
 import camera_properties_utils
@@ -29,17 +29,15 @@
 
 LINEAR_TONEMAP_CURVE = [0.0, 0.0, 1.0, 1.0]
 LOCKED = 3
-LUMA_DELTA_THRESH = 0.05
-LUMA_LOCKED_TOL = 0.05
+LUMA_DELTA_ATOL = 0.05
+LUMA_DELTA_ATOL_SAT = 0.10
+LUMA_SAT_THRESH = 0.75  # luma value at which ATOL changes from MID to SAT
 NAME = os.path.splitext(os.path.basename(__file__))[0]
 PATCH_H = 0.1  # center 10%
 PATCH_W = 0.1
 PATCH_X = 0.5 - PATCH_W/2
 PATCH_Y = 0.5 - PATCH_H/2
 THRESH_CONVERGE_FOR_EV = 8  # AE must converge within this num auto reqs for EV
-YUV_FULL_SCALE = 255.0
-YUV_SAT_MIN = 250.0
-YUV_SAT_TOL = 3.0
 
 
 def create_request_with_ev(ev):
@@ -122,6 +120,10 @@
         caps = cam.do_capture([req]*THRESH_CONVERGE_FOR_EV, fmt)
         for cap in caps:
           if cap['metadata']['android.control.aeState'] == LOCKED:
+            ev_meta = cap['metadata']['android.control.aeExposureCompensation']
+            if ev_meta != ev:
+              raise AssertionError(
+                  f'EV comp capture != request! cap: {ev_meta}, req: {ev}')
             lumas.append(extract_luma_from_capture(cap))
             break
         if caps[THRESH_CONVERGE_FOR_EV-1]['metadata'][
@@ -133,6 +135,8 @@
       i_mid = len(ev_steps) // 2
       luma_normal = lumas[i_mid] / ev_shifts[i_mid]
       expected_lumas = [min(1.0, luma_normal*shift) for shift in ev_shifts]
+      luma_delta_atols = [LUMA_DELTA_ATOL if l < LUMA_SAT_THRESH
+                          else LUMA_DELTA_ATOL_SAT for l in expected_lumas]
 
       # Create plot
       pylab.figure(NAME)
@@ -145,17 +149,15 @@
       matplotlib.pyplot.savefig(
           '%s_plot_means.png' % os.path.join(log_path, NAME))
 
-      luma_diffs = [expected_lumas[i]-lumas[i] for i in range(len(ev_steps))]
-      max_diff = max(abs(i) for i in luma_diffs)
-      avg_diff = abs(np.array(luma_diffs)).mean()
-      logging.debug(
-          'Max delta between modeled and measured lumas: %.4f', max_diff)
-      logging.debug(
-          'Avg delta between modeled and measured lumas: %.4f', avg_diff)
-      if max_diff > LUMA_DELTA_THRESH:
-        raise AssertionError(f'Max delta between modeled and measured '
-                             f'lumas: {max_diff:.3f}, '
-                             f'TOL: {LUMA_DELTA_THRESH}.')
+      for i, luma in enumerate(lumas):
+        luma_delta_atol = luma_delta_atols[i]
+        logging.debug('EV step: %3d, luma: %.3f, model: %.3f, ATOL: %.2f',
+                      ev_steps[i], luma, expected_lumas[i], luma_delta_atol)
+        if not math.isclose(luma, expected_lumas[i],
+                            abs_tol=luma_delta_atol):
+          raise AssertionError('Modeled/measured luma deltas too large! '
+                               f'meas: {lumas[i]}, model: {expected_lumas[i]}, '
+                               f'ATOL: {luma_delta_atol}.')
 
 
 if __name__ == '__main__':
diff --git a/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py b/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
index 379cc11..7d8b9f2 100644
--- a/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
+++ b/apps/CameraITS/tests/scene1_1/test_ev_compensation_basic.py
@@ -29,7 +29,8 @@
 import its_session_utils
 
 LOCKED = 3
-LUMA_LOCKED_TOL = 0.05
+LUMA_LOCKED_RTOL_EV_SM = 0.05
+LUMA_LOCKED_RTOL_EV_LG = 0.10
 NAME = os.path.splitext(os.path.basename(__file__))[0]
 NUM_UNSATURATED_EVS = 3
 PATCH_H = 0.1  # center 10%
@@ -87,6 +88,11 @@
           props['android.control.aeCompensationStep'])
       steps_per_ev = int(1.0 / ev_per_step)
       evs = range(-2 * steps_per_ev, 2 * steps_per_ev + 1, steps_per_ev)
+      luma_locked_rtols = [LUMA_LOCKED_RTOL_EV_LG,
+                           LUMA_LOCKED_RTOL_EV_SM,
+                           LUMA_LOCKED_RTOL_EV_SM,
+                           LUMA_LOCKED_RTOL_EV_SM,
+                           LUMA_LOCKED_RTOL_EV_LG]
 
       # Converge 3A, and lock AE once converged. skip AF trigger as
       # dark/bright scene could make AF convergence fail and this test
@@ -100,7 +106,8 @@
       fmt = capture_request_utils.get_smallest_yuv_format(
           props, match_ar=match_ar)
       lumas = []
-      for ev in evs:
+      for j, ev in enumerate(evs):
+        luma_locked_rtol = luma_locked_rtols[j]
         # Capture a single shot with the same EV comp and locked AE.
         req = create_request_with_ev(ev)
         caps = cam.do_capture([req]*THRESH_CONVERGE_FOR_EV, fmt)
@@ -112,14 +119,19 @@
             image_processing_utils.write_image(
                 img, f'{test_name_w_path}_ev{ev}_frame{i}.jpg')
           if cap['metadata']['android.control.aeState'] == LOCKED:
+            ev_meta = cap['metadata']['android.control.aeExposureCompensation']
+            logging.debug('cap EV compensation: %d', ev_meta)
+            if ev != ev_meta:
+              raise AssertionError(
+                  f'EV compensation cap != req! cap: {ev_meta}, req: {ev}')
             luma = extract_luma_from_capture(cap)
             luma_locked.append(luma)
             if i == THRESH_CONVERGE_FOR_EV-1:
               lumas.append(luma)
               if not math.isclose(min(luma_locked), max(luma_locked),
-                                  rel_tol=LUMA_LOCKED_TOL):
+                                  rel_tol=luma_locked_rtol):
                 raise AssertionError(f'AE locked lumas: {luma_locked}, '
-                                     f'RTOL: {LUMA_LOCKED_TOL}')
+                                     f'RTOL: {luma_locked_rtol}')
       logging.debug('lumas in AE locked captures: %s', str(lumas))
       if caps[THRESH_CONVERGE_FOR_EV-1]['metadata'][
           'android.control.aeState'] != LOCKED:
diff --git a/apps/CameraITS/utils/image_processing_utils.py b/apps/CameraITS/utils/image_processing_utils.py
index c041e24..8e6a82a 100644
--- a/apps/CameraITS/utils/image_processing_utils.py
+++ b/apps/CameraITS/utils/image_processing_utils.py
@@ -50,7 +50,8 @@
 def convert_capture_to_rgb_image(cap,
                                  ccm_yuv_to_rgb=DEFAULT_YUV_TO_RGB_CCM,
                                  yuv_off=DEFAULT_YUV_OFFSETS,
-                                 props=None):
+                                 props=None,
+                                 apply_ccm_raw_to_rgb=True):
   """Convert a captured image object to a RGB image.
 
   Args:
@@ -59,6 +60,7 @@
      yuv_off: (Optional) offsets to subtract from each of Y,U,V values.
      props: (Optional) camera properties object (of static values);
             required for processing raw images.
+     apply_ccm_raw_to_rgb: (Optional) boolean to apply color correction matrix.
 
   Returns:
         RGB float-3 image array, with pixel values in [0.0, 1.0].
@@ -83,7 +85,8 @@
   elif cap['format'] == 'raw' or cap['format'] == 'rawStats':
     assert props is not None
     r, gr, gb, b = convert_capture_to_planes(cap, props)
-    return convert_raw_to_rgb_image(r, gr, gb, b, props, cap['metadata'])
+    return convert_raw_to_rgb_image(
+        r, gr, gb, b, props, cap['metadata'], apply_ccm_raw_to_rgb)
   elif cap['format'] == 'y8':
     y = cap['data'][0: w * h]
     return convert_y8_to_rgb_image(y, w, h)
@@ -348,7 +351,7 @@
 
 
 def convert_raw_to_rgb_image(r_plane, gr_plane, gb_plane, b_plane, props,
-                             cap_res):
+                             cap_res, apply_ccm_raw_to_rgb=True):
   """Convert a Bayer raw-16 image to an RGB image.
 
   Includes some extremely rudimentary demosaicking and color processing
@@ -363,9 +366,10 @@
             in the Bayer image, with pixels in the [0.0, 1.0] range.
    props: Camera properties object.
    cap_res: Capture result (metadata) object.
+   apply_ccm_raw_to_rgb: (Optional) boolean to apply color correction matrix.
 
   Returns:
-    RGB float-3 image array, with pixel values in [0.0, 1.0]
+   RGB float-3 image array, with pixel values in [0.0, 1.0]
   """
     # Values required for the RAW to RGB conversion.
   assert props is not None
@@ -396,7 +400,9 @@
   h, w = r_plane.shape[:2]
   img = numpy.dstack([r_plane, (gr_plane + gb_plane) / 2.0, b_plane])
   img = (((img.reshape(h, w, 3) - black_levels) * scale) * gains).clip(0.0, 1.0)
-  img = numpy.dot(img.reshape(w * h, 3), ccm.T).reshape(h, w, 3).clip(0.0, 1.0)
+  if apply_ccm_raw_to_rgb:
+    img = numpy.dot(
+        img.reshape(w * h, 3), ccm.T).reshape(h, w, 3).clip(0.0, 1.0)
   return img
 
 
diff --git a/apps/CameraITS/utils/sensor_fusion_utils.py b/apps/CameraITS/utils/sensor_fusion_utils.py
index 6ce53b1..59f5a60 100644
--- a/apps/CameraITS/utils/sensor_fusion_utils.py
+++ b/apps/CameraITS/utils/sensor_fusion_utils.py
@@ -234,12 +234,15 @@
   elif rotate_cntl.lower() == 'canakit':
     canakit_serial_port = serial_port_def('Canakit')
 
+  else:
+    logging.info('No rotation rig defined. Manual test: rotate phone by hand.')
+
   # rotate phone
   logging.debug('Rotating phone %dx', num_rotations)
   for _ in range(num_rotations):
     if rotate_cntl == 'arduino':
       arduino_rotate_servo(rotate_ch, arduino_serial_port)
-    else:
+    elif rotate_cntl == 'canakit':
       canakit_set_relay_channel_state(canakit_serial_port, rotate_ch, 'ON')
       canakit_set_relay_channel_state(canakit_serial_port, rotate_ch, 'OFF')
   logging.debug('Finished rotations')
diff --git a/apps/CrossProfileTestApp/OWNERS b/apps/CrossProfileTestApp/OWNERS
index e889bfe..c3feb80 100644
--- a/apps/CrossProfileTestApp/OWNERS
+++ b/apps/CrossProfileTestApp/OWNERS
@@ -1,6 +1,2 @@
 # Bug component: 149743808
-sandness@google.com
-arangelov@google.com
-alexkershaw@google.com
-scottjonathan@google.com
-kholoudm@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index b25bd98..cb546c1 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -22,7 +22,6 @@
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="31"/>
 
-    <uses-permission android:name="android.car.permission.CAR_EXTERIOR_ENVIRONMENT" />
     <uses-permission android:name="android.car.permission.CAR_POWERTRAIN" />
     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
@@ -135,6 +134,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="test_excluded_features"
+                       android:value="android.hardware.type.watch" />
             <meta-data android:name="display_mode"
                        android:value="single_display_mode" />
         </activity>
@@ -5166,21 +5167,6 @@
                        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" />
-                <category android:name="android.cts.intent.category.MANUAL_TEST" />
-            </intent-filter>
-            <meta-data android:name="test_category" android:value="@string/test_category_car" />
-            <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">
diff --git a/apps/CtsVerifier/res/layout/night_mode_test.xml b/apps/CtsVerifier/res/layout/night_mode_test.xml
deleted file mode 100644
index cdba032..0000000
--- a/apps/CtsVerifier/res/layout/night_mode_test.xml
+++ /dev/null
@@ -1,46 +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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-    <TextView
-          android:id="@+id/night_mode_instruction"
-          android:layout_width="match_parent"
-          android:layout_height="0dp"
-          android:layout_weight="1"
-          android:gravity="center"
-          android:textSize="50dip" />
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="2"
-        android:orientation="horizontal">
-    <TextView
-          android:id="@+id/current_night_mode_value_title"
-          android:layout_width="0dp"
-          android:layout_weight="2"
-          android:layout_height="match_parent"
-          android:gravity="center"
-          android:text="@string/current_night_mode_value_title"
-          android:textSize="50dip" />
-    <TextView
-          android:id="@+id/current_night_mode_value"
-          android:layout_width="0dp"
-          android:layout_weight="1"
-          android:layout_height="match_parent"
-          android:gravity="center"
-          android:textSize="50dip" />
-    </LinearLayout>
-    <include layout="@layout/pass_fail_buttons" />
-</LinearLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 7f9e132..6f47237 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -162,12 +162,6 @@
       implemented gears then the pass button will be enabled.</string>
     <string name="expected_gear_selection_title">Expected Gear Selection</string>
     <string name="current_gear_selection_title">Current Gear Selection</string>
-    <string name="night_mode_test">NIGHT_MODE Test</string>
-    <string name="night_mode_test_desc">This test ensures that the NIGHT_MODE vehicle property is
-      implemented correctly.\n\nFollow the instructions on the screen to engage and disengage
-      NIGHT_MODE through the vehicle HAL. When the instructions are completed, the pass button
-      will be enabled.</string>
-    <string name="current_night_mode_value_title">Current NIGHT_MODE Value:</string>
     <string name="parking_brake_on_test">PARKING_BRAKE_ON Test</string>
     <string name="parking_brake_on_test_desc">This test ensures that the
       PARKING_BRAKE_ON property is implemented correctly.\n\nFollow the
@@ -1035,6 +1029,9 @@
     <string name="nfc_not_enabled_message">These tests require NFC to be enabled. Click the
         button below to goto Settings and enable it.</string>
     <string name="nfc_settings">NFC Settings</string>
+    <string name="secure_nfc_enabled">\"Require device unlock for NFC\" is enabled!</string>
+    <string name="secure_nfc_enabled_message">These tests require \"Require device unlock for NFC\"
+        to be disabled. Click the button below to goto Settings and disable it.</string>
 
     <string name="ndef_push_not_enabled">NDEF Push is not enabled!</string>
     <string name="ndef_push_not_enabled_message">These tests require Android Beam to be enabled.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
index f51c943..cf88726 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
@@ -1,6 +1,2 @@
 # 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
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java
deleted file mode 100644
index 786dc57..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/car/NightModeTestActivity.java
+++ /dev/null
@@ -1,130 +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.verifier.car;
-
-import android.car.Car;
-import android.car.hardware.CarPropertyConfig;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.property.CarPropertyManager;
-import android.car.VehicleAreaType;
-import android.car.VehiclePropertyIds;
-import android.os.Bundle;
-import android.widget.TextView;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import java.util.Arrays;
-import java.util.List;
-
-/** A CTS Verifier test case to verify NIGHT_MODE is implemented correctly.*/
-public class NightModeTestActivity extends PassFailButtons.Activity {
-    private static final String TAG = NightModeTestActivity.class.getSimpleName();
-    private static final int TOTAL_MATCHES_NEEDED_TO_FINISH = 2;
-    private static final String TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION =
-        "TotalTimesNewValueMatchedInstruction";
-    private static final String CURRENT_NIGHT_MODE_VALUE = "CurrentNightModeValue";
-    private Boolean mCurrentNightModeValue;
-    private TextView mInstructionTextView;
-    private TextView mCurrentNightModeValueTextView;
-    private int mTotalTimesNewValueMatchedInstruction = 0;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Setup the UI.
-        setContentView(R.layout.night_mode_test);
-        setPassFailButtonClickListeners();
-        setInfoResources(R.string.night_mode_test, R.string.night_mode_test_desc, -1);
-        getPassButton().setEnabled(false);
-
-        mInstructionTextView = (TextView) findViewById(R.id.night_mode_instruction);
-        mInstructionTextView.setText("Waiting to get first NIGHT_MODE callback from Vehicle HAL");
-        mCurrentNightModeValueTextView = (TextView) findViewById(R.id.current_night_mode_value);
-
-
-        CarPropertyManager carPropertyManager =
-            (CarPropertyManager) Car.createCar(this).getCarManager(Car.PROPERTY_SERVICE);
-
-        if(!carPropertyManager.registerCallback(mCarPropertyEventCallback,
-            VehiclePropertyIds.NIGHT_MODE, CarPropertyManager.SENSOR_RATE_ONCHANGE)) {
-            mInstructionTextView.setText("ERROR: Unable to register for NIGHT_MODE callback");
-            Log.e(TAG, "Failed to register callback for NIGHT_MODE with CarPropertyManager");
-        }
-    }
-
-    // Need to save the state because of the UI Mode switch with the change in the NIGHT_MODE
-    // property value.
-    @Override
-    protected void onSaveInstanceState(final Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putBoolean(CURRENT_NIGHT_MODE_VALUE, mCurrentNightModeValue);
-        outState.putInt(TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION,
-            mTotalTimesNewValueMatchedInstruction);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(final Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-        mCurrentNightModeValue = savedInstanceState.getBoolean(CURRENT_NIGHT_MODE_VALUE);
-        mTotalTimesNewValueMatchedInstruction =
-            savedInstanceState.getInt(TOTAL_TIMES_NEW_VALUE_MATCHED_INSTRUCTION);
-    }
-
-    private final CarPropertyManager.CarPropertyEventCallback mCarPropertyEventCallback =
-      new CarPropertyManager.CarPropertyEventCallback() {
-        @Override
-        public void onChangeEvent(CarPropertyValue value) {
-            if(value.getStatus() != CarPropertyValue.STATUS_AVAILABLE) {
-                Log.e(TAG, "New CarPropertyValue's status is not available - propId: " +
-                    value.getPropertyId() + " status: " + value.getStatus());
-                return;
-            }
-
-            Boolean newValue = (Boolean) value.getValue();
-            Log.i(TAG, "New NIGHT_MODE value: " + newValue);
-
-            // On the first callback, mCurrentNightModeValue will be null, so just save the
-            // current value. All other callbacks, check if the NIGHT_MODE value has switched.
-            // If switched, update the count.
-            if (mCurrentNightModeValue != null && !mCurrentNightModeValue.equals(newValue)) {
-                mTotalTimesNewValueMatchedInstruction++;
-            }
-
-            mCurrentNightModeValue = newValue;
-            mCurrentNightModeValueTextView.setText(mCurrentNightModeValue.toString());
-
-            // Check if the test is finished. If not finished, update the instructions.
-            if(mTotalTimesNewValueMatchedInstruction >= TOTAL_MATCHES_NEEDED_TO_FINISH) {
-                mInstructionTextView.setText("Test Finished!");
-                getPassButton().setEnabled(true);
-            } else if(mCurrentNightModeValue) {
-                mInstructionTextView.setText("Toggle off NIGHT_MODE through Vehicle HAL");
-            } else {
-                mInstructionTextView.setText("Toggle on NIGHT_MODE through Vehicle HAL");
-            }
-        }
-
-        @Override
-        public void onErrorEvent(int propId, int zone) {
-            Log.e(TAG, "propId: " + propId + " zone: " + zone);
-        }
-      };
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java
new file mode 100644
index 0000000..64a4451
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureUtil.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.features;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+/**
+ * Feature without feature flag for now will be skipped based on the devices temporarily.
+ * TODO(b/189282625): replace device feature with a more specific feature.
+ */
+public final class FeatureUtil {
+
+    private FeatureUtil() {
+        throw new AssertionError();
+    }
+
+    /**
+     * Checks whether the device supports configing (e.g. disable, enable) location
+     */
+    public static boolean isConfigLocationSupported(Context context) {
+        return !isWatchOrAutomotive(context);
+    }
+
+    /**
+     * Checks whether the device supports configing lock screen
+     */
+    public static boolean isConfigLockScreenSupported(Context context) {
+        return !isWatchOrAutomotive(context);
+    }
+
+    /**
+     * Checks whether the device supports Easter egg / game
+     */
+    public static boolean isFunSupported(Context context) {
+        return !isWatchOrAutomotive(context);
+    }
+
+    /**
+     * Checks whether the device supports screen timeout
+     */
+    public static boolean isScreenTimeoutSupported(Context context) {
+        return !isWatchOrAutomotive(context);
+    }
+
+    /**
+     * Checks whether the device supports third party accessibility service
+     */
+    public static boolean isThirdPartyAccessibilityServiceSupported(Context context) {
+        return !isWatchOrAutomotive(context);
+    }
+
+    /**
+     * Checks whether the device is watch or automotive
+     */
+    private static boolean isWatchOrAutomotive(Context context) {
+        PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
+                || pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
index f51c943..cf88726 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
@@ -1,6 +1,2 @@
 # 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
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
index c5257ba..15775bc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestListActivity.java
@@ -28,6 +28,7 @@
 import com.android.cts.verifier.PassFailButtons;
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.features.FeatureUtil;
 
 import java.util.Arrays;
 import java.util.List;
@@ -140,28 +141,32 @@
     private void addTestsToAdapter(final ArrayTestListAdapter adapter) {
         for (String restriction :
                 UserRestrictions.getUserRestrictionsForPolicyTransparency(mMode)) {
-            final Intent intent = UserRestrictions.getUserRestrictionTestIntent(this, restriction);
+            Intent intent =
+                    UserRestrictions.getUserRestrictionTestIntent(this, restriction, mMode);
             if (!UserRestrictions.isRestrictionValid(this, restriction)) {
                 continue;
             }
-            final String title = UserRestrictions.getRestrictionLabel(this, restriction);
+            String title = UserRestrictions.getRestrictionLabel(this, restriction);
             String testId = getTestId(title);
             intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId);
             adapter.add(TestListItem.newTest(title, testId, intent, null));
         }
         for (Pair<Intent, Integer> policy : POLICIES) {
-            final Intent intent = policy.first;
+            Intent intent = policy.first;
             String test = intent.getStringExtra(PolicyTransparencyTestActivity.EXTRA_TEST);
             if (!isPolicyValid(test)) {
                 continue;
             }
+
+            String action = intent.getStringExtra(
+                    PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION);
             if (mMode == MODE_MANAGED_PROFILE && !ALSO_VALID_FOR_MANAGED_PROFILE.contains(test)) {
                 continue;
             }
             if (mMode == MODE_MANAGED_USER && !ALSO_VALID_FOR_MANAGED_USER.contains(test)) {
                 continue;
             }
-            final String title = getString(policy.second);
+            String title = getString(policy.second);
             String testId = getTestId(title);
             intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TITLE, title);
             intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId);
@@ -185,16 +190,14 @@
         switch (test) {
             case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD:
                 return pm.hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS);
-            // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
             case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE:
                 return (pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)
-                    && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH));
-            // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
+                        && FeatureUtil.isThirdPartyAccessibilityServiceSupported(this));
             case PolicyTransparencyTestActivity.TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION:
             case PolicyTransparencyTestActivity.TEST_CHECK_LOCK_SCREEN_INFO:
             case PolicyTransparencyTestActivity.TEST_CHECK_MAXIMUM_TIME_TO_LOCK:
                 return (pm.hasSystemFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN)
-                    && !pm.hasSystemFeature(PackageManager.FEATURE_WATCH));
+                        && FeatureUtil.isConfigLockScreenSupported(this));
             default:
                 return true;
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
index 6a91c06..ca695e9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/UserRestrictions.java
@@ -28,6 +28,7 @@
 import android.util.ArrayMap;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.features.FeatureUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -203,7 +204,7 @@
     }
 
     public static List<String> getUserRestrictionsForPolicyTransparency(int mode) {
-        if (mode == PolicyTransparencyTestListActivity.MODE_DEVICE_OWNER) {
+        if (isDeviceOwnerMode(mode)) {
             ArrayList<String> result = new ArrayList<String>();
             // They are all valid except for DISALLOW_REMOVE_MANAGED_PROFILE
             for (String st : RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY) {
@@ -221,7 +222,11 @@
         throw new RuntimeException("Invalid mode " + mode);
     }
 
-    public static Intent getUserRestrictionTestIntent(Context context, String restriction) {
+    /**
+     * Creates and returns a new intent to set user restriction
+     */
+    public static Intent getUserRestrictionTestIntent(Context context, String restriction,
+                int mode) {
         final UserRestrictionItem item = USER_RESTRICTION_ITEMS.get(restriction);
         final Intent intent =
                 new Intent(PolicyTransparencyTestActivity.ACTION_SHOW_POLICY_TRANSPARENCY_TEST)
@@ -232,10 +237,10 @@
                                 context.getString(item.label))
                         .putExtra(PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION,
                                 item.intentAction);
-        // For DISALLOW_FACTORY_RESET, set on the device owner, not on the current user.
-        if (!UserManager.DISALLOW_FACTORY_RESET.equals(restriction)) {
-            intent.putExtra(CommandReceiverActivity.EXTRA_USE_CURRENT_USER_DPM, true);
-        }
+
+        // When test for restriction in device owner test mode, not set on the current user.
+        intent.putExtra(CommandReceiverActivity.EXTRA_USE_CURRENT_USER_DPM,
+                !isDeviceOwnerMode(mode));
         return intent;
     }
 
@@ -275,8 +280,8 @@
                 }
                 return isCellBroadcastAppLinkEnabled;
             case UserManager.DISALLOW_FUN:
-                // Easter egg is not available on watch
-                return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+                // Easter egg is not available on watch or automotive
+                return FeatureUtil.isFunSupported(context);
             case UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS:
                 return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
             case UserManager.DISALLOW_CONFIG_WIFI:
@@ -294,9 +299,13 @@
             case UserManager.DISALLOW_CONFIG_CREDENTIALS:
                 return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
                         && hasSettingsActivity(context, ACTION_CREDENTIALS_INSTALL);
-            case UserManager.DISALLOW_CONFIG_LOCATION:
             case UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT:
-                // TODO(b/189282625): replace FEATURE_WATCH with a more specific feature
+                return FeatureUtil.isScreenTimeoutSupported(context);
+            case UserManager.DISALLOW_CONFIG_LOCATION:
+                return FeatureUtil.isConfigLocationSupported(context);
+            case UserManager.DISALLOW_APPS_CONTROL:
+                return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
+            case UserManager.DISALLOW_UNINSTALL_APPS:
                 return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH);
             default:
                 return true;
@@ -345,6 +354,13 @@
         return !TextUtils.isEmpty(resolveInfo.activityInfo.applicationInfo.packageName);
     }
 
+    /**
+     * Checks whether target mode is device owner test mode
+     */
+    private static boolean isDeviceOwnerMode(int mode) {
+        return mode == PolicyTransparencyTestListActivity.MODE_DEVICE_OWNER;
+    }
+
     private static class UserRestrictionItem {
         final int label;
         final int userAction;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
index 644e637..4e2f5f1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
@@ -16,14 +16,14 @@
 
 package com.android.cts.verifier.nfc;
 
-import com.android.cts.verifier.R;
-
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.provider.Settings;
 
+import com.android.cts.verifier.R;
+
 /** Class containing methods to create common dialogs for NFC activities. */
 public class NfcDialogs {
 
@@ -82,6 +82,25 @@
                 .create();
     }
 
+    /**
+     * SecureNfcEnabled dialog
+     */
+    public static AlertDialog createSecureNfcEnabledDialog(final Context context) {
+        return new AlertDialog.Builder(context)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setTitle(R.string.secure_nfc_enabled)
+                .setMessage(R.string.secure_nfc_enabled_message)
+                .setPositiveButton(R.string.nfc_settings, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
+                        context.startActivity(intent);
+                    }
+                })
+                .create();
+    }
+
+
     private NfcDialogs() {
     }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
index 50a97e6..557170d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ScreenOffPaymentEmulatorActivity.java
@@ -1,10 +1,13 @@
 package com.android.cts.verifier.nfc.hce;
 
+import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcManager;
 import android.os.Bundle;
 
 import com.android.cts.verifier.R;
@@ -13,9 +16,11 @@
 public class ScreenOffPaymentEmulatorActivity extends BaseEmulatorActivity {
     final static int STATE_SCREEN_ON = 0;
     final static int STATE_SCREEN_OFF = 1;
+    private static final int SECURE_NFC_ENABLED_DIALOG_ID = 1;
     private int mState = STATE_SCREEN_ON;
 
     private ScreenOnOffReceiver mReceiver;
+    private NfcAdapter mNfcAdapter;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -31,11 +36,17 @@
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(Intent.ACTION_SCREEN_ON);
         registerReceiver(mReceiver, filter);
+
+        NfcManager nfcManager = getSystemService(NfcManager.class);
+        mNfcAdapter = nfcManager.getDefaultAdapter();
     }
 
     @Override
     protected void onResume() {
         super.onResume();
+        if (mNfcAdapter.isSecureNfcSupported() && mNfcAdapter.isSecureNfcEnabled()) {
+            showDialog(SECURE_NFC_ENABLED_DIALOG_ID);
+        }
     }
 
     @Override
@@ -86,6 +97,16 @@
         }
     }
 
+    @Override
+    public Dialog onCreateDialog(int id, Bundle args) {
+        switch (id) {
+            case SECURE_NFC_ENABLED_DIALOG_ID:
+                return NfcDialogs.createSecureNfcEnabledDialog(this);
+            default:
+                return super.onCreateDialog(id, args);
+        }
+    }
+
     private class ScreenOnOffReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
index f5cd322..40ff6060 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/OWNERS
@@ -2,7 +2,7 @@
 # Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204 = per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java
 # Bug template url: https://b.corp.google.com/issues/new?component=746324&template=1398789 = per-file: SecurityModeFeatureVerifierActivity.java
 # Bug component: 189335 = per-file FingerprintBoundKeysTest.java, IdentityCredentialAuthentication.java, ProtectedConfirmationTest.java, ScreenLockBoundKeysTest.java
-per-file CA*.java, Ca*.java, KeyChainTest.java = alexkershaw@google.com, eranm@google.com, rubinxu@google.com, sandness@google.com, pgrafov@google.com
-per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java, CredentialManagementAppActivity.java = alexkershaw@google.com, eranm@google.com, rubinxu@google.com, sandness@google.com, pgrafov@google.com
+per-file CA*.java, Ca*.java, KeyChainTest.java = file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
+per-file LockConfirmBypassTest.java, SetNewPasswordComplexityTest.java, CredentialManagementAppActivity.java = file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS
 per-file FingerprintBoundKeysTest.java, IdentityCredentialAuthentication.java, ProtectedConfirmationTest.java, ScreenLockBoundKeysTest.java = swillden@google.com
 per-file SecurityModeFeatureVerifierActivity.java = jjoslin@google.com, tomcherry@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
index d7e6ddb..43a8c18 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/SecurityModeFeatureVerifierActivity.java
@@ -16,19 +16,19 @@
 
 package com.android.cts.verifier.security;
 
-import static android.os.Build.VERSION;
 import static android.os.Build.VERSION_CODES;
 
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
 import android.content.pm.PackageManager;
 import android.os.Bundle;
-import android.os.SystemProperties;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
 
-
 import com.android.cts.verifier.PassFailButtons;
 import com.android.cts.verifier.R;
 
@@ -60,9 +60,8 @@
         mHandheldOrTabletOkButton = (Button) findViewById(R.id.handheld_or_tablet_yes);
         mHandheldOrTabletNaButton = (Button) findViewById(R.id.handheld_or_tablet_not_applicable);
 
-        final int firstApiLevel =
-                SystemProperties.getInt("ro.product.first_api_level", VERSION.SDK_INT);
-        mDeviceLaunchedBeforeS = firstApiLevel < VERSION_CODES.S;
+        // Devices launched before S will always pass the test.
+        mDeviceLaunchedBeforeS = isLaunchedBeforeS();
 
         mFeatureAvailable = getPackageManager()
             .hasSystemFeature(PackageManager.FEATURE_SECURITY_MODEL_COMPATIBLE);
@@ -81,4 +80,8 @@
             }
         });
     }
+
+    private static boolean isLaunchedBeforeS() {
+        return Math.min(getFirstApiLevel(), getVendorApiLevel()) < VERSION_CODES.S;
+    }
 }
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
index b0ec2e9..27d86b5 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/ExtraBusinessLogicTestCase.java
@@ -18,6 +18,8 @@
 
 import static org.junit.Assert.assertTrue;
 
+import android.util.Log;
+
 import org.junit.Before;
 
 import java.util.List;
@@ -35,7 +37,7 @@
  * Now Business Logics rules and actions can be called from the GCL by using the interface fully
  * qualified name.
  */
-public abstract class ExtraBusinessLogicTestCase extends BusinessLogicTestCase implements MultiLogDevice {
+public abstract class ExtraBusinessLogicTestCase extends BusinessLogicTestCase {
 
     private static final String LOG_TAG = BusinessLogicTestCase.class.getSimpleName();
 
@@ -52,7 +54,8 @@
                     "Test \"%s\" is unable to execute as it depends on the missing remote "
                     + "configuration.", mTestCase.getMethodName()), mCanReadBusinessLogic);
         } else if (!mCanReadBusinessLogic) {
-            logInfo(LOG_TAG, "Skipping Business Logic for %s", mTestCase.getMethodName());
+            Log.i(LOG_TAG, String.format(
+                    "Skipping Business Logic for %s", mTestCase.getMethodName()));
             return;
         }
 
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java
deleted file mode 100644
index dbe5128..0000000
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/MultiLogDevice.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.util.Log;
-import com.android.compatibility.common.util.MultiLog;
-
-/** Implement the deviceside interface for logging on host+device-common code. */
-public interface MultiLogDevice extends MultiLog {
-    /** {@inheritDoc} */
-    @Override
-    default void logInfo(String logTag, String format, Object... args) {
-        Log.i(logTag, String.format(format, args));
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    default void logDebug(String logTag, String format, Object... args) {
-        Log.d(logTag, String.format(format, args));
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    default void logWarn(String logTag, String format, Object... args) {
-        Log.w(logTag, String.format(format, args));
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    default void logError(String logTag, String format, Object... args) {
-        Log.e(logTag, String.format(format, args));
-    }
-}
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS b/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
index e794f2c..c7cf374 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/OWNERS
@@ -1 +1 @@
-per-file BaseDefaultPermissionGrantPolicyTest.java = moltmann@google.com, svetoslavganov@google.com
+per-file BaseDefaultPermissionGrantPolicyTest.java = file:platform/frameworks/base:/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS b/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
index b37176e..cf88726 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/enterprise/OWNERS
@@ -1,7 +1,2 @@
 # 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
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/appcompat/OWNERS b/hostsidetests/appcompat/OWNERS
index 11a1173..8411969 100644
--- a/hostsidetests/appcompat/OWNERS
+++ b/hostsidetests/appcompat/OWNERS
@@ -1,8 +1,2 @@
 # Bug component: 610774
-
-# Use this reviewer by default.
-platform-compat-eng+reviews@google.com
-
-andreionea@google.com
-mathewi@google.com
-satayev@google.com
+include tools/platform-compat:/OWNERS
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 de060ffd..9b31366 100644
--- a/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
+++ b/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
@@ -89,7 +89,7 @@
     public void testOnlyAllowedlistedChangesAreOverridable() throws Exception {
         for (Change c : getOnDeviceCompatConfig()) {
             if (c.overridable) {
-                assertWithMessage("Please contact platform-compat-eng@google.com for approval")
+                assertWithMessage("Please contact compat-team@google.com for approval")
                         .that(OVERRIDABLE_CHANGES).contains(c.changeName);
             }
         }
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
index 3524357..620c9eb 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/ApkVerityInstallTest.java
@@ -19,6 +19,9 @@
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
 import android.platform.test.annotations.AppModeFull;
 
 import com.android.compatibility.common.util.CddTest;
@@ -435,7 +438,9 @@
     private void assumeSecurityModelCompat() throws DeviceNotAvailableException {
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (mLaunchApiLevel >= 31) {
+        final int firstApiLevel =
+                Math.min(getFirstApiLevel(getDevice()), getVendorApiLevel(getDevice()));
+        if (firstApiLevel >= 31) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
index 0abb593..e513aa7 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DirectBootHostTest.java
@@ -18,6 +18,9 @@
 
 import static android.appsecurity.cts.Utils.waitForBootCompleted;
 
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeFalse;
@@ -25,7 +28,6 @@
 
 import android.platform.test.annotations.RequiresDevice;
 
-import com.android.compatibility.common.util.PropertyUtil;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -205,7 +207,9 @@
                 getDevice().hasFeature(FEATURE_SECURE_LOCK_SCREEN));
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel(getDevice()) >= 31) {
+        final int firstApiLevel =
+                Math.min(getFirstApiLevel(getDevice()), getVendorApiLevel(getDevice()));
+        if (firstApiLevel >= 31) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
index f08f964c..7f4cf27 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/StorageHostTest.java
@@ -31,6 +31,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import static org.junit.Assume.assumeTrue;
 
 import java.util.Map;
 
@@ -187,6 +188,7 @@
 
     @Test
     public void testFullDisk() throws Exception {
+        assumeTrue(!isWatch());
         // Clear all other cached and external storage data to give ourselves a
         // clean slate to test against
         getDevice().executeShellCommand("pm trim-caches 4096G");
@@ -261,4 +263,12 @@
             }
         }
     }
+
+    private boolean isWatch() {
+        try {
+            return getDevice().hasFeature("feature:android.hardware.type.watch");
+        } catch (DeviceNotAvailableException e) {
+            return false;
+        }
+    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk b/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
deleted file mode 100644
index 930dd06..0000000
--- a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# Build the test APKs using their own makefiles
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java b/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
index 0d6bcc1..8f41f0a 100644
--- a/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/StorageApp/src/com/android/cts/storageapp/StorageTest.java
@@ -117,11 +117,15 @@
     }
 
     private void clearSpaceGeneric(UiDevice device) throws UiObjectNotFoundException {
-        UiScrollable uiScrollable = new UiScrollable(new UiSelector().scrollable(true));
-        try {
-            uiScrollable.scrollTextIntoView("internal storage");
-        } catch (UiObjectNotFoundException e) {
-            // Scrolling can fail if the UI is not scrollable
+        int i = device.findObjects(android.support.test.uiautomator.By.scrollable(true)).size();
+        for (int j = 0; j < i; j++) {
+            UiScrollable localObject = new UiScrollable(new UiSelector().scrollable(true).instance(j));
+            ((UiScrollable) localObject).setMaxSearchSwipes(10);
+            try {
+                 ((UiScrollable) localObject).scrollTextIntoView("internal storage");
+            } catch (UiObjectNotFoundException localUiObjectNotFoundException) {
+                // Scrolling can fail if the UI is not scrollable
+            }
         }
         device.findObject(new UiSelector().textContains("internal storage")).click();
         device.waitForIdle();
diff --git a/hostsidetests/devicepolicy/OWNERS b/hostsidetests/devicepolicy/OWNERS
index b37176e..cf88726 100644
--- a/hostsidetests/devicepolicy/OWNERS
+++ b/hostsidetests/devicepolicy/OWNERS
@@ -1,7 +1,2 @@
 # 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
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
index 9647f11..61a60e4 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/OWNERS
@@ -1,4 +1,3 @@
 # Bug component: 168445
-alexkershaw@google.com
-kholoudm@google.com
-pbdr@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
+pbdr@google.com
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
index 614377c..0b21b15 100755
--- a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/no_launcher_activity_AndroidManifest.xml
@@ -18,15 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.nolauncheractivityapp">
     <uses-permission android:name="android.permission.INTERNET" />
-    <application>
-        <activity android:name="com.android.cts.haslauncheractivityapp.MainActivity"
-                  android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
-            </intent-filter>
-        </activity>
-        <service android:name=".EmptyService" android:enabled="true"></service>
-    </application>
+    <application />
 
 </manifest>
 
diff --git a/hostsidetests/devicepolicy/app/SharingApps/OWNERS b/hostsidetests/devicepolicy/app/SharingApps/OWNERS
index 2638902..a491b1e 100644
--- a/hostsidetests/devicepolicy/app/SharingApps/OWNERS
+++ b/hostsidetests/devicepolicy/app/SharingApps/OWNERS
@@ -1,5 +1,2 @@
 # Bug component: 168445
-alexkershaw@google.com
-arangelov@google.com
-scottjonathan@google.com
-kholoudm@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java b/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
index b9f6ea1..3c99725 100644
--- a/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
+++ b/hostsidetests/edi/src/android/edi/cts/PropertyDeviceInfo.java
@@ -37,13 +37,12 @@
             ITestDevice device = getDevice();
             CommandResult commandResult = device.executeShellV2Command("getprop");
             if (commandResult.getExitCode() == null) {
-                CLog.e("getprop exit code is null");
-                return;
+                throw new NullPointerException("getprop exit code is null");
             }
             if (commandResult.getExitCode() != 0) {
-                CLog.e("getprop returns %d: %s", commandResult.getExitCode(),
-                        commandResult.getStderr());
-                return;
+                throw new IllegalStateException(
+                        String.format("getprop returns %d: %s", commandResult.getExitCode(),
+                                commandResult.getStderr()));
             }
             if (commandResult.getExitCode() == 0 && !commandResult.getStderr().isEmpty()) {
                 CLog.w("Warnings occur when running getprop:\n%s",
@@ -59,6 +58,7 @@
     private void parseProps(String stdout, HostInfoStore store) throws Exception {
         Pattern pattern = Pattern.compile("\\[(ro.+)\\]: \\[(.+)\\]");
         if (stdout == null) stdout = "";
+        boolean hasMatched = false;
         try (Scanner scanner = new Scanner(stdout)) {
             while (scanner.hasNextLine()) {
                 String line = scanner.nextLine();
@@ -71,8 +71,13 @@
                     store.addResult("name", name);
                     store.addResult("value", value);
                     store.endGroup();
+                    hasMatched = true;
                 }
             }
         }
+        if (!hasMatched) {
+            throw new IllegalStateException(
+                    "Unable to find any read-only properties. Output is " + stdout);
+        }
     }
 }
diff --git a/hostsidetests/gputools/apps/AndroidManifest.xml b/hostsidetests/gputools/apps/AndroidManifest.xml
index 89ecaf8..3c8de1f 100755
--- a/hostsidetests/gputools/apps/AndroidManifest.xml
+++ b/hostsidetests/gputools/apps/AndroidManifest.xml
@@ -19,13 +19,13 @@
      package="android.rootlessgpudebug.app">
 
     <application android:extractNativeLibs="true">
-        <activity android:name=".RootlessGpuDebugDeviceActivity"
+        <service android:name=".RootlessGpuDebugService"
+             android:process=":target_api_service"
              android:exported="true">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
+                <action android:name="android.service.action.TARGET_API_SERVICE"/>
             </intent-filter>
-        </activity>
+        </service>
     </application>
 
 </manifest>
diff --git a/hostsidetests/gputools/apps/inject/AndroidManifest.xml b/hostsidetests/gputools/apps/inject/AndroidManifest.xml
index 63bd9c1..743c2be 100644
--- a/hostsidetests/gputools/apps/inject/AndroidManifest.xml
+++ b/hostsidetests/gputools/apps/inject/AndroidManifest.xml
@@ -21,13 +21,12 @@
     <application android:extractNativeLibs="true">
         <meta-data android:name="com.android.graphics.injectLayers.enable"
              android:value="true"/>
-        <activity android:name=".RootlessGpuDebugDeviceActivity"
-             android:exported="true">
+        <service android:name=".RootlessGpuDebugService"
+                android:process=":target_api_service"
+                android:exported="true">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
+                <action android:name="android.service.action.TARGET_API_SERVICE"/>
             </intent-filter>
-        </activity>
+        </service>
     </application>
-
 </manifest>
diff --git a/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp b/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
index f62a583..44317c5 100644
--- a/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
+++ b/hostsidetests/gputools/apps/jni/android_gputools_cts_RootlessGpuDebug.cpp
@@ -17,9 +17,6 @@
 
 #define LOG_TAG "RootlessGpuDebug"
 
-#include <string>
-#include <vector>
-
 #include <EGL/egl.h>
 #include <GLES3/gl3.h>
 #include <android/log.h>
@@ -27,6 +24,10 @@
 #include <jni.h>
 #include <vulkan/vulkan.h>
 
+#include <sstream>
+#include <string>
+#include <vector>
+
 #define ALOGI(msg, ...) \
     __android_log_print(ANDROID_LOG_INFO, LOG_TAG, (msg), __VA_ARGS__)
 #define ALOGE(msg, ...) \
@@ -39,7 +40,7 @@
 typedef __eglMustCastToProperFunctionPointerType EGLFuncPointer;
 
 std::string initVulkan() {
-    std::string result = "";
+    std::stringstream result;
 
     {
       uint32_t count = 0;
@@ -78,13 +79,13 @@
     };
     VkInstance instance;
     VkResult vkResult = vkCreateInstance(&instance_info, nullptr, &instance);
-    if (vkResult == VK_ERROR_INITIALIZATION_FAILED) {
-        result = "vkCreateInstance failed, meaning layers could not be chained.";
+    if (vkResult == VK_SUCCESS) {
+        result << "vkCreateInstance succeeded.";
     } else {
-        result = "vkCreateInstance succeeded.";
+        result << "vkCreateInstance failed with VkResult: " << vkResult;
     }
 
-    return result;
+    return result.str();
 }
 
 std::string initGLES() {
@@ -163,8 +164,7 @@
 }  // anonymous namespace
 
 int register_android_gputools_cts_RootlessGpuDebug(JNIEnv* env) {
-    jclass clazz = env->FindClass(
-        "android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity");
+    jclass clazz = env->FindClass("android/rootlessgpudebug/app/RootlessGpuDebugService");
     return env->RegisterNatives(clazz, gMethods,
                                 sizeof(gMethods) / sizeof(JNINativeMethod));
 }
diff --git a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java
deleted file mode 100644
index a29a246..0000000
--- a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugDeviceActivity.java
+++ /dev/null
@@ -1,50 +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.rootlessgpudebug.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-
-import java.lang.Override;
-
-public class RootlessGpuDebugDeviceActivity extends Activity {
-
-    static {
-        System.loadLibrary("ctsgputools_jni");
-    }
-
-    private static final String TAG = RootlessGpuDebugDeviceActivity.class.getSimpleName();
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        String result = nativeInitVulkan();
-        Log.i(TAG, result);
-
-        result = nativeInitGLES();
-        Log.i(TAG, result);
-
-        Log.i(TAG, "RootlessGpuDebug activity complete");
-    }
-
-    private static native String nativeInitVulkan();
-    private static native String nativeInitGLES();
-
-}
-
diff --git a/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java
new file mode 100644
index 0000000..47b1ad6
--- /dev/null
+++ b/hostsidetests/gputools/apps/src/android/rootlessgpudebug/app/RootlessGpuDebugService.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.rootlessgpudebug.app;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.lang.Override;
+
+
+public class RootlessGpuDebugService extends Service {
+
+    private static final String TAG = RootlessGpuDebugService.class.getSimpleName();
+
+    static {
+        System.loadLibrary("ctsgputools_jni");
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        // We don't provide binding, so return null
+        return null;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+
+        // The target API is provided via Intent extras
+        String API = null;
+
+        if (intent == null) {
+            throw new AssertionError("No Intent provided to " + TAG);
+        }
+
+        Bundle bundle = intent.getExtras();
+
+        // Ensure the service was started with extras
+        if (bundle == null) {
+            throw new AssertionError("Failed to get Intent extras for " + TAG);
+        }
+
+        API = bundle.getString("API");
+
+        // Without an API to target, we're done
+        if (API == null) {
+            throw new AssertionError("No API provided for " + TAG);
+        }
+
+        // Only three combinations are expected
+        Boolean supportedApi = API.equals("Vulkan") ||
+                               API.equals("GLES") ||
+                               API.equals("Both");
+        if (!supportedApi) {
+            throw new AssertionError("Unsupported API " + API + " in " + TAG);
+        }
+
+        // For each choice, init the target API
+        if (API.equals("Vulkan") || API.equals("Both")) {
+            String result = nativeInitVulkan();
+            Log.i(TAG, result);
+        }
+
+        if (API.equals("GLES") || API.equals("Both")) {
+            String result = nativeInitGLES();
+            Log.i(TAG, result);
+        }
+
+        // Mark service completion
+        Log.i(TAG, "RootlessGpuDebugService complete");
+
+        // Don't try to restart when this is shut down
+        return START_NOT_STICKY;
+    }
+
+    private static native String nativeInitVulkan();
+    private static native String nativeInitGLES();
+}
+
diff --git a/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java b/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
index 4ec4ef8..3f4c4c9 100644
--- a/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
+++ b/hostsidetests/gputools/src/android/gputools/cts/CtsRootlessGpuDebugHostTest.java
@@ -33,7 +33,7 @@
 @RunWith(DeviceJUnit4ClassRunner.class)
 public class CtsRootlessGpuDebugHostTest extends BaseHostJUnit4Test {
 
-    public static final String TAG = "RootlessGpuDebugDeviceActivity";
+    public static final String TAG = "RootlessGpuDebugService";
 
     // This test ensures that the Vulkan and GLES loaders can use Settings to load layers
     // from the base directory of debuggable applications.  Is also tests several
@@ -90,8 +90,9 @@
     // Positive combined tests
     // - Ensure we can load Vulkan and GLES layers at the same time, from multiple external apps (testMultipleExternalApps)
 
-    private static final String CLASS = "RootlessGpuDebugDeviceActivity";
-    private static final String ACTIVITY = "android.rootlessgpudebug.app.RootlessGpuDebugDeviceActivity";
+    private static final String API_VULKAN = "Vulkan";
+    private static final String API_GLES = "GLES";
+    private static final String API_BOTH = "Both";
     private static final String VK_LAYER_LIB_PREFIX = "libVkLayer_nullLayer";
     private static final String VK_LAYER_A_LIB = VK_LAYER_LIB_PREFIX + "A.so";
     private static final String VK_LAYER_B_LIB = VK_LAYER_LIB_PREFIX + "B.so";
@@ -257,7 +258,7 @@
                     result.found = true;
                     result.lineNumber = lineNumber;
                 }
-                if (line.contains("RootlessGpuDebug activity complete")) {
+                if (line.contains("RootlessGpuDebugService complete")) {
                     // Once we've got output from the app, we've collected what we need
                     scanComplete= true;
                 }
@@ -311,6 +312,20 @@
     }
 
     /**
+     * Launch our test as a background service, avoiding any platform rendering code
+     */
+    private void launchBackgroundService(String appName, String Api) throws Exception {
+
+        // Allow the app to be launched as a background service
+        getDevice().executeAdbCommand("shell", "cmd", "deviceidle", "tempwhitelist", appName);
+
+        // Start the service and tell it to init Vulkan/GLES/Both
+        getDevice().executeAdbCommand("shell", "am", "startservice", "-a", "android.service.action.TARGET_API_SERVICE",
+                                      "--es", "API", Api, appName);
+    }
+
+
+    /**
      * This is the primary test of the feature. It pushes layers to our debuggable app and ensures they are
      * loaded in the correct order.
      */
@@ -326,7 +341,6 @@
         setupLayer(VK_LAYER_A_LIB, LAYERS_APP);
         setupLayer(VK_LAYER_B_LIB, LAYERS_APP);
 
-
         // Copy them over to our DEBUG app
         getDevice().executeAdbCommand("shell", "cat", "/data/local/tmp/" + VK_LAYER_A_LIB, "|",
                 "run-as", DEBUG_APP, "--user", Integer.toString(getDevice().getCurrentUser()),
@@ -335,10 +349,9 @@
                 "run-as", DEBUG_APP, "--user", Integer.toString(getDevice().getCurrentUser()),
                 "sh", "-c", "\'cat", ">", VK_LAYER_B_LIB, ";", "chmod", "700", VK_LAYER_B_LIB + "\'");
 
-
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_VULKAN);
 
         // Check that both layers were loaded, in the correct order
         String searchStringA = "nullCreateInstance called in " + VK_LAYER_A;
@@ -353,6 +366,7 @@
     }
 
     public void testLayerNotLoadedVulkan(final String APP_NAME) throws Exception {
+
         // Set up a layers to be loaded for RELEASE or INJECT app
         applySetting("enable_gpu_debug_layers", "1");
         applySetting("gpu_debug_app", APP_NAME);
@@ -366,9 +380,9 @@
             "run-as", APP_NAME, "--user", Integer.toString(getDevice().getCurrentUser()),
             "sh", "-c", "\'cat", ">", VK_LAYER_A_LIB, ";", "chmod", "700", VK_LAYER_A_LIB + "\'", "||", "echo", "run-as", "failed");
 
-        // Kick off our RELEASE app
+        // Kick off our app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+        launchBackgroundService(APP_NAME, API_VULKAN);
 
         // Ensure we don't load the layer in base dir
         assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -414,7 +428,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_VULKAN);
 
         // Ensure we don't load the layer in base dir
         assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -442,7 +456,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_VULKAN);
 
         // Ensure we don't load the layer in base dir
         assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -470,7 +484,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_VULKAN);
 
         // Ensure layerA is not loaded
         assertVkLayerLoading(appStartTime, VK_LAYER_A, false);
@@ -492,7 +506,7 @@
 
         // Kick off our RELEASE app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+        launchBackgroundService(RELEASE_APP, API_VULKAN);
 
         // Check that only layerC was loaded
         assertVkLayerEnumeration(appStartTime, VK_LAYER_A, false);
@@ -527,7 +541,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_VULKAN);
 
         // Ensure only layerA is loaded
         assertVkLayerLoading(appStartTime, VK_LAYER_A, true);
@@ -548,9 +562,9 @@
         // Specify the external app that hosts layers
         applySetting("gpu_debug_layer_app", LAYERS_APP);
 
-        // Kick off our DEBUG app
+        // Kick off our app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+        launchBackgroundService(APP_NAME, API_VULKAN);
 
         String[] layerNames = layers.split(":");
         for (String layerName : layerNames) {
@@ -621,7 +635,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_GLES);
 
         // Check that both layers were loaded, in the correct order
         String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -657,7 +671,7 @@
 
         // Kick off our RELEASE app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+        launchBackgroundService(RELEASE_APP, API_GLES);
 
         // Ensure we don't load the layer in base dir
         String searchStringA = GLES_LAYER_A + " loaded";
@@ -686,7 +700,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_GLES);
 
         // Ensure we don't load the layer in base dir
         String searchStringA = GLES_LAYER_A + " loaded";
@@ -715,7 +729,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_GLES);
 
         // Ensure we don't load the layer in base dir
         String searchStringA = GLES_LAYER_A + " loaded";
@@ -744,7 +758,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_GLES);
 
         // Ensure layerA is not loaded
         String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -768,7 +782,7 @@
 
         // Kick off our RELEASE app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", RELEASE_APP + "/" + ACTIVITY);
+        launchBackgroundService(RELEASE_APP, API_GLES);
 
         // Check that both layers were loaded, in the correct order
         String searchStringA = GLES_LAYER_A + "loaded";
@@ -808,7 +822,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_GLES);
 
         // Ensure only layerA is loaded
         String searchStringA = "glesLayer_eglChooseConfig called in " + GLES_LAYER_A;
@@ -829,9 +843,9 @@
         // Specify the external app that hosts layers
         applySetting("gpu_debug_layer_app", GLES_LAYERS_APP);
 
-        // Kick off our DEBUG app
+        // Kick off our app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", APP_NAME + "/" + ACTIVITY);
+        launchBackgroundService(APP_NAME, API_GLES);
 
         // Check that our external layer was loaded
         String searchStringC = "glesLayer_eglChooseConfig called in " + GLES_LAYER_C;
@@ -872,7 +886,7 @@
 
         // Kick off our DEBUG app
         String appStartTime = getTime();
-        getDevice().executeAdbCommand("shell", "am", "start", "-n", DEBUG_APP + "/" + ACTIVITY);
+        launchBackgroundService(DEBUG_APP, API_BOTH);
 
         // Check that external layers were loaded from both apps
         assertVkLayerLoading(appStartTime, VK_LAYER_C, true);
diff --git a/hostsidetests/hdmicec/app/AndroidManifest.xml b/hostsidetests/hdmicec/app/AndroidManifest.xml
index 06e994d..2ea9a81 100644
--- a/hostsidetests/hdmicec/app/AndroidManifest.xml
+++ b/hostsidetests/hdmicec/app/AndroidManifest.xml
@@ -20,6 +20,7 @@
     <uses-feature android:name="android.software.leanback"
          android:required="false"/>
     <uses-permission android:name="android.permission.HDMI_CEC" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
     <application>
         <activity android:name=".HdmiCecKeyEventCapture"
              android:exported="true">
@@ -28,6 +29,15 @@
                 <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
             </intent-filter>
         </activity>
+        <activity android:name=".HdmiCecWakeLock"
+            android:launchMode="singleTop"
+            android:exported="true" >
+            <intent-filter>
+                <action android:name="android.hdmicec.app.ACQUIRE_LOCK" />
+                <action android:name="android.hdmicec.app.RELEASE_LOCK" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
+            </intent-filter>
+        </activity>
          <activity android:name=".HdmiCecAudioManager"
               android:exported="true">
             <intent-filter>
diff --git a/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java
new file mode 100644
index 0000000..e1c0c13
--- /dev/null
+++ b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiCecWakeLock.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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 static android.os.PowerManager.PARTIAL_WAKE_LOCK;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.util.Log;
+
+/**
+ * A simple activity that can be used to acquire and release the wake lock for controlling power
+ * management. The actions supported are:
+ *
+ * <p>
+ *
+ * <p>1. android.hdmicec.app.ACQUIRE_LOCK: Acquires the wake lock.
+ *
+ * <p>Usage: <code>START_COMMAND -a android.hdmicec.app.ACQUIRE_LOCK</code>
+ *
+ * <p>2. android.hdmicec.app.RELEASE_LOCK: Releases the wake lock.
+ *
+ * <p>Usage: <code>START_COMMAND -a android.hdmicec.app.RELEASE_LOCK</code>
+ *
+ * <p>
+ *
+ * <p>where START_COMMAND is
+ *
+ * <p><code>
+ * adb shell am start -n "android.hdmicec.app/android.hdmicec.app.HdmiCecWakeLock -a "
+ * </code>
+ */
+public class HdmiCecWakeLock extends Activity {
+    private static final String TAG = HdmiCecWakeLock.class.getSimpleName();
+    private WakeLock mWakeLock;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        handleIntent(getIntent().getAction());
+    }
+
+    // Overriding this method since we expect intents to be sent to this activity.
+    @Override
+    public void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        handleIntent(intent.getAction());
+    }
+
+    private void handleIntent(String action) {
+        if (mWakeLock == null && !initializeWakeLock()) {
+            return;
+        }
+        switch (action) {
+            case "android.hdmicec.app.ACQUIRE_LOCK":
+                acquireWakeLock();
+                break;
+            case "android.hdmicec.app.RELEASE_LOCK":
+                releaseWakeLock();
+                // Finish the activity after releasing the lock.
+                finish();
+                break;
+            default:
+                Log.i(TAG, "Unknown intent!");
+        }
+    }
+
+    private boolean initializeWakeLock() {
+        PowerManager powerManager = getSystemService(PowerManager.class);
+        if (powerManager == null) {
+            Log.i(TAG, "Failed to get PowerManager");
+            return false;
+        }
+        // Creates a new wake lock.
+        mWakeLock = powerManager.newWakeLock(PARTIAL_WAKE_LOCK, TAG);
+        mWakeLock.setReferenceCounted(false);
+        Log.i(TAG, "wake lock object is : " + mWakeLock.toString());
+        return true;
+    }
+
+    private void acquireWakeLock() {
+        if (!mWakeLock.isHeld()) {
+            mWakeLock.acquire();
+            Log.i(TAG, "Acquired wake lock.");
+        } else {
+            Log.i(TAG, "Wake lock is already acquired.");
+        }
+    }
+
+    private void releaseWakeLock() {
+        if (mWakeLock.isHeld()) {
+            mWakeLock.release();
+            Log.i(TAG, "Released wake lock.");
+        } else {
+            Log.i(TAG, "No active wake locks to release.");
+        }
+    }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
index 0ca9569..fcb0164 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
@@ -16,6 +16,8 @@
 
 package android.hdmicec.cts;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assume.assumeTrue;
 
 import android.hdmicec.cts.HdmiCecConstants.CecDeviceType;
@@ -362,4 +364,66 @@
         return getDevice().executeShellCommand(
                 "dumpsys hdmi_control | sed -n '/mDeviceInfos/,/mCecController/{//!p;}'");
     }
+
+    public void checkDeviceAsleep() throws Exception {
+        ITestDevice device = getDevice();
+        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+        String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
+        assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
+    }
+
+    public void sendDeviceToSleepAndValidate() throws Exception {
+        sendDeviceToSleep();
+        checkDeviceAsleep();
+    }
+
+    private void waitForTransitionTo(int finalState) throws Exception {
+        int powerStatus;
+        int waitTimeSeconds = 0;
+        LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
+        int transitionState;
+        if (finalState == HdmiCecConstants.CEC_POWER_STATUS_STANDBY) {
+            transitionState = HdmiCecConstants.CEC_POWER_STATUS_IN_TRANSITION_TO_STANDBY;
+        } else if (finalState == HdmiCecConstants.CEC_POWER_STATUS_ON) {
+            transitionState = HdmiCecConstants.CEC_POWER_STATUS_IN_TRANSITION_TO_ON;
+        } else {
+            throw new Exception("Unsupported final power state!");
+        }
+        do {
+            TimeUnit.SECONDS.sleep(HdmiCecConstants.SLEEP_TIMESTEP_SECONDS);
+            waitTimeSeconds += HdmiCecConstants.SLEEP_TIMESTEP_SECONDS;
+            hdmiCecClient.sendCecMessage(cecClientDevice, CecOperand.GIVE_POWER_STATUS);
+            powerStatus =
+                    CecMessage.getParams(
+                            hdmiCecClient.checkExpectedOutput(
+                                    cecClientDevice, CecOperand.REPORT_POWER_STATUS));
+            if (powerStatus == finalState) {
+                return;
+            }
+        } while (powerStatus == transitionState
+                && waitTimeSeconds <= HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
+        if (powerStatus != finalState) {
+            // Transition not complete even after wait, throw an Exception.
+            throw new Exception("Power status did not change to expected state.");
+        }
+    }
+
+    public void sendDeviceToSleep() throws Exception {
+        ITestDevice device = getDevice();
+        WakeLockHelper.acquirePartialWakeLock(device);
+        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+        waitForTransitionTo(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
+    }
+
+    public void wakeUpDevice() throws Exception {
+        ITestDevice device = getDevice();
+        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+        waitForTransitionTo(HdmiCecConstants.CEC_POWER_STATUS_ON);
+        WakeLockHelper.releasePartialWakeLock(device);
+    }
+
+    public void checkStandbyAndWakeUp() throws Exception {
+        checkDeviceAsleep();
+        wakeUpDevice();
+    }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
index c08bb2d..75b1abf 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecOperand.java
@@ -20,6 +20,7 @@
 import java.util.Map;
 
 public enum CecOperand {
+    POLL(-1),
     FEATURE_ABORT(0x00),
     IMAGE_VIEW_ON(0x04),
     TEXT_VIEW_ON(0x0d),
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
index bb59adc..9a1cc98 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
@@ -57,6 +57,11 @@
     private StringBuilder sendVendorCommand = new StringBuilder("cmd hdmi_control vendorcommand ");
     private int physicalAddress = 0xFFFF;
 
+    private CecOperand featureAbortOperand = CecOperand.FEATURE_ABORT;
+    private List<Integer> featureAbortReasons =
+            new ArrayList<>(HdmiCecConstants.ABORT_INVALID_OPERAND);
+    private boolean isFeatureAbortExpected = false;
+
     private static final String CEC_PORT_BUSY = "unable to open the device on port";
 
     public HdmiCecClientWrapper(String ...clientParams) {
@@ -536,6 +541,26 @@
     }
 
     /**
+     * The next checkExpectedOutput calls will also permit a feature abort as an alternate to the
+     * expected operand. The feature abort will be permissible if it has
+     *
+     * @param abortForOperand The operand for which the feature abort could be an allowed response
+     * @param reasons List of allowed reasons that the feature abort message could have
+     */
+    private void setExpectFeatureAbortFor(CecOperand abortOperand, Integer... abortReasons) {
+        isFeatureAbortExpected = true;
+        featureAbortOperand = abortOperand;
+        featureAbortReasons = Arrays.asList(abortReasons);
+    }
+
+    /** Removes feature abort as a permissible alternate response for {@link checkExpectedOutput} */
+    private void unsetExpectFeatureAbort() {
+        isFeatureAbortExpected = false;
+        CecOperand featureAbortOperand = CecOperand.FEATURE_ABORT;
+        List<Integer> featureAbortReasons = new ArrayList<>(HdmiCecConstants.ABORT_INVALID_OPERAND);
+    }
+
+    /**
      * Looks for the CEC expectedMessage broadcast on the cec-client communication channel and
      * returns the first line that contains that message within default timeout. If the CEC message
      * is not found within the timeout, an CecClientWrapperException is thrown.
@@ -581,6 +606,27 @@
     }
 
     /**
+     * Looks for the CEC expectedMessage or a {@code <Feature Abort>} for {@code
+     * featureAbortOperand} with one of the abort reasons in {@code abortReason} is sent from
+     * cec-client device fromDevice to the DUT on the cec-client communication channel and returns
+     * the first line that contains that message within default timeout. If the CEC message is not
+     * found within the timeout, a CecClientWrapperException is thrown.
+     */
+    public String checkExpectedOutputOrFeatureAbort(
+            LogicalAddress fromDevice,
+            CecOperand expectedMessage,
+            CecOperand featureAbortOperand,
+            Integer... featureAbortReasons)
+            throws CecClientWrapperException {
+        setExpectFeatureAbortFor(featureAbortOperand, featureAbortReasons);
+        String message =
+                checkExpectedOutput(
+                        targetDevice, fromDevice, expectedMessage, DEFAULT_TIMEOUT, false);
+        unsetExpectFeatureAbort();
+        return message;
+    }
+
+    /**
      * Looks for the CEC expectedMessage broadcast on the cec-client communication channel and
      * returns the first line that contains that message within timeoutMillis. If the CEC message is
      * not found within the timeout, an CecClientWrapperException is thrown.
@@ -620,25 +666,54 @@
         long startTime = System.currentTimeMillis();
         long endTime = startTime;
         String direction = fromCecClient ? "<<" : ">>";
-        Pattern pattern =
-                Pattern.compile(
-                        "(.*"
-                                + direction
-                                + ")(.*?)"
-                                + "("
-                                + fromDevice
-                                + toDevice
-                                + "):"
-                                + "("
-                                + expectedMessage
-                                + ")(.*)",
-                        Pattern.CASE_INSENSITIVE);
-
+        Pattern pattern;
+        if (expectedMessage == CecOperand.POLL) {
+            pattern =
+                    Pattern.compile(
+                            "(.*"
+                                    + direction
+                                    + ")(.*?)"
+                                    + "("
+                                    + fromDevice
+                                    + toDevice
+                                    + ")(.*)",
+                            Pattern.CASE_INSENSITIVE);
+        } else {
+            String expectedOperands = expectedMessage.toString();
+            if (isFeatureAbortExpected) {
+                expectedOperands += "|" + CecOperand.FEATURE_ABORT;
+            }
+            pattern =
+                    Pattern.compile(
+                            "(.*"
+                                    + direction
+                                    + ")(.*?)"
+                                    + "("
+                                    + fromDevice
+                                    + toDevice
+                                    + "):"
+                                    + "("
+                                    + expectedOperands
+                                    + ")(.*)",
+                            Pattern.CASE_INSENSITIVE);
+        }
         while ((endTime - startTime <= timeoutMillis)) {
             try {
                 if (mInputConsole.ready()) {
                     String line = mInputConsole.readLine();
                     if (pattern.matcher(line).matches()) {
+                        if (isFeatureAbortExpected
+                                && CecMessage.getOperand(line) == CecOperand.FEATURE_ABORT) {
+                            CecOperand featureAbortedFor =
+                                    CecOperand.getOperand(CecMessage.getParams(line, 0, 2));
+                            int reason = CecMessage.getParams(line, 2, 4);
+                            if (featureAbortedFor == featureAbortOperand
+                                    && featureAbortReasons.contains(reason)) {
+                                return line;
+                            } else {
+                                continue;
+                            }
+                        }
                         CLog.v("Found " + expectedMessage.name() + " in " + line);
                         return line;
                     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
index 44af562..2f1298d 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
@@ -31,8 +31,9 @@
 
     // Standard delay to allow the DUT to react to a CEC message or ADB command
     public static final int DEVICE_WAIT_TIME_SECONDS = 5;
+    public static final int DEVICE_WAIT_TIME_MS = 5000;
     public static final int MAX_SLEEP_TIME_SECONDS = 8;
-
+    public static final int SLEEP_TIMESTEP_SECONDS = 1;
     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 */
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
index 7b2c857..646ce07 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogHelper.java
@@ -66,6 +66,17 @@
         assertThat(testString).isIn(expectedOutputs);
     }
 
+    /** Skip the test if the expectedOutput was not found in the device logs. */
+    public static void assumeLog(ITestDevice device, String tag, String expectedOutput)
+            throws Exception {
+        String testString = getLog(device, tag);
+        assumeTrue(
+                "Skip the test since "
+                        + expectedOutput
+                        + " message is not found in the device logs.",
+                testString.contains(expectedOutput));
+    }
+
     /** This method will return the DUT volume. */
     public static int parseDutVolume(ITestDevice device, String tag) throws Exception {
         String testString = getLog(device, tag);
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java
new file mode 100644
index 0000000..b3d4432
--- /dev/null
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/WakeLockHelper.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.device.ITestDevice;
+
+/**
+ * Helper class to help standby test acquire and release wakelock to avoid device going into deep
+ * sleep.
+ */
+public final class WakeLockHelper {
+    private static final String TAG = "HdmiCecWakeLock";
+    private static final String ACQUIRE_LOCK = "android.hdmicec.app.ACQUIRE_LOCK";
+    private static final String RELEASE_LOCK = "android.hdmicec.app.RELEASE_LOCK";
+
+    /** The package name of the APK. */
+    private static final String PACKAGE = "android.hdmicec.app";
+
+    /** The class name of the wake lock activity in the APK. */
+    private static final String CLASS = "HdmiCecWakeLock";
+
+    /** The command to launch the wake lock activity. */
+    private static final String START_COMMAND =
+            String.format("am start -n %s/%s.%s -a ", PACKAGE, PACKAGE, CLASS);
+
+    /** The command to clear the wake lock activity. */
+    private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
+
+    public static void acquirePartialWakeLock(ITestDevice device) throws Exception {
+        // Clear activity if any.
+        device.executeShellCommand(CLEAR_COMMAND);
+        // Start the APK to acquire the wake lock and wait for it to complete.
+        device.executeShellCommand(START_COMMAND + ACQUIRE_LOCK);
+        LogHelper.assumeLog(device, TAG, "Acquired wake lock.");
+    }
+
+    public static void releasePartialWakeLock(ITestDevice device) throws Exception {
+        // Release the acquired wake lock.
+        device.executeShellCommand(START_COMMAND + RELEASE_LOCK);
+        // Clear activity
+        device.executeShellCommand(CLEAR_COMMAND);
+    }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
index f652d0c..72a2cf0 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
@@ -93,11 +93,11 @@
                 CecOperand.REPORT_PHYSICAL_ADDRESS,
                 CecMessage.formatParams(HdmiCecConstants.TV_PHYSICAL_ADDRESS,
                         HdmiCecConstants.PHYSICAL_ADDRESS_LENGTH));
-        getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+        sendDeviceToSleep();
         try {
             hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.TERMINATE_ARC);
         } finally {
-            getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
         }
     }
 
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
index 94b3e4a..0b217b8 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
@@ -210,15 +210,15 @@
     @Test
     public void cect_11_2_15_6_SystemAudioModeOffBeforeStandby() throws Exception {
         try {
-            getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
             sendSystemAudioModeInitiation();
             String message = hdmiCecClient.checkExpectedOutput(CecOperand.SET_SYSTEM_AUDIO_MODE);
             assertThat(CecMessage.getParams(message)).isEqualTo(ON);
-            getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
             message = hdmiCecClient.checkExpectedOutput(CecOperand.SET_SYSTEM_AUDIO_MODE);
             assertThat(CecMessage.getParams(message)).isEqualTo(OFF);
         } finally {
-            getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
         }
     }
 
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
index 720242a..8bc0f24 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPollingTest.java
@@ -61,12 +61,15 @@
         setCec20();
 
         ITestDevice device = getDevice();
-        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-
-        String expectedOutput = "POLL message sent";
-        hdmiCecClient.sendPoll();
-        if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
-            throw new Exception("Could not find " + expectedOutput);
+        try {
+            sendDeviceToSleep();
+            String expectedOutput = "POLL message sent";
+            hdmiCecClient.sendPoll();
+            if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
+                throw new Exception("Could not find " + expectedOutput);
+            }
+        } finally {
+            wakeUpDevice();
         }
     }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
index b6585a9..966173a 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecPowerStatusTest.java
@@ -24,6 +24,7 @@
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
+import android.hdmicec.cts.WakeLockHelper;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -68,12 +69,10 @@
         setCec20();
 
         // Move device to standby
-        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+        sendDeviceToSleep();
 
         // Turn device on
-        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
-        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+        wakeUpDevice();
 
         String reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
                 CecOperand.REPORT_POWER_STATUS);
@@ -99,25 +98,29 @@
         ITestDevice device = getDevice();
         setCec20();
 
-        // Turn device on
-        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
-        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+        try {
+            // Turn device on
+            wakeUpDevice();
 
-        // Move device to standby
-        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+            // Move device to standby
+            sendDeviceToSleep();
 
-        String reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
-                CecOperand.REPORT_POWER_STATUS);
+            String reportPowerStatus =
+                    hdmiCecClient.checkExpectedOutput(
+                            LogicalAddress.BROADCAST, CecOperand.REPORT_POWER_STATUS);
 
-        if (CecMessage.getParams(reportPowerStatus) == HdmiCecConstants.CEC_POWER_STATUS_ON) {
-            // Received the "wake up" broadcast, check for the next broadcast message
-            reportPowerStatus = hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST,
-                    CecOperand.REPORT_POWER_STATUS);
+            if (CecMessage.getParams(reportPowerStatus) == HdmiCecConstants.CEC_POWER_STATUS_ON) {
+                // Received the "wake up" broadcast, check for the next broadcast message
+                reportPowerStatus =
+                        hdmiCecClient.checkExpectedOutput(
+                                LogicalAddress.BROADCAST, CecOperand.REPORT_POWER_STATUS);
+            }
+
+            assertThat(CecMessage.getParams(reportPowerStatus))
+                    .isEqualTo(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
+        } finally {
+            wakeUpDevice();
         }
-
-        assertThat(CecMessage.getParams(reportPowerStatus)).isEqualTo(
-                HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
     }
 
     /**
@@ -131,8 +134,7 @@
         ITestDevice device = getDevice();
         /* Make sure the device is not booting up/in standby */
         device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
-        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
-        TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+        wakeUpDevice();
 
         LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
         hdmiCecClient.sendCecMessage(cecClientDevice, CecOperand.GIVE_POWER_STATUS);
@@ -154,8 +156,7 @@
             /* Make sure the device is not booting up/in standby */
             device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
             /* The sleep below could send some devices into a deep suspend state. */
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-            TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+            sendDeviceToSleep();
             int waitTimeSeconds = HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS;
             int powerStatus;
             LogicalAddress cecClientDevice = hdmiCecClient.getSelfDevice();
@@ -172,7 +173,7 @@
             assertThat(powerStatus).isEqualTo(OFF);
         } finally {
             /* Wake up the device */
-            device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
         }
     }
 
@@ -195,8 +196,7 @@
 
         for (Integer operand : powerControlOperands) {
             try {
-                device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-                TimeUnit.SECONDS.sleep(HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
+                sendDeviceToSleep();
                 String wakeStateBefore = device.executeShellCommand(
                         "dumpsys power | grep mWakefulness=");
                 assertThat(wakeStateBefore.trim()).isEqualTo("mWakefulness=Asleep");
@@ -209,7 +209,7 @@
                 assertWithMessage("Device should wake up on <User Control Pressed> %s", operand)
                         .that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Awake");
             } finally {
-                device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+                wakeUpDevice();
             }
         }
     }
@@ -233,12 +233,12 @@
 
         for (Integer operand : powerControlOperands) {
             try {
-                device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
-                TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+                wakeUpDevice();
                 String wakeStateBefore = device.executeShellCommand(
                         "dumpsys power | grep mWakefulness=");
                 assertThat(wakeStateBefore.trim()).isEqualTo("mWakefulness=Awake");
 
+                WakeLockHelper.acquirePartialWakeLock(device);
                 hdmiCecClient.sendUserControlPressAndRelease(source, operand, false);
 
                 TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
@@ -248,7 +248,7 @@
                         operand)
                         .that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Asleep");
             } finally {
-                device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+                wakeUpDevice();
             }
         }
     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
index afe1c10..5a7cda1 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemAudioControlTest.java
@@ -17,6 +17,7 @@
 package android.hdmicec.cts.common;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assume.assumeFalse;
 
 import android.hdmicec.cts.AudioManagerHelper;
@@ -29,13 +30,13 @@
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 
-import java.util.concurrent.TimeUnit;
-
 import org.junit.Before;
 import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
-import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
 
 /** HDMI CEC test to verify system audio control commands (Section 11.1.15, 11.2.15) */
 @RunWith(DeviceJUnit4ClassRunner.class)
@@ -154,8 +155,8 @@
         ITestDevice device = getDevice();
         /* Home Key to prevent device from going to deep suspend state */
         device.executeShellCommand("input keyevent KEYCODE_HOME");
-        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+        sendDeviceToSleep();
+        wakeUpDevice();
         hdmiCecClient.checkExpectedOutput(
                 hdmiCecClient.getSelfDevice(), CecOperand.GIVE_SYSTEM_AUDIO_MODE_STATUS);
     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
index d0db224..15eca65 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
@@ -26,6 +26,7 @@
 import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
 
+import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 
 import org.junit.Rule;
@@ -171,4 +172,30 @@
                 CecOperand.REPORT_FEATURES);
         assertThat(CecMessage.getParams(reportFeatures, 2)).isEqualTo(cecVersion);
     }
+
+    /**
+     * Tests that the device sends a {@code <CEC Version>} in response to a {@code <Get CEC
+     * Version>} in standby
+     */
+    @Test
+    public void cectGiveCecVersionInStandby() throws Exception {
+        ITestDevice device = getDevice();
+        try {
+            sendDeviceToSleepAndValidate();
+            hdmiCecClient.sendCecMessage(hdmiCecClient.getSelfDevice(), CecOperand.GET_CEC_VERSION);
+            String message =
+                    hdmiCecClient.checkExpectedOutputOrFeatureAbort(
+                            hdmiCecClient.getSelfDevice(),
+                            CecOperand.CEC_VERSION,
+                            CecOperand.GET_CEC_VERSION,
+                            HdmiCecConstants.ABORT_NOT_IN_CORRECT_MODE);
+            assertThat(CecMessage.getParams(message))
+                    .isIn(
+                            Arrays.asList(
+                                    HdmiCecConstants.CEC_VERSION_2_0,
+                                    HdmiCecConstants.CEC_VERSION_1_4));
+        } finally {
+            wakeUpDevice();
+        }
+    }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
index ccad335..19eff6c 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemStandbyTest.java
@@ -16,12 +16,11 @@
 
 package android.hdmicec.cts.common;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
+import android.hdmicec.cts.WakeLockHelper;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -29,44 +28,46 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
-import org.junit.Test;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
-/**
- * HDMI CEC test to verify the device handles standby correctly (Section 11.1.3, 11.2.3)
- */
+/** HDMI CEC test to verify the device handles standby correctly (Section 11.1.3, 11.2.3) */
 @RunWith(DeviceJUnit4ClassRunner.class)
 public final class HdmiCecSystemStandbyTest extends BaseHdmiCecCtsTest {
 
     private static final String HDMI_CONTROL_DEVICE_AUTO_OFF =
             "hdmi_control_auto_device_off_enabled";
+    private static final String POWER_CONTROL_MODE = "send_standby_on_sleep";
+    private static final String POWER_CONTROL_MODE_NONE = "none";
 
     public List<LogicalAddress> mLogicalAddresses = new ArrayList<>();
-    public boolean wasOn;
+    public boolean previousDeviceAutoOff;
+    public String previousPowerControlMode;
 
     @Rule
     public RuleChain ruleChain =
-            RuleChain
-                    .outerRule(CecRules.requiresCec(this))
+            RuleChain.outerRule(CecRules.requiresCec(this))
                     .around(CecRules.requiresLeanback(this))
                     .around(hdmiCecClient);
 
     @Before
     public void initialTestSetup() throws Exception {
         defineLogicalAddressList();
-        wasOn = setHdmiControlDeviceAutoOff(false);
+        previousDeviceAutoOff = setHdmiControlDeviceAutoOff(false);
+        previousPowerControlMode = setPowerControlMode(POWER_CONTROL_MODE_NONE);
     }
 
     @After
     public void resetDutState() throws Exception {
         /* Wake up the device */
-        getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
-        setHdmiControlDeviceAutoOff(wasOn);
+        wakeUpDevice();
+        setHdmiControlDeviceAutoOff(previousDeviceAutoOff);
+        setPowerControlMode(previousPowerControlMode);
     }
 
     /**
@@ -75,13 +76,15 @@
      */
     @Test
     public void cect_HandleBroadcastStandby() throws Exception {
-        getDevice().reboot();
+        ITestDevice device = getDevice();
+        device.reboot();
         TimeUnit.SECONDS.sleep(5);
         for (LogicalAddress source : mLogicalAddresses) {
             if (!hasLogicalAddress(source)) {
+                WakeLockHelper.acquirePartialWakeLock(device);
                 hdmiCecClient.sendCecMessage(source, LogicalAddress.BROADCAST, CecOperand.STANDBY);
-                checkDeviceAsleepAfterStandbySent();
-            }
+                checkStandbyAndWakeUp();
+    }
         }
     }
 
@@ -91,12 +94,14 @@
      */
     @Test
     public void cect_HandleAddressedStandby() throws Exception {
-        getDevice().reboot();
+        ITestDevice device = getDevice();
+        device.reboot();
         for (LogicalAddress source : mLogicalAddresses) {
             if (!hasLogicalAddress(source)) {
+                WakeLockHelper.acquirePartialWakeLock(device);
                 hdmiCecClient.sendCecMessage(source, CecOperand.STANDBY);
-                checkDeviceAsleepAfterStandbySent();
-            }
+                checkStandbyAndWakeUp();
+    }
         }
     }
 
@@ -110,10 +115,13 @@
          * CEC CTS does not specify for TV a no broadcast on standby test. On Android TVs, there is
          * a feature to turn off this standby broadcast and this test tests the same.
          */
-        ITestDevice device = getDevice();
-        device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-        hdmiCecClient.checkOutputDoesNotContainMessage(LogicalAddress.BROADCAST,
-                CecOperand.STANDBY);
+        sendDeviceToSleep();
+        try {
+            hdmiCecClient.checkOutputDoesNotContainMessage(
+                    LogicalAddress.BROADCAST, CecOperand.STANDBY);
+        } finally {
+            wakeUpDevice();
+        }
     }
 
     private void defineLogicalAddressList() throws Exception {
@@ -125,7 +133,7 @@
         mLogicalAddresses.add(LogicalAddress.AUDIO_SYSTEM);
 
         if (hasDeviceType(HdmiCecConstants.CEC_DEVICE_TYPE_TV)) {
-            //Add logical addresses 13, 14 only for TV panel tests.
+            // Add logical addresses 13, 14 only for TV panel tests.
             mLogicalAddresses.add(LogicalAddress.RESERVED_2);
             mLogicalAddresses.add(LogicalAddress.SPECIFIC_USE);
         }
@@ -142,12 +150,9 @@
         return val.equals("1");
     }
 
-    private void checkDeviceAsleepAfterStandbySent() throws Exception {
-        ITestDevice device = getDevice();
-        TimeUnit.SECONDS.sleep(5);
-        String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
-        assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
-        device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
-        TimeUnit.SECONDS.sleep(5);
+    private String setPowerControlMode(String valToSet) throws Exception {
+        String val = getSettingsValue(POWER_CONTROL_MODE);
+        setSettingsValue(POWER_CONTROL_MODE, valToSet);
+        return val;
     }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
index 596f34c..d2e00fd 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecVendorCommandsTest.java
@@ -65,6 +65,20 @@
     }
 
     /**
+     * Tests that the device responds to a {@code <GIVE_DEVICE_VENDOR_ID>} when in standby.
+     */
+    @Test
+    public void cectGiveDeviceVendorIdDuringStandby() throws Exception {
+        ITestDevice device = getDevice();
+        try {
+            sendDeviceToSleepAndValidate();
+            cect_11_2_9_1_GiveDeviceVendorId();
+        } finally {
+            wakeUpDevice();
+        }
+    }
+
+    /**
      * Test 11.2.9-2
      * <p>Tests that the device broadcasts a {@code <DEVICE_VENDOR_ID>} message after successful
      * initialisation and address allocation.
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
index 754a752..afe78d4 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
@@ -21,12 +21,10 @@
 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.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 
@@ -52,13 +50,7 @@
                                     this, HdmiCecConstants.CEC_DEVICE_TYPE_PLAYBACK_DEVICE))
                     .around(hdmiCecClient);
 
-    /**
-     * Test 11.2.11-1a
-     * Tests that the device responds to a <GIVE_OSD_NAME> with a <SET_OSD_NAME> that has the
-     * correct device name in the parameters.
-     */
-    @Test
-    public void cect_11_2_11_1a_GiveOsdNameTest() throws Exception {
+    private String getDeviceName() throws DeviceNotAvailableException {
         /* The params for <SET_OSD_NAME> only allow for 14 characters */
         final int nameLength = 14;
         ITestDevice device = getDevice();
@@ -66,12 +58,49 @@
         if (deviceName.length() > nameLength) {
             deviceName = deviceName.substring(0, nameLength).trim();
         }
+        return deviceName;
+    }
+
+    /**
+     * Test 11.2.11-1a
+     *
+     * <p>Tests that the device responds to a {@code <GIVE_OSD_NAME>} with a {@code <SET_OSD_NAME>}
+     * that has the correct device name in the parameters.
+     */
+    @Test
+    public void cect_11_2_11_1a_GiveOsdNameTest() throws Exception {
+        String deviceName = getDeviceName();
         hdmiCecClient.sendCecMessage(LogicalAddress.TV, CecOperand.GIVE_OSD_NAME);
         String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.SET_OSD_NAME);
         assertThat(CecMessage.getAsciiString(message)).isEqualTo(deviceName);
     }
 
     /**
+     * Tests that the device responds to a {@code <GIVE_OSD_NAME>} with a {@code <SET_OSD_NAME>}
+     * that has the correct device name in the parameters in standby mode.
+     */
+    @Test
+    public void cectGiveOsdNameTestInStandby() throws Exception {
+        ITestDevice device = getDevice();
+        try {
+            sendDeviceToSleepAndValidate();
+            String deviceName = getDeviceName();
+            hdmiCecClient.sendCecMessage(LogicalAddress.TV, CecOperand.GIVE_OSD_NAME);
+            String message =
+                    hdmiCecClient.checkExpectedOutputOrFeatureAbort(
+                            LogicalAddress.TV,
+                            CecOperand.SET_OSD_NAME,
+                            CecOperand.GIVE_OSD_NAME,
+                            HdmiCecConstants.ABORT_NOT_IN_CORRECT_MODE);
+            if (CecMessage.getOperand(message) != CecOperand.FEATURE_ABORT) {
+                assertThat(CecMessage.getAsciiString(message)).isEqualTo(deviceName);
+            }
+        } finally {
+            wakeUpDevice();
+        }
+    }
+
+    /**
      * Test 11.2.11-1b
      * Test updates the device_name in global properties and checks that the device responds to a
      * <GIVE_OSD_NAME> with a <SET_OSD_NAME> that has the updated device name in the parameters.
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
index 38344436..0d0b6cf 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
@@ -68,7 +68,7 @@
         ITestDevice device = getDevice();
 
         try {
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
 
             TimeUnit.SECONDS.sleep(HdmiCecConstants.MAX_SLEEP_TIME_SECONDS);
 
@@ -89,7 +89,7 @@
             assertWithMessage("Device should wake up on <Set Stream Path>")
                     .that(wakeStateAfter.trim()).isEqualTo("mWakefulness=Awake");
         } finally {
-            device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
         }
     }
 }
\ No newline at end of file
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
index e81bbb4..75d73ea 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
@@ -152,13 +152,13 @@
                     CecOperand.SET_STREAM_PATH,
                     CecMessage.formatParams(dumpsysPhysicalAddress));
             TimeUnit.SECONDS.sleep(5);
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
             String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV,
                     CecOperand.INACTIVE_SOURCE);
             CecMessage.assertPhysicalAddressValid(message, dumpsysPhysicalAddress);
         } finally {
             /* Wake up the device */
-            device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
             setPowerControlMode(previousPowerControlMode);
         }
     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
index d66cd07..141cb63 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecTvPowerToggleTest.java
@@ -21,11 +21,9 @@
 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.WakeLockHelper;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -35,7 +33,6 @@
 import org.junit.runner.RunWith;
 import org.junit.Test;
 
-import static android.hdmicec.cts.HdmiCecConstants.TIMEOUT_SAFETY_MS;
 
 import java.util.concurrent.TimeUnit;
 
@@ -95,6 +92,7 @@
                     CecOperand.ACTIVE_SOURCE, CecMessage.formatParams("0000"));
             TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
             hdmiCecClient.clearClientOutput();
+            WakeLockHelper.acquirePartialWakeLock(device);
             device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
             hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
             hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -105,6 +103,7 @@
             assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
         } finally {
             setPowerControlMode(previousPowerControlMode);
+            wakeUpDevice();
         }
     }
 
@@ -128,6 +127,7 @@
             device.executeShellCommand("input keyevent KEYCODE_HOME");
             TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
             hdmiCecClient.clearClientOutput();
+            WakeLockHelper.acquirePartialWakeLock(device);
             device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
             hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
             hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
@@ -138,6 +138,7 @@
             assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
         } finally {
             setPowerControlMode(previousPowerControlMode);
+            wakeUpDevice();
         }
     }
 
@@ -158,8 +159,7 @@
             hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
                     CecOperand.REPORT_POWER_STATUS, CecMessage.formatParams(OFF));
             TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-            TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+            sendDeviceToSleep();
             hdmiCecClient.clearClientOutput();
             device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
             hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
@@ -171,6 +171,7 @@
             assertThat(wakeState.trim()).isEqualTo("mWakefulness=Asleep");
         } finally {
             setPowerControlMode(previousPowerControlMode);
+            wakeUpDevice();
         }
     }
 
@@ -191,8 +192,7 @@
             hdmiCecClient.sendCecMessage(LogicalAddress.TV, PLAYBACK_DEVICE,
                     CecOperand.REPORT_POWER_STATUS, CecMessage.formatParams(OFF));
             TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
-            TimeUnit.SECONDS.sleep(HdmiCecConstants.DEVICE_WAIT_TIME_SECONDS);
+            sendDeviceToSleep();
             hdmiCecClient.clearClientOutput();
             device.executeShellCommand("input keyevent KEYCODE_TV_POWER");
             hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.GIVE_POWER_STATUS);
@@ -205,6 +205,7 @@
             assertThat(wakeState.trim()).isEqualTo("mWakefulness=Awake");
         } finally {
             setPowerControlMode(previousPowerControlMode);
+            wakeUpDevice();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
index 5329f19..13c0381 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvOneTouchPlayTest.java
@@ -145,15 +145,14 @@
     public void cect_11_1_1_3_ImageViewOnWhenInStandby() throws Exception {
         try {
             getDevice().reboot();
-            getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
             assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
             /* Get the first device the client has started as */
             LogicalAddress testDevice = testDevices.get(0);
             hdmiCecClient.sendCecMessage(testDevice, LogicalAddress.TV, CecOperand.IMAGE_VIEW_ON);
             assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_ON);
         } finally {
-            getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
-            TimeUnit.SECONDS.sleep(MAX_POWER_TRANSITION_WAIT_TIME);
+            wakeUpDevice();
         }
     }
 
@@ -167,15 +166,14 @@
     public void cect_11_1_1_4_TextViewOnWhenInStandby() throws Exception {
         try {
             getDevice().reboot();
-            getDevice().executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
             assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_STANDBY);
             /* Get the first device the client has started as */
             LogicalAddress testDevice = testDevices.get(0);
             hdmiCecClient.sendCecMessage(testDevice, LogicalAddress.TV, CecOperand.TEXT_VIEW_ON);
             assertDevicePowerStatus(HdmiCecConstants.CEC_POWER_STATUS_ON);
         } finally {
-            getDevice().executeShellCommand("input keyevent KEYCODE_WAKEUP");
-            TimeUnit.SECONDS.sleep(MAX_POWER_TRANSITION_WAIT_TIME);
+            wakeUpDevice();
         }
     }
 
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
index 7a861a1..4efab29 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/tv/HdmiCecTvStandbyTest.java
@@ -62,14 +62,14 @@
         device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
         boolean wasOn = setHdmiControlDeviceAutoOff(true);
         try {
-            device.executeShellCommand("input keyevent KEYCODE_SLEEP");
+            sendDeviceToSleep();
             hdmiCecClient.checkExpectedOutput(LogicalAddress.BROADCAST, CecOperand.STANDBY);
             String wakeState = device.executeShellCommand("dumpsys power | grep mWakefulness=");
             assertWithMessage("Device is not in standby.")
                     .that(wakeState.trim())
                     .isEqualTo("mWakefulness=Asleep");
         } finally {
-            device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
+            wakeUpDevice();
             setHdmiControlDeviceAutoOff(wasOn);
         }
     }
diff --git a/hostsidetests/incrementalinstall/Android.mk b/hostsidetests/incrementalinstall/Android.mk
deleted file mode 100644
index eb303a2..0000000
--- a/hostsidetests/incrementalinstall/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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/hostsidetests/multidevice/AndroidTest.xml b/hostsidetests/multidevice/AndroidTest.xml
index 758a5eb..e77c72e 100644
--- a/hostsidetests/multidevice/AndroidTest.xml
+++ b/hostsidetests/multidevice/AndroidTest.xml
@@ -16,6 +16,20 @@
     <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" />
+
+    <device name="device1">
+        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+            <option name="run-command" value="wm dismiss-keyguard" />
+        </target_preparer>
+    </device>
+    <device name="device2">
+        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
+            <option name="run-command" value="wm dismiss-keyguard" />
+        </target_preparer>
+    </device>
+
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
         <option name="class" value="android.sample.cts.SampleMultiDeviceTest" />
     </test>
diff --git a/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java b/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
index 80d3e073..f15bdb4 100644
--- a/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
+++ b/hostsidetests/multidevice/src/android/sample/cts/SampleMultiDeviceTest.java
@@ -23,6 +23,8 @@
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
+import com.google.common.truth.Truth;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -32,8 +34,13 @@
 @RunWith(DeviceJUnit4ClassRunner.class)
 public class SampleMultiDeviceTest extends BaseHostJUnit4Test {
 
+    /**
+     * Sample tests that showcase that we are receiving the multiple devices in the test side.
+     */
     @Test
     public void testMultiDeviceTest() throws Exception {
+        // Validate we are actually multi-devices
+        Truth.assertThat(getListDevices().size()).isGreaterThan(1);
         for (ITestDevice device : getListDevices()) {
             CLog.i("device '%s' is available.", device.getSerialNumber());
             String buildId = device.getProperty("ro.vendor.build.id");
diff --git a/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java b/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
index a94ceea..7df340d 100644
--- a/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
+++ b/hostsidetests/multiuser/src/android/host/multiuser/BaseMultiUserTest.java
@@ -136,6 +136,10 @@
         return -1;
     }
 
+    protected void assumeGuestDoesNotExist() throws Exception {
+        assumeTrue("Device already has a guest user", getGuestUser() == -1);
+    }
+
     protected void assumeIsAutomotive() throws Exception {
         assumeTrue("Device does not have " + FEATURE_AUTOMOTIVE,
                 getDevice().hasFeature(FEATURE_AUTOMOTIVE));
diff --git a/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java b/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
index 4f19d81..bd3ed1b 100644
--- a/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
+++ b/hostsidetests/multiuser/src/android/host/multiuser/CreateUsersPermissionTest.java
@@ -34,6 +34,10 @@
 
     @Test
     public void testCanCreateGuestUser() throws Exception {
+        // The device may already have a guest present if it is configured with
+        // config_guestUserAutoCreated. If so, skip the test.
+        assumeGuestDoesNotExist();
+
         createGuestUser();
     }
 
diff --git a/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java b/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
index 4755b10..7930580 100644
--- a/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
+++ b/hostsidetests/packagemanager/extractnativelibs/apps/app_extract/src/com/android/cts/extractnativelibs/app/extract/ExtractNativeLibsTrueDeviceTest.java
@@ -47,7 +47,9 @@
         File nativeLibDir = new File(mContext.getApplicationInfo().nativeLibraryDir);
         Assert.assertTrue(nativeLibDir.exists());
         Assert.assertTrue(nativeLibDir.isDirectory());
-        Assert.assertTrue(nativeLibDir.getAbsolutePath().endsWith(expectedSubDir));
+        Assert.assertTrue("Native lib dir: " + nativeLibDir.getAbsolutePath()
+                        + " does not end with: " + expectedSubDir,
+                nativeLibDir.getAbsolutePath().endsWith(expectedSubDir));
         Assert.assertEquals(1, nativeLibDir.list().length);
     }
 
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
index f36ab6b..a67c83d 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestAbiOverride.java
@@ -58,12 +58,17 @@
 
     @Override
     public void setUp() throws Exception {
+        // Skip the test if the requested test ABI is 32 bit (that defeats the purpose of this test)
+        assumeTrue(AbiUtils.getBitness(getAbi().getName()).equals("64"));
         final String deviceAbi = getDeviceAbi();
         final Set<String> deviceAbis = getDeviceAbis();
+        final Set<String> apkAbis = getApkAbis();
         // Only run these tests for supported ABIs
         assumeTrue(deviceAbis.contains(mFirstAbi));
+        assumeTrue(apkAbis.contains(mFirstAbi));
         if (!mSecondAbi.equals("-")) {
             assumeTrue(deviceAbis.contains(mSecondAbi));
+            assumeTrue(apkAbis.contains(mSecondAbi));
         }
         assumeTrue(AbiUtils.getBaseArchForAbi(deviceAbi).equals(
                 AbiUtils.getBaseArchForAbi(mFirstAbi)));
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
index 00afa9a..e1dcea4 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestBase.java
@@ -35,6 +35,7 @@
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -176,17 +177,17 @@
      * @return an ABI string from AbiUtils.ABI_*
      * @return an ABI string from AbiUtils.ABI_*
      */
-    final String getExpectedLibAbi(String abiSuffix) throws Exception {
-        final String deviceAbi = getDeviceAbi();
-        final String deviceBitness = AbiUtils.getBitness(deviceAbi);
+    final String getExpectedLibAbi(String abiSuffix) {
+        final String testAbi = getAbi().getName();
+        final String testBitness = AbiUtils.getBitness(testAbi);
         final String libBitness;
-        // Use 32-bit native libs if device only supports 32-bit or APK only has 32-libs native libs
-        if (abiSuffix.equals("32") || deviceBitness.equals("32")) {
+        // Use 32-bit native libs if test only supports 32-bit or APK only has 32-libs native libs
+        if (abiSuffix.equals("32") || testBitness.equals("32")) {
             libBitness = "32";
         } else {
             libBitness = "64";
         }
-        final Set<String> libAbis = AbiUtils.getAbisForArch(AbiUtils.getBaseArchForAbi(deviceAbi));
+        final Set<String> libAbis = AbiUtils.getAbisForArch(AbiUtils.getBaseArchForAbi(testAbi));
         for (String libAbi : libAbis) {
             if (AbiUtils.getBitness(libAbi).equals(libBitness)) {
                 return libAbi;
@@ -195,22 +196,26 @@
         return null;
     }
 
+    /**
+     * Get ABIs supported by the test APKs. For example, if the test ABI is "armeabi-v7a", the test
+     * APKs should include native libs for "armeabi-v7a" and/or "arm64-v8a".
+     */
+    final Set<String> getApkAbis() throws Exception {
+        String testApkBaseArch = AbiUtils.getArchForAbi(getAbi().getName());
+        return AbiUtils.getAbisForArch(testApkBaseArch);
+    }
+
     final String getDeviceAbi() throws Exception {
         return getDevice().getProperty("ro.product.cpu.abi");
     }
 
+    /**
+     * Device ABIs might includes native bridge ABIs that are different from base arch (e.g.,
+     * emulators with NDK translations).
+     */
     final Set<String> getDeviceAbis() throws Exception {
-        String[] abiArray = getDevice().getProperty("ro.product.cpu.abilist").split(",");
-        // Ignore native bridge ABIs if they are of different base arch
-        String deviceBaseArch = AbiUtils.getArchForAbi(getDeviceAbi());
-        Set<String> deviceBaseArchSupportedAbis = AbiUtils.getAbisForArch(deviceBaseArch);
-        HashSet<String> deviceSupportedAbis = new HashSet<>();
-        for (String abi : abiArray) {
-            if (deviceBaseArchSupportedAbis.contains(abi)) {
-                deviceSupportedAbis.add(abi);
-            }
-        }
-        return deviceSupportedAbis;
+        String[] deviceAbis = getDevice().getProperty("ro.product.cpu.abilist").split(",");
+        return new HashSet<>(Arrays.asList(deviceAbis));
     }
 
     final Set<String> getDeviceAbiSuffixes() throws Exception {
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
index ca82dec..d5ca4f7 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestInstalls.java
@@ -23,6 +23,8 @@
 import android.cts.host.utils.DeviceJUnit4Parameterized;
 import android.platform.test.annotations.AppModeFull;
 
+import com.android.tradefed.util.AbiUtils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -72,6 +74,11 @@
             // Skip incremental installations for non-incremental devices
             assumeTrue(isIncrementalInstallSupported());
         }
+        // Skip 64 bit tests if the test requires 32 bit ABI
+        final boolean isTest32Bit = AbiUtils.getBitness(getAbi().getName()).equals("32");
+        if (isTest32Bit) {
+            assumeTrue(mAbiSuffix.equals("32"));
+        }
         if (!mAbiSuffix.equals("Both")) {
             // Skip tests for unsupported abi suffixes.
             assumeTrue(getDeviceAbiSuffixes().contains(mAbiSuffix));
diff --git a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
index 9ad35f1..0450f54 100644
--- a/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
+++ b/hostsidetests/packagemanager/extractnativelibs/src/android/extractnativelibs/cts/CtsExtractNativeLibsHostTestUpdates.java
@@ -23,6 +23,8 @@
 import android.cts.host.utils.DeviceJUnit4Parameterized;
 import android.platform.test.annotations.AppModeFull;
 
+import com.android.tradefed.util.AbiUtils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -77,6 +79,8 @@
 
     @Override
     public void setUp() throws Exception {
+        // Skip the test if the requested test ABI is 32 bit (that defeats the purpose of this test)
+        assumeTrue(AbiUtils.getBitness(getAbi().getName()).equals("64"));
         if (mIsIncremental) {
             // Skip incremental installations for non-incremental devices
             assumeTrue(isIncrementalInstallSupported());
diff --git a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
index 90289ba..1a9ce61 100644
--- a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
+++ b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
@@ -409,7 +409,9 @@
     private void assumeSecurityModelCompat() throws Exception {
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+        final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+                PropertyUtil.getVendorApiLevel(mDevice));
+        if (firstApiLevel >= 31) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java b/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
index d9da47a..1351be9 100644
--- a/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
+++ b/hostsidetests/security/src/android/security/cts/MetadataEncryptionTest.java
@@ -70,7 +70,9 @@
     private void assumeSecurityModelCompat() throws Exception {
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+        final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+                PropertyUtil.getVendorApiLevel(mDevice));
+        if (firstApiLevel >= 31) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java b/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
index 6122e09..35a9942 100644
--- a/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
+++ b/hostsidetests/security/src/android/security/cts/PerfEventParanoidTest.java
@@ -89,7 +89,9 @@
     private void assumeSecurityModelCompat() throws DeviceNotAvailableException {
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel(mDevice) >= ANDROID_S_API_LEVEL) {
+        final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+                PropertyUtil.getVendorApiLevel(mDevice));
+        if (firstApiLevel >= ANDROID_S_API_LEVEL) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
index f528f94..68f734d 100644
--- a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -189,7 +189,9 @@
     private void assumeSecurityModelCompat() throws Exception {
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel(mDevice) >= 31) {
+        final int firstApiLevel = Math.min(PropertyUtil.getFirstApiLevel(mDevice),
+                PropertyUtil.getVendorApiLevel(mDevice));
+        if (firstApiLevel >= 31) {
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     getDevice().hasFeature("feature:android.hardware.security.model.compatible"));
         }
diff --git a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
index c7a39bb..ef24a7a 100644
--- a/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
+++ b/hostsidetests/statsdatom/apps/statsdapp/src/com/android/server/cts/device/statsdatom/AtomTests.java
@@ -219,6 +219,8 @@
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_BLUETOOTH_ADVERTISE, 114);
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_RECORD_INCOMING_PHONE_AUDIO, 115);
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_NEARBY_WIFI_DEVICES, 116);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE, 117);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER, 118);
     }
 
     @Test
diff --git a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
index ad92513..0bb3873 100644
--- a/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
+++ b/hostsidetests/statsdatom/src/android/cts/statsdatom/statsd/HostAtomTests.java
@@ -75,6 +75,7 @@
 
     private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
     private static final String FEATURE_WATCH = "android.hardware.type.watch";
+    private static final String FEATURE_TWM = "com.google.clockwork.hardware.traditional_watch_mode";
     private static final String FEATURE_WIFI = "android.hardware.wifi";
     private static final String FEATURE_LEANBACK_ONLY = "android.software.leanback_only";
 
@@ -335,6 +336,7 @@
     }
 
     public void testBatterySaverModeStateChangedAtom() throws Exception {
+        if (DeviceUtils.hasFeature(getDevice(), FEATURE_TWM)) return;
         if (DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE)) return;
         // Setup, turn off battery saver.
         turnBatterySaverOff();
diff --git a/tests/admin/OWNERS b/tests/admin/OWNERS
index 58d02a3..4d977c5 100644
--- a/tests/admin/OWNERS
+++ b/tests/admin/OWNERS
@@ -1,9 +1,2 @@
 # Bug component: 100560
-sandness@google.com
-rubinxu@google.com
-eranm@google.com
-kholoudm@google.com
-pgrafov@google.com
-alexkershaw@google.com
-arangelov@google.com
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/tests/attestationverification/OWNERS b/tests/attestationverification/OWNERS
new file mode 100644
index 0000000..32a0456
--- /dev/null
+++ b/tests/attestationverification/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 1111194
+
+include platform/frameworks/base:/core/java/android/security/attestationverification/OWNERS
diff --git a/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java b/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
index 53bd825..cceec68 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/activities/MultiWindowLoginActivity.java
@@ -16,6 +16,7 @@
 package android.autofillservice.cts.activities;
 
 import android.autofillservice.cts.testcore.Timeouts;
+import android.content.res.Configuration;
 
 import com.android.compatibility.common.util.RetryableException;
 
@@ -48,6 +49,17 @@
         }
     }
 
+    @Override
+    public void onMultiWindowModeChanged(boolean isInMultiWindowMode, Configuration newConfig) {
+        super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig);
+        if (sLastInstanceLatch != null) {
+            // mWindowingMode is split-screen-primary
+            if (isInMultiWindowMode) {
+                sLastInstanceLatch.countDown();
+            }
+        }
+    }
+
     public static void expectNewInstance(boolean waitWindowFocus) {
         sLastInstanceLatch = new CountDownLatch(waitWindowFocus ? 2 : 1);
     }
diff --git a/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
index 6428896..6123592 100644
--- a/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -185,7 +185,7 @@
         for (String cameraId : mCameraIdsUnderTest) {
             Exception prior = null;
 
-            ImageVerifierListener yuvListener;
+            ImageVerifierListener yuvListener = null;
             ImageReader yuvReader = null;
 
             try {
@@ -210,6 +210,9 @@
                 prior = e;
             } finally {
                 try {
+                    if (yuvListener != null) {
+                        yuvListener.onReaderDestroyed();
+                    }
                     if (yuvReader != null) {
                         yuvReader.close();
                     }
diff --git a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
index c7f0622..774477d 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
@@ -1367,14 +1367,15 @@
      * Initialize the supported video sizes.
      */
     private void initSupportedVideoSize(String cameraId)  throws Exception {
+        int id = Integer.valueOf(cameraId);
         Size maxVideoSize = SIZE_BOUND_720P;
-        if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) {
+        if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_2160P)) {
             maxVideoSize = SIZE_BOUND_2160P;
-        } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_QHD)) {
+        } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_QHD)) {
             maxVideoSize = SIZE_BOUND_QHD;
-        } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2K)) {
+        } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_2K)) {
             maxVideoSize = SIZE_BOUND_2K;
-        } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) {
+        } else if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_1080P)) {
             maxVideoSize = SIZE_BOUND_1080P;
         }
 
diff --git a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
index b125d25..492cc68 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -243,19 +243,24 @@
                 if (mStaticInfo.isLogicalMultiCamera()) {
                     Set<String> physicalCameraIds =
                             mStaticInfo.getCharacteristics().getPhysicalCameraIds();
+                    boolean skipTest = false;
                     for (String physicalId : physicalCameraIds) {
                         if (Arrays.asList(mCameraIdsUnderTest).contains(physicalId)) {
                             // If physicalId is advertised in camera ID list, do not need to test
                             // its stream combination through logical camera.
-                            continue;
+                            skipTest = true;
                         }
                         for (Pair<String, String> unavailPhysicalCam : unavailablePhysicalCameras) {
                             if (unavailPhysicalCam.first.equals(id) ||
                                     unavailPhysicalCam.second.equals(physicalId)) {
                                 // This particular physical camera isn't available. Skip.
-                                continue;
+                                skipTest = true;
+                                break;
                             }
                         }
+                        if (skipTest) {
+                            continue;
+                        }
                         StaticMetadata physicalStaticInfo = mAllStaticInfo.get(physicalId);
 
                         MandatoryStreamCombination[] phyCombinations =
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 bec4a2d..b15282c 100644
--- a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -494,14 +494,22 @@
     public static class ImageVerifierListener implements ImageReader.OnImageAvailableListener {
         private Size mSize;
         private int mFormat;
+        // Whether the parent ImageReader is valid or not. If the parent ImageReader
+        // is destroyed, the acquired Image may become invalid.
+        private boolean mReaderIsValid;
 
         public ImageVerifierListener(Size sz, int format) {
             mSize = sz;
             mFormat = format;
+            mReaderIsValid = true;
+        }
+
+        public synchronized void onReaderDestroyed() {
+            mReaderIsValid = false;
         }
 
         @Override
-        public void onImageAvailable(ImageReader reader) {
+        public synchronized void onImageAvailable(ImageReader reader) {
             Image image = null;
             try {
                 image = reader.acquireNextImage();
@@ -511,7 +519,11 @@
                     // could be closed asynchronously, which will close all images acquired from
                     // this ImageReader.
                     checkImage(image, mSize.getWidth(), mSize.getHeight(), mFormat);
-                    checkAndroidImageFormat(image);
+                    // checkAndroidImageFormat calls into underlying Image object, which could
+                    // become invalid if the ImageReader is destroyed.
+                    if (mReaderIsValid) {
+                        checkAndroidImageFormat(image);
+                    }
                     image.close();
                 }
             }
diff --git a/tests/devicepolicy/OWNERS b/tests/devicepolicy/OWNERS
index b37176e..cf88726 100644
--- a/tests/devicepolicy/OWNERS
+++ b/tests/devicepolicy/OWNERS
@@ -1,7 +1,2 @@
 # 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
-scottjonathan@google.com
+file:platform/frameworks/base:/core/java/android/app/admin/EnterprisePlatform_OWNERS
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index f0f40a6..4607110 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -357,6 +357,8 @@
         <activity android:name="android.server.wm.WindowInsetsPolicyTest$ImmersiveFullscreenTestActivity"
              android:documentLaunchMode="always"
              android:theme="@style/no_animation"/>
+        <activity android:name="android.server.wm.WindowInsetsPolicyTest$NaturalOrientationTestActivity"
+                  android:screenOrientation="nosensor"/>
         <activity android:name="android.server.wm.LayoutTests$TestActivity"
              android:theme="@style/no_animation"/>
         <activity android:name="android.server.wm.LocationOnScreenTests$TestActivity"
@@ -382,7 +384,8 @@
         <activity android:name="android.server.wm.WindowInsetsLayoutTests$TestActivity"/>
         <activity android:name="android.server.wm.WindowInsetsControllerTests$TestActivity"
                   android:theme="@style/no_starting_window"/>
-        <activity android:name="android.server.wm.WindowInsetsControllerTests$TestHideOnCreateActivity"/>
+        <activity android:name="android.server.wm.WindowInsetsControllerTests$TestHideOnCreateActivity"
+                  android:windowSoftInputMode="adjustPan|stateUnchanged"/>
         <activity android:name="android.server.wm.WindowInsetsControllerTests$TestShowOnCreateActivity"/>
 
         <activity android:name="android.server.wm.DragDropTest$DragDropActivity"
diff --git a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
index d46e922..453c29b 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
+++ b/tests/framework/base/windowmanager/backgroundactivity/src/android/server/wm/BackgroundActivityLaunchTest.java
@@ -49,10 +49,14 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.Manifest;
+import android.app.UiAutomation;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
 import android.os.ResultReceiver;
+import android.os.UserManager;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.SystemUserOnly;
 import android.server.wm.backgroundactivity.common.CommonComponents.Event;
@@ -60,6 +64,7 @@
 
 import androidx.annotation.Nullable;
 import androidx.test.filters.FlakyTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.compatibility.common.util.AppOpsUtils;
 
@@ -480,6 +485,45 @@
         assertTaskStack(null, APP_A_BACKGROUND_ACTIVITY);
     }
 
+    /**
+     * Returns a list of alive users on the device
+     */
+    private List<UserInfo> getAliveUsers() {
+        // Setting the CREATE_USERS permission in AndroidManifest.xml has no effect when the test
+        // is run through the CTS harness, so instead adopt it as a shell permission. We use
+        // the CREATE_USERS permission instead of MANAGE_USERS because the shell can never use
+        // MANAGE_USERS.
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.adoptShellPermissionIdentity(Manifest.permission.CREATE_USERS);
+        List<UserInfo> userList = mContext.getSystemService(UserManager.class)
+                .getUsers(/* excludePartial= */ true,
+                        /* excludeDying= */ true,
+                        /* excludePreCreated= */ true);
+        uiAutomation.dropShellPermissionIdentity();
+        return userList;
+    }
+
+    /**
+     * Removes the guest user from the device if present
+     */
+    private void removeGuestUser() {
+        List<UserInfo> userList = getAliveUsers();
+        for (UserInfo info : userList) {
+            if (info.isGuest()) {
+                removeUser(info.id);
+                // Device is only allowed to have one alive guest user, so stop if it's found
+                break;
+            }
+        }
+    }
+
+    /**
+     * Removes a user from the device given their ID
+     */
+    private void removeUser(int userId) {
+        executeShellCommand(String.format("pm remove-user %d", userId));
+    }
+
     @Test
     @SystemUserOnly(reason = "Device owner must be SYSTEM user")
     public void testDeviceOwner() throws Exception {
@@ -489,6 +533,15 @@
             return;
         }
 
+        // Remove existing guest user. The device may already have a guest present if it is
+        // configured with config_guestUserAutoCreated.
+        //
+        // In production flow the DO can only be created before device provisioning finishes
+        // (e.g. during SUW), and we make sure the guest user in only created after the device
+        // provision is finished. Ideally this test would use the provisioning flow and Device
+        // Owner (DO) creation in a similar manner as that of production flow.
+        removeGuestUser();
+
         String cmdResult = runShellCommand("dpm set-device-owner --user 0 "
                 + APP_A_SIMPLE_ADMIN_RECEIVER.flattenToString());
         assertThat(cmdResult).contains("Success");
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 ec4903b..aaeedc2 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
@@ -205,18 +205,14 @@
         }
         final ActivitySessionClient activityClient = createManagedActivityClientSession();
         testTurnScreenOnActivity(lockScreenSession, activityClient,
-                true /* useWindowFlags */, true /* showWhenLocked */);
+                true /* useWindowFlags */);
         testTurnScreenOnActivity(lockScreenSession, activityClient,
-                false /* useWindowFlags */, true /* showWhenLocked */);
+                false /* useWindowFlags */);
         if (notSupportsInsecureLock) {
             // In the platform without InsecureLock, we just test if the display is on with
             // TurnScreenOnActivity.
             mObjectTracker.close(lockScreenSession);
         }
-        testTurnScreenOnActivity(lockScreenSession, activityClient,
-                true /* useWindowFlags */, false /* showWhenLocked */);
-        testTurnScreenOnActivity(lockScreenSession, activityClient,
-                false /* useWindowFlags */, false /* showWhenLocked */);
     }
 
     @Test
@@ -230,21 +226,20 @@
         // timeout should still notify the client activity to be visible. Then the relayout can
         // send the visible request to apply the flags and turn on screen.
         testTurnScreenOnActivity(lockScreenSession, activityClient, true /* useWindowFlags */,
-                true /* showWhenLocked */, 1000 /* sleepMsInOnCreate */);
+                1000 /* sleepMsInOnCreate */);
     }
 
     private void testTurnScreenOnActivity(LockScreenSession lockScreenSession,
-            ActivitySessionClient activitySessionClient, boolean useWindowFlags,
-            boolean showWhenLocked) {
+            ActivitySessionClient activitySessionClient, boolean useWindowFlags) {
         testTurnScreenOnActivity(lockScreenSession, activitySessionClient, useWindowFlags,
-                showWhenLocked, 0 /* sleepMsInOnCreate */);
+                0 /* sleepMsInOnCreate */);
     }
 
     private void testTurnScreenOnActivity(LockScreenSession lockScreenSession,
             ActivitySessionClient activitySessionClient, boolean useWindowFlags,
-            boolean showWhenLocked, int sleepMsInOnCreate) {
+            int sleepMsInOnCreate) {
         ActivitySession activity = sleepDeviceAndLaunchTurnScreenOnActivity(lockScreenSession,
-                activitySessionClient, useWindowFlags, showWhenLocked, sleepMsInOnCreate,
+                activitySessionClient, useWindowFlags, sleepMsInOnCreate,
                 WINDOWING_MODE_FULLSCREEN);
 
         mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, true);
@@ -263,21 +258,16 @@
         final ActivitySessionClient activityClient = createManagedActivityClientSession();
 
         testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
-                true/* useWindowFlags */, true/* showWhenLocked */);
+                true/* useWindowFlags */);
         testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
-                true/* useWindowFlags */, false/* showWhenLocked */);
-        testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
-                false/* useWindowFlags */, true/* showWhenLocked */);
-        testFreeformWindowTurnScreenOnActivity(lockScreenSession, activityClient,
-                false/* useWindowFlags */, false/* showWhenLocked */);
+                false/* useWindowFlags */);
     }
 
     private void testFreeformWindowTurnScreenOnActivity(LockScreenSession lockScreenSession,
-            ActivitySessionClient activityClient, boolean useWindowFlags,
-            boolean showWhenLocked) {
+            ActivitySessionClient activityClient, boolean useWindowFlags) {
         ActivitySession activity = sleepDeviceAndLaunchTurnScreenOnActivity(lockScreenSession,
-                activityClient, useWindowFlags, showWhenLocked,
-                0 /* sleepMsInOnCreate */, WINDOWING_MODE_FREEFORM);
+                activityClient, useWindowFlags, 0 /* sleepMsInOnCreate */,
+                WINDOWING_MODE_FREEFORM);
         mWmState.waitForValidState(
                 new WaitForValidActivityState.Builder(TURN_SCREEN_ON_ACTIVITY)
                         .setWindowingMode(WINDOWING_MODE_FULLSCREEN)
@@ -291,16 +281,13 @@
 
     private ActivitySession sleepDeviceAndLaunchTurnScreenOnActivity(
             LockScreenSession lockScreenSession, ActivitySessionClient activitySessionClient,
-            boolean useWindowFlags, boolean showWhenLocked, int sleepMsInOnCreate,
-            int windowingMode) {
+            boolean useWindowFlags, int sleepMsInOnCreate, int windowingMode) {
         lockScreenSession.sleepDevice();
 
         return activitySessionClient.startActivity(
                 getLaunchActivityBuilder().setUseInstrumentation().setIntentExtra(extra -> {
                     extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_USE_WINDOW_FLAGS,
                             useWindowFlags);
-                    extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_SHOW_WHEN_LOCKED,
-                            showWhenLocked);
                     extra.putLong(Components.TurnScreenOnActivity.EXTRA_SLEEP_MS_IN_ON_CREATE,
                             sleepMsInOnCreate);
                 }).setTargetActivity(TURN_SCREEN_ON_ACTIVITY).setWindowingMode(windowingMode));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
index 2524090..4cd3719e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/CompatChangeTests.java
@@ -18,8 +18,6 @@
 
 import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE;
 import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
-import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
 import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS;
 import static android.view.Display.DEFAULT_DISPLAY;
 
@@ -84,8 +82,6 @@
     private static final ComponentName SUPPORTS_SIZE_CHANGES_PORTRAIT_ACTIVITY =
             component(SupportsSizeChangesPortraitActivity.class);
 
-    // Device aspect ratio (both portrait and landscape orientations) for min aspect ratio tests
-    private static final float SIZE_COMPAT_DISPLAY_ASPECT_RATIO = 1.4f;
     // Fixed orientation min aspect ratio
     private static final float FIXED_ORIENTATION_MIN_ASPECT_RATIO = 1.03f;
     // The min aspect ratio of NON_RESIZEABLE_ASPECT_RATIO_ACTIVITY (as defined in the manifest).
@@ -330,11 +326,7 @@
     @Test
     @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO})
     public void testOverrideMinAspectRatioMissingSpecificOverride() {
-        // Note that we're using getBounds() in portrait, rather than getAppBounds() like other
-        // tests, because we're comparing to the display size and therefore need to consider insets.
-        runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY,
-                /* expected= */ SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
-                /* useAppBoundsInPortrait= */false);
+        runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* expected= */ 0);
     }
 
     /**
@@ -344,11 +336,7 @@
     @Test
     @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE})
     public void testOverrideMinAspectRatioMissingGeneralOverride() {
-        // Note that we're using getBounds() in portrait, rather than getAppBounds() like other
-        // tests, because we're comparing to the display size and therefore need to consider insets.
-        runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY,
-                /* expected= */ SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
-                /* useAppBoundsInPortrait= */false);
+        runMinAspectRatioTest(NON_RESIZEABLE_PORTRAIT_ACTIVITY, /* expected= */ 0);
     }
 
     /**
@@ -557,47 +545,18 @@
     }
 
     /**
-     * Launches the provided activity twice. The first time, the display is resized to a portrait
-     * aspect ratio. The second time, the display is resized to a landscape aspect ratio.
+     * Launches the provided activity and verifies that its min aspect ratio is equal to {@code
+     * expected}.
      *
      * @param activity the activity under test.
-     * @param expected the expected aspect ratio in both portrait and landscape displays.
+     * @param expected the expected min aspect ratio in both portrait and landscape displays.
      */
     private void runMinAspectRatioTest(ComponentName activity, float expected) {
-        runMinAspectRatioTest(activity, expected, /* useAppBoundsInPortrait= */ true);
-    }
-
-    /**
-     * Launches the provided activity twice. The first time, the display is resized to a portrait
-     * aspect ratio. The second time, the display is resized to a landscape aspect ratio.
-     *
-     * @param activity               the activity under test.
-     * @param expected               the expected aspect ratio in both a portrait and a landscape
-     *                               display.
-     * @param useAppBoundsInPortrait whether to use {@code activity#getAppBounds} rather than
-     *                               {@code activity.getBounds} in portrait display.
-     */
-    private void runMinAspectRatioTest(ComponentName activity, float expected,
-            boolean useAppBoundsInPortrait) {
-        // Change the aspect ratio of the display to something that is smaller than all the aspect
-        // ratios used throughout those tests but still portrait. This ensures we're using
-        // enforcing aspect ratio behaviour within orientation.
-        // NOTE: using a smaller aspect ratio (e.g., 1.2) might cause activities to have a landscape
-        // window because of insets.
-        mDisplayMetricsSession.changeAspectRatio(SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
-                ORIENTATION_PORTRAIT);
         launchActivity(activity);
+        WindowManagerState.Activity activityContainer = mWmState.getActivity(activity);
+        assertNotNull(activityContainer);
         assertEquals(expected,
-                getActivityAspectRatio(activity, /* useAppBounds= */ useAppBoundsInPortrait),
-                FLOAT_EQUALITY_DELTA);
-
-        // Change the orientation of the display to landscape. In this case we should see
-        // fixed orientation letterboxing and the aspect ratio should be applied there.
-        mDisplayMetricsSession.changeAspectRatio(SIZE_COMPAT_DISPLAY_ASPECT_RATIO,
-                ORIENTATION_LANDSCAPE);
-        launchActivity(activity);
-        assertEquals(expected,
-                getActivityAspectRatio(activity, /* useAppBounds= */ true),
+                activityContainer.getMinAspectRatio(),
                 FLOAT_EQUALITY_DELTA);
     }
 
@@ -638,15 +597,6 @@
         }, "checking task bounds updated");
     }
 
-    private float getActivityAspectRatio(ComponentName componentName, boolean useAppBounds) {
-        WindowManagerState.Activity activity = mWmState.getActivity(componentName);
-        assertNotNull(activity);
-        Rect bounds = useAppBounds ? activity.getAppBounds() : activity.getBounds();
-        assertNotNull(bounds);
-        return Math.max(bounds.height(), bounds.width())
-                / (float) (Math.min(bounds.height(), bounds.width()));
-    }
-
     private float getInitialDisplayAspectRatio() {
         Size size = mDisplayMetricsSession.getInitialDisplayMetrics().getSize();
         return Math.max(size.getHeight(), size.getWidth())
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java b/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
index bd415bf..9da0698 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DisplayTests.java
@@ -165,8 +165,8 @@
 
         // Apply new override values that don't match the physical metrics.
         final Size overrideSize = new Size(
-                (int) (originalDisplayMetrics.physicalSize.getWidth() * 1.5),
-                (int) (originalDisplayMetrics.physicalSize.getHeight() * 1.5));
+                (int) (originalDisplayMetrics.physicalSize.getWidth() * 0.9),
+                (int) (originalDisplayMetrics.physicalSize.getHeight() * 0.9));
         final Integer overrideDensity = (int) (originalDisplayMetrics.physicalDensity * 1.1);
         displayMetricsSession.overrideDisplayMetrics(overrideSize, overrideDensity);
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
index 635472f..354807f 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardLockedTests.java
@@ -216,40 +216,6 @@
     }
 
     @Test
-    public void testTurnScreenOnActivity_withSecureKeyguardAndAod() {
-        final AodSession aodSession = createManagedAodSession();
-        final LockScreenSession lockScreenSession = createManagedLockScreenSession();
-        lockScreenSession.setLockCredential();
-        testTurnScreenOnActivity_withSecureKeyguard(aodSession, lockScreenSession,
-                false /* enableAod */);
-        testTurnScreenOnActivity_withSecureKeyguard(aodSession, lockScreenSession,
-                true /* enableAod */);
-    }
-
-    private void testTurnScreenOnActivity_withSecureKeyguard(AodSession aodSession,
-            LockScreenSession lockScreenSession, boolean enableAod) {
-        if (enableAod) {
-            assumeTrue(aodSession.isAodAvailable());
-        }
-        aodSession.setAodEnabled(enableAod);
-        lockScreenSession.sleepDevice();
-        mWmState.computeState();
-        assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
-
-        final CommandSession.ActivitySessionClient activityClient =
-                createManagedActivityClientSession();
-        final CommandSession.ActivitySession activity = activityClient.startActivity(
-                getLaunchActivityBuilder().setUseInstrumentation().setIntentExtra(extra -> {
-                    extra.putBoolean(Components.TurnScreenOnActivity.EXTRA_SHOW_WHEN_LOCKED, false);
-                }).setTargetActivity(TURN_SCREEN_ON_ACTIVITY));
-        mWmState.waitForKeyguardShowingAndNotOccluded();
-        mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, false);
-        assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
-        assertFalse(isDisplayOn(DEFAULT_DISPLAY));
-        activity.finish();
-    }
-
-    @Test
     public void testDismissKeyguardAttrActivity_method_turnScreenOn_withSecureKeyguard() {
         final LockScreenSession lockScreenSession = createManagedLockScreenSession();
         lockScreenSession.setLockCredential().sleepDevice();
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
index 4213984..dc7c308 100755
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardTests.java
@@ -443,7 +443,7 @@
     }
 
     @Test
-    public void testTurnScreenOnOnActivityOnAod() {
+    public void testTurnScreenOnActivityOnAod() {
         final AodSession aodSession = createManagedAodSession();
         assumeTrue(aodSession.isAodAvailable());
         aodSession.setAodEnabled(true);
@@ -460,10 +460,13 @@
                             false);
                 }).setTargetActivity(TURN_SCREEN_ON_ACTIVITY));
 
-        mWmState.computeState(TURN_SCREEN_ON_ACTIVITY);
-        mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, true);
-        assertFalse(mWmState.getKeyguardControllerState().keyguardShowing);
-        assertTrue(isDisplayOn(DEFAULT_DISPLAY));
+        mWmState.waitForAllStoppedActivities();
+        // An activity without set showWhenLocked or dismissKeyguard cannot wakeup device and/or
+        // unlock insecure keyguard even if it has setTurnScreenOn, so the device should stay
+        // invisible and the display stay in dozing.
+        mWmState.assertVisibility(TURN_SCREEN_ON_ACTIVITY, false);
+        assertTrue(mWmState.getKeyguardControllerState().keyguardShowing);
+        assertFalse(isDisplayOn(DEFAULT_DISPLAY));
     }
     /**
      * Tests whether a FLAG_DISMISS_KEYGUARD activity occludes Keyguard.
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 c7755e0..2541c43 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
@@ -640,25 +640,7 @@
         assumeTrue(MSG_NO_MOCK_IME, supportsInstallableIme());
 
         final MockImeSession mockImeSession = createManagedMockImeSession(this);
-
-        // Launch Ime test activity on default display.
-        final TestActivitySession<ImeTestActivity2> defaultDisplaySession =
-                createManagedTestActivitySession();
-        defaultDisplaySession.launchTestActivityOnDisplaySync(ImeTestActivity2.class,
-                DEFAULT_DISPLAY);
-
-        // Tap the EditText to start IME session.
-        final int[] location = new int[2];
-        EditText editText = defaultDisplaySession.getActivity().mEditText;
-        tapOnDisplayCenter(DEFAULT_DISPLAY);
-        editText.getLocationOnScreen(location);
-        tapOnDisplaySync(location[0], location[1], DEFAULT_DISPLAY);
-
-        // Verify the activity shows soft input on the default display.
         final ImeEventStream stream = mockImeSession.openEventStream();
-        waitOrderedImeEventsThenAssertImeShown(stream, DEFAULT_DISPLAY,
-                editorMatcher("onStartInput", editText.getPrivateImeOptions()),
-                event -> "showSoftInput".equals(event.getEventName()));
 
         // Create a virtual display with the policy to hide the IME.
         final DisplayContent newDisplay = createManagedVirtualDisplaySession()
@@ -681,7 +663,8 @@
                 newDisplay.mId);
 
         // Tap the EditText on the virtual display.
-        editText = imeTestActivitySession.getActivity().mEditText;
+        final int[] location = new int[2];
+        EditText editText = imeTestActivitySession.getActivity().mEditText;
         tapOnDisplayCenter(newDisplay.mId);
         editText.getLocationOnScreen(location);
         tapOnDisplaySync(location[0], location[1], newDisplay.mId);
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 2dd9dd6..5e56733 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
@@ -1292,8 +1292,8 @@
         launchActivity(PIP_ACTIVITY, extraString(EXTRA_ALLOW_AUTO_PIP, "true"));
         assertPinnedStackDoesNotExist();
 
-        // Go home and ensure that there is a pinned stack.
-        launchHomeActivity();
+        // Launch a new activity and ensure that there is a pinned stack.
+        launchActivity(RESUME_WHILE_PAUSING_ACTIVITY);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
     }
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 a8517c2..9e00b08 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
@@ -44,6 +44,12 @@
 @Presubmit
 public class SurfaceControlTest {
     private static final int DEFAULT_SURFACE_SIZE = 100;
+    /**
+     * Use a rect that doesn't include 1 pixel in the border since some composers add blending at
+     * the edges. It's easier to just ignore those pixels and ensure the rest are correct.
+     */
+    private static final Rect DEFAULT_RECT = new Rect(1, 1, DEFAULT_SURFACE_SIZE - 1,
+            DEFAULT_SURFACE_SIZE - 1);
 
     @Rule
     public ActivityScenarioRule<ASurfaceControlTestActivity> mActivityRule =
@@ -153,7 +159,7 @@
                         sc.release();
                     }
                 },
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+                new RectChecker(DEFAULT_RECT, PixelColor.RED));
     }
 
     /**
@@ -172,7 +178,7 @@
                         sc.release();
                     }
                 },
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.BLACK));
+                new RectChecker(DEFAULT_RECT, PixelColor.BLACK));
     }
 
     /**
@@ -189,7 +195,7 @@
                         new SurfaceControl.Transaction().reparent(sc, null).apply();
                     }
                 },
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.BLACK));
+                new RectChecker(DEFAULT_RECT, PixelColor.BLACK));
       // Since the SurfaceControl is parented off-screen, if we release our reference
       // it may completely die. If this occurs while the render thread is still rendering
       // the RED background we could trigger a crash. For this test defer destroying the
@@ -217,7 +223,7 @@
                         sc.release();
                     }
                 },
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+                new RectChecker(DEFAULT_RECT, PixelColor.RED));
     }
 
     /**
@@ -241,7 +247,7 @@
                         sc.release();
                     }
                 },
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.GREEN));
+                new RectChecker(DEFAULT_RECT, PixelColor.GREEN));
     }
 
     /**
@@ -262,7 +268,7 @@
                 },
 
                 // The rect should be offset by -50 pixels
-                new MultiRectChecker(new Rect(0, 0, 100, 100)) {
+                new MultiRectChecker(DEFAULT_RECT) {
                     final PixelColor red = new PixelColor(PixelColor.RED);
                     final PixelColor black = new PixelColor(PixelColor.BLACK);
                     @Override
@@ -295,7 +301,7 @@
                 },
 
                 // The rect should be offset by 50 pixels
-                new MultiRectChecker(new Rect(0, 0, 100, 100)) {
+                new MultiRectChecker(DEFAULT_RECT) {
                     final PixelColor red = new PixelColor(PixelColor.RED);
                     final PixelColor black = new PixelColor(PixelColor.BLACK);
                     @Override
@@ -328,6 +334,6 @@
                     }
                 },
 
-                new RectChecker(new Rect(0, 0, 100, 100), PixelColor.RED));
+                new RectChecker(DEFAULT_RECT, PixelColor.RED));
     }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
index dbbb4fd..a3b504e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
@@ -88,6 +88,11 @@
             new ActivityTestRule<>(ImmersiveFullscreenTestActivity.class,
                     false /* initialTouchMode */, false /* launchActivity */);
 
+    @Rule
+    public final ActivityTestRule<NaturalOrientationTestActivity> mNaturalOrientationTestActivity =
+            new ActivityTestRule<>(NaturalOrientationTestActivity.class,
+                    false /* initialTouchMode */, false /* launchActivity */);
+
     @Before
     @Override
     public void setUp() throws Exception {
@@ -124,6 +129,7 @@
         assumeTrue("Skipping test: no split multi-window support",
                 supportsSplitScreenMultiWindow());
 
+        launchAndWait(mNaturalOrientationTestActivity);
         mWmState.computeState(new ComponentName[] {});
         final boolean naturalOrientationPortrait =
                 mWmState.getDisplay(DEFAULT_DISPLAY)
@@ -356,4 +362,7 @@
                     | View.SYSTEM_UI_FLAG_FULLSCREEN);
         }
     }
+
+    public static class NaturalOrientationTestActivity extends TestActivity {
+    }
 }
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 388095c..8d2769c 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
@@ -1452,6 +1452,7 @@
         boolean visible;
         boolean frontOfTask;
         boolean inSizeCompatMode;
+        float minAspectRatio;
         int procId = -1;
         public boolean translucent;
         ActivityTask task;
@@ -1464,6 +1465,7 @@
             visible = proto.visible;
             frontOfTask = proto.frontOfTask;
             inSizeCompatMode = proto.inSizeCompatMode;
+            minAspectRatio = proto.minAspectRatio;
             if (proto.procId != 0) {
                 procId = proto.procId;
             }
@@ -1482,6 +1484,10 @@
             return inSizeCompatMode;
         }
 
+        public float getMinAspectRatio() {
+            return minAspectRatio;
+        }
+
         @Override
         public Rect getBounds() {
             if (mBounds == null) {
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
index 0a70d01..080c0cb 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerStateHelper.java
@@ -160,6 +160,7 @@
 
     public static boolean isKeyguardShowingAndNotOccluded(WindowManagerState state) {
         return state.getKeyguardControllerState().keyguardShowing
+                && !state.getKeyguardControllerState().aodShowing
                 && !state.getKeyguardControllerState().isKeyguardOccluded(DEFAULT_DISPLAY);
     }
 
diff --git a/tests/inputmethod/AndroidManifest.xml b/tests/inputmethod/AndroidManifest.xml
index 4b1cead..18c6ebf 100644
--- a/tests/inputmethod/AndroidManifest.xml
+++ b/tests/inputmethod/AndroidManifest.xml
@@ -29,7 +29,7 @@
         <activity android:name="android.view.inputmethod.cts.util.TestActivity"
              android:theme="@style/no_starting_window"
              android:label="TestActivity"
-             android:configChanges="fontScale|smallestScreenSize"
+             android:configChanges="fontScale|smallestScreenSize|screenSize|screenLayout"
              android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
index 5f88d27..bf301d6 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeEventStreamTestUtils.java
@@ -169,6 +169,25 @@
     }
 
     /**
+     * Checks if {@code eventName} has occurred on the EditText(or TextView) of the current
+     * activity mainly for onStartInput restarting check.
+     * @param eventName event name to check
+     * @param marker Test marker set to {@link android.widget.EditText#setPrivateImeOptions(String)}
+     * @return true if event occurred and restarting is false.
+     */
+    public static Predicate<ImeEvent> editorMatcherRestartingFalse(
+            @NonNull String eventName, @NonNull String marker) {
+        return event -> {
+            if (!TextUtils.equals(eventName, event.getEventName())) {
+                return false;
+            }
+            final EditorInfo editorInfo = event.getArguments().getParcelable("editorInfo");
+            final boolean restarting = event.getArguments().getBoolean("restarting");
+            return (TextUtils.equals(marker, editorInfo.privateImeOptions) && !restarting );
+        };
+    }
+
+    /**
     * Checks if {@code eventName} has occurred on the EditText(or TextView) of the current
     * activity.
     * @param eventName event name to check
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
index 5c738e1..34d4443 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
@@ -25,6 +25,7 @@
 import static android.widget.PopupWindow.INPUT_METHOD_NOT_NEEDED;
 
 import static com.android.cts.mockime.ImeEventStreamTestUtils.editorMatcher;
+import static com.android.cts.mockime.ImeEventStreamTestUtils.editorMatcherRestartingFalse;
 import static com.android.cts.mockime.ImeEventStreamTestUtils.expectBindInput;
 import static com.android.cts.mockime.ImeEventStreamTestUtils.expectCommand;
 import static com.android.cts.mockime.ImeEventStreamTestUtils.expectEvent;
@@ -159,7 +160,8 @@
             assertFalse(stream.dump(), onStart.getArguments().getBoolean("restarting"));
 
             // There shouldn't be onStartInput any more.
-            notExpectEvent(stream, editorMatcher("onStartInput", marker), NOT_EXPECT_TIMEOUT);
+            notExpectEvent(stream, editorMatcherRestartingFalse("onStartInput", marker),
+                           NOT_EXPECT_TIMEOUT);
         }
     }
 
diff --git a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
index 8c735d9..160fef7 100644
--- a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
@@ -17,8 +17,15 @@
 package android.mediapc.cts;
 
 import android.media.MediaCodecInfo;
+import android.os.Build;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,14 +64,27 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.3/H-1-2")
     public void testAdaptivePlaybackFrameDrop() throws Exception {
         PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName,
                 new String[]{m1080pTestFiles.get(mMime), m540pTestFiles.get(mMime)},
                 mSurface, FRAME_RATE, mIsAsync);
         int frameDropCount = playbackFrameDrop.getFrameDropCount();
-        assertTrue("Adaptive Playback FrameDrop count for mime: " + mMime + ", decoder: " +
-                mDecoderName + ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: " +
-                frameDropCount + "/" + MAX_FRAME_DROP_FOR_30S,
-                frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+        if (Utils.isPerfClass()) {
+            assertTrue("Adaptive Playback FrameDrop count for mime: " + mMime + ", decoder: "
+                    + mDecoderName + ", FrameRate: " + FRAME_RATE
+                    + ", is not as expected. act/exp: " + frameDropCount + "/"
+                    + MAX_FRAME_DROP_FOR_30S, frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+        } else {
+            int pc = frameDropCount <= MAX_FRAME_DROP_FOR_30S ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "AdaptiveFrameDrop_" + mDecoderName);
+            log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.addValue("adaptive_frame_drops_for_30sec", frameDropCount, ResultType.LOWER_BETTER,
+                    ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.3/H-1-2 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java b/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
index 8598622..6a2372f 100644
--- a/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/EncoderInitializationLatencyTest.java
@@ -24,6 +24,7 @@
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.media.MediaRecorder;
+import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
 import android.view.Surface;
@@ -32,6 +33,14 @@
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ReportLog.Metric;
+
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -62,6 +71,11 @@
 public class EncoderInitializationLatencyTest {
     private static final String LOG_TAG = EncoderInitializationLatencyTest.class.getSimpleName();
     private static final boolean[] boolStates = {false, true};
+    private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS = 50;
+    private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS = 65;
+    private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS = 40;
+    private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS = 50;
+
     private static final int MAX_AUDIOENC_INITIALIZATION_LATENCY_MS;
     private static final int MAX_VIDEOENC_INITIALIZATION_LATENCY_MS;
     private static final String AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
@@ -69,14 +83,15 @@
     private static final String AVC_TRANSCODE_FILE = "bbb_1280x720_3mbps_30fps_avc.mp4";
     private static String AVC_DECODER_NAME;
     private static String AVC_ENCODER_NAME;
+
     static {
         if (Utils.isRPerfClass()) {
-            MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = 50;
-            MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = 65;
+            MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS;
+            MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS;
         } else {
             // Performance class Build.VERSION_CODES.S and beyond
-            MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = 40;
-            MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = 50;
+            MAX_AUDIOENC_INITIALIZATION_LATENCY_MS = MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS;
+            MAX_VIDEOENC_INITIALIZATION_LATENCY_MS = MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS;
         }
     }
 
@@ -92,7 +107,8 @@
 
     @Before
     public void setUp() throws Exception {
-        assumeTrue("Test requires performance class.", Utils.isPerfClass());
+        Utils.assumeDeviceMeetsPerformanceClassPreconditions();
+
         ArrayList<String>  listOfAvcHwDecoders = selectHardwareCodecs(AVC, null, null, false);
         assumeFalse("Test requires h/w avc decoder", listOfAvcHwDecoders.isEmpty());
         AVC_DECODER_NAME = listOfAvcHwDecoders.get(0);
@@ -274,6 +290,7 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-7,H-1-8")
     public void testInitializationLatency() throws Exception {
         final int NUM_MEASUREMENTS = 5;
         // Test gathers initialization latency for a number of iterations and
@@ -303,16 +320,35 @@
         Log.i(LOG_TAG, "Min " + statsLog + encoderInitializationLatencyMs[0]);
         Log.i(LOG_TAG, "Max " + statsLog + encoderInitializationLatencyMs[count - 1]);
         Log.i(LOG_TAG, "Avg " + statsLog + (sumOfEncoderInitializationLatencyMs / count));
-
-        String errorLog = String.format(
-                "CodecInitialization latency for mime: %s, Encoder: %s is not as expected. "
-                        + "act/exp in Ms :: %d/%d",
-                mMime, mEncoderName, encoderInitializationLatencyMs[percentile * count / 100],
-                expectedMaxCodecInitializationLatencyMs);
-        assertTrue(errorLog,
-                encoderInitializationLatencyMs[percentile * count / 100]
-                        <= expectedMaxCodecInitializationLatencyMs);
-
+        long initializationLatency = encoderInitializationLatencyMs[percentile * count / 100];
+        if (Utils.isPerfClass()) {
+            String errorLog = String.format(
+                    "CodecInitialization latency for mime: %s, Encoder: %s is not as expected. "
+                            + "act/exp in Ms :: %d/%d", mMime, mEncoderName, initializationLatency,
+                    expectedMaxCodecInitializationLatencyMs);
+            assertTrue(errorLog, initializationLatency <= expectedMaxCodecInitializationLatencyMs);
+        } else {
+            int pc = 0;
+            if (mMime.startsWith("audio/")) {
+                pc = initializationLatency < MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_S_MS
+                        ? Build.VERSION_CODES.S
+                        : initializationLatency < MAX_AUDIOENC_INITIALIZATION_LATENCY_PC_R_MS
+                                ? Build.VERSION_CODES.R : 0;
+            } else {
+                pc = initializationLatency < MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_S_MS
+                        ? Build.VERSION_CODES.S
+                        : initializationLatency < MAX_VIDEOENC_INITIALIZATION_LATENCY_PC_R_MS
+                                ? Build.VERSION_CODES.R : 0;
+            }
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "InitializationLatency_" + mEncoderName);
+            log.addValue("encoder", mEncoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.addValue("initialization_latency", initializationLatency, ResultType.LOWER_BETTER,
+                    ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-7,H-1-8 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
 
diff --git a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
index b3d54de..60bc7a7 100644
--- a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
@@ -16,7 +16,15 @@
 
 package android.mediapc.cts;
 
+import android.os.Build;
+
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -54,12 +62,26 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.3/H-1-1")
     public void testDecodeToSurface() throws Exception {
         PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName,
                 new String[]{m1080pTestFiles.get(mMime)}, mSurface, FRAME_RATE, mIsAsync);
         int frameDropCount = playbackFrameDrop.getFrameDropCount();
-        assertTrue("FrameDrop count for mime: " + mMime + ", decoder: " + mDecoderName +
-                ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: " + frameDropCount +
-                "/" + MAX_FRAME_DROP_FOR_30S, frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+        if (Utils.isPerfClass()) {
+            assertTrue("FrameDrop count for mime: " + mMime + ", decoder: " + mDecoderName
+                            + ", FrameRate: " + FRAME_RATE + ", is not as expected. act/exp: "
+                            + frameDropCount + "/" + MAX_FRAME_DROP_FOR_30S,
+                    frameDropCount <= MAX_FRAME_DROP_FOR_30S);
+        } else {
+            int pc = frameDropCount <= MAX_FRAME_DROP_FOR_30S ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "FrameDrop_" + mDecoderName);
+            log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.addValue("frame_drops_for_30sec", frameDropCount, ResultType.LOWER_BETTER,
+                    ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.3/H-1-1 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java b/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
index a57faf7..47eae77 100644
--- a/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
+++ b/tests/mediapc/src/android/mediapc/cts/FrameDropTestBase.java
@@ -85,7 +85,7 @@
             m1080pTestFiles.put(VP8, "bbb_1920x1080_8mbps_60fps_vp8.webm");
             m1080pTestFiles.put(VP9, "bbb_1920x1080_6mbps_60fps_vp9.webm");
             m1080pTestFiles.put(AV1, "bbb_1920x1080_6mbps_60fps_av1.mp4");
-        } else if (Utils.isRPerfClass()) {
+        } else {
             // One frame drops per 10 seconds at 30 fps is 3 drops per 30 seconds
             MAX_FRAME_DROP_FOR_30S = 3;
             m540pTestFiles.put(AVC, "bbb_960x540_2mbps_30fps_avc.mp4");
@@ -99,15 +99,12 @@
             m1080pTestFiles.put(VP8, "bbb_1920x1080_6mbps_30fps_vp8.webm");
             m1080pTestFiles.put(VP9, "bbb_1920x1080_4mbps_30fps_vp9.webm");
             m1080pTestFiles.put(AV1, "bbb_1920x1080_4mbps_30fps_av1.mp4");
-        } else {
-            MAX_FRAME_DROP_FOR_30S = 0;
-            Log.e(LOG_TAG, "Unknown performance class.");
         }
     }
 
     @Before
     public void setUp() throws Exception {
-        assumeTrue("Test requires performance class.", Utils.isPerfClass());
+        Utils.assumeDeviceMeetsPerformanceClassPreconditions();
 
         ArrayList<String> listOfAvcHwDecoders = selectHardwareCodecs(AVC, null, null, false);
         assumeFalse("Test requires h/w avc decoder", listOfAvcHwDecoders.isEmpty());
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java b/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
index 596532b..07ee73a 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiCodecPerfTestBase.java
@@ -21,7 +21,7 @@
 import android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint;
 import android.media.MediaFormat;
 import android.util.Pair;
-
+import android.util.Log;
 import org.junit.Before;
 
 import java.io.IOException;
@@ -70,8 +70,8 @@
     double mMaxFrameRate;
 
     @Before
-    public void isPerformanceClass() {
-        assumeTrue("Test requires performance class.", Utils.isPerfClass());
+    public void isPerformanceClassCandidate() {
+        Utils.assumeDeviceMeetsPerformanceClassPreconditions();
     }
 
     public MultiCodecPerfTestBase(String mime, String testFile, boolean isAsync) {
@@ -125,8 +125,11 @@
                 }
             }
             codec.release();
-            assertTrue("Codec " + mimeCodecPair.second + " doesn't support 720p " +
-                    requiredFrameRate + " performance point", supports720pPerformance);
+            if (!supports720pPerformance) {
+                Log.e(LOG_TAG, "Codec " + mimeCodecPair.second + " doesn't support 720p " +
+                        requiredFrameRate + " performance point");
+                return 0;
+            }
             loopCount++;
         }
         Arrays.sort(maxInstances);
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
index ddb7451..bff0793 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPairPerfTest.java
@@ -16,9 +16,17 @@
 
 package android.mediapc.cts;
 
+import android.media.MediaFormat;
+import android.os.Build;
 import android.util.Pair;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -88,30 +96,59 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-1,H-1-2")
     public void test720p() throws Exception {
         ArrayList<Pair<String, String>> mimeDecoderPairs = new ArrayList<>();
         mimeDecoderPairs.add(mFirstPair);
         mimeDecoderPairs.add(mSecondPair);
         int maxInstances = checkAndGetMaxSupportedInstancesFor720p(mimeDecoderPairs);
-        int secondPairInstances = maxInstances / 2;
-        int firstPairInstances = maxInstances - secondPairInstances;
-        ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
-        List<Decode> testList = new ArrayList<>();
-        for (int i = 0; i < firstPairInstances; i++) {
-            testList.add(new Decode(mFirstPair.first, mTestFiles.get(mFirstPair.first),
-                    mFirstPair.second, mIsAsync));
+        int requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES;
+        if (mFirstPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)
+                || mSecondPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+            requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
         }
-        for (int i = 0; i < secondPairInstances; i++) {
-            testList.add(new Decode(mSecondPair.first, mTestFiles.get(mSecondPair.first),
-                    mSecondPair.second, mIsAsync));
-        }
-        List<Future<Double>> resultList = pool.invokeAll(testList);
         double achievedFrameRate = 0.0;
-        for (Future<Double> result : resultList) {
-            achievedFrameRate += result.get();
+        if (maxInstances >= requiredMinInstances) {
+            int secondPairInstances = maxInstances / 2;
+            int firstPairInstances = maxInstances - secondPairInstances;
+            ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+            List<Decode> testList = new ArrayList<>();
+            for (int i = 0; i < firstPairInstances; i++) {
+                testList.add(new Decode(mFirstPair.first, mTestFiles.get(mFirstPair.first),
+                        mFirstPair.second, mIsAsync));
+            }
+            for (int i = 0; i < secondPairInstances; i++) {
+                testList.add(new Decode(mSecondPair.first, mTestFiles.get(mSecondPair.first),
+                        mSecondPair.second, mIsAsync));
+            }
+            List<Future<Double>> resultList = pool.invokeAll(testList);
+            for (Future<Double> result : resultList) {
+                achievedFrameRate += result.get();
+            }
         }
-        assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
-                + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
-                achievedFrameRate >= mMaxFrameRate);
+        if (Utils.isPerfClass()) {
+            assertTrue("Decoder pair " + mFirstPair.second + " and " + mSecondPair.second
+                            + " unable to support minimum concurrent " +
+                            "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+                    maxInstances >= requiredMinInstances);
+
+            assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+                            + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
+                    achievedFrameRate >= mMaxFrameRate);
+        } else {
+            int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate
+                    ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "MultiDecoderPairPerf_" + mFirstPair.second);
+            log.addValue("decoders",
+                    mFirstPair.first + "_" + mFirstPair.second + "_" + mSecondPair.first + "_"
+                            + mSecondPair.second, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+            log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-1,H-1-2 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
index 4647719..3e3881b 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiDecoderPerfTest.java
@@ -16,9 +16,16 @@
 
 package android.mediapc.cts;
 import android.media.MediaFormat;
+import android.os.Build;
 import android.util.Pair;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -75,6 +82,7 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-1,H-1-2")
     public void test720p() throws Exception {
         ArrayList<Pair<String, String>> mimeDecoderPairs = new ArrayList<>();
         mimeDecoderPairs.add(Pair.create(mMime, mDecoderName));
@@ -83,21 +91,39 @@
         if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
             requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
         }
-        assertTrue("Decoder " + mDecoderName + " unable to support minimum concurrent " +
-                "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
-                maxInstances >= requiredMinInstances);
-        ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
-        List<Decode> testList = new ArrayList<>();
-        for (int i = 0; i < maxInstances; i++) {
-            testList.add(new Decode(mMime, mTestFile, mDecoderName, mIsAsync));
-        }
-        List<Future<Double>> resultList = pool.invokeAll(testList);
         double achievedFrameRate = 0.0;
-        for (Future<Double> result : resultList) {
-            achievedFrameRate += result.get();
+        if (maxInstances >= requiredMinInstances) {
+            ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+            List<Decode> testList = new ArrayList<>();
+            for (int i = 0; i < maxInstances; i++) {
+                testList.add(new Decode(mMime, mTestFile, mDecoderName, mIsAsync));
+            }
+            List<Future<Double>> resultList = pool.invokeAll(testList);
+            for (Future<Double> result : resultList) {
+                achievedFrameRate += result.get();
+            }
         }
-        assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
-                + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
-                achievedFrameRate >= mMaxFrameRate);
+        if (Utils.isPerfClass()) {
+            assertTrue("Decoder " + mDecoderName + " unable to support minimum concurrent " +
+                            "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+                    maxInstances >= requiredMinInstances);
+            assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+                            + "/" + mMaxFrameRate + " for " + maxInstances + " instances.",
+                    achievedFrameRate >= mMaxFrameRate);
+        } else {
+            int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate
+                    ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "MultiDecoderPerf_" + mDecoderName);
+            log.addValue("decoders", mMime + "_" + mDecoderName, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+            log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-1,H-1-2 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
+
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
index 0ef9f26..4cd2a0c 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPairPerfTest.java
@@ -16,10 +16,17 @@
 
 package android.mediapc.cts;
 
+import android.media.MediaFormat;
+import android.os.Build;
 import android.util.Pair;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -31,6 +38,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
+import static org.junit.Assert.assertTrue;
 /**
  * The following test class calculates the maximum number of concurrent encode sessions that it can
  * support by the two hardware (mime - encoder) pair calculated via the
@@ -86,26 +94,49 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-3,H-1-4")
     public void test720p() throws Exception {
         ArrayList<Pair<String, String>> mimeEncoderPairs = new ArrayList<>();
         mimeEncoderPairs.add(mFirstPair);
         mimeEncoderPairs.add(mSecondPair);
         int maxInstances = checkAndGetMaxSupportedInstancesFor720p(mimeEncoderPairs);
-        int secondPairInstances = maxInstances / 2;
-        int firstPairInstances = maxInstances - secondPairInstances;
-        ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
-        List<Encode> testList = new ArrayList<>();
-        for (int i = 0; i < firstPairInstances; i++) {
-            testList.add(new Encode(mFirstPair.first, mFirstPair.second, mIsAsync));
+        int requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES;
+        if (mFirstPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)
+                || mSecondPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+            requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
         }
-        for (int i = 0; i < secondPairInstances; i++) {
-            testList.add(new Encode(mSecondPair.first, mSecondPair.second, mIsAsync));
-        }
-        List<Future<Double>> resultList = pool.invokeAll(testList);
-        double achievedFrameRate = 0.0;
-        for (Future<Double> result : resultList) {
-            achievedFrameRate += result.get();
+        if (maxInstances >= requiredMinInstances) {
+            int secondPairInstances = maxInstances / 2;
+            int firstPairInstances = maxInstances - secondPairInstances;
+            ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+            List<Encode> testList = new ArrayList<>();
+            for (int i = 0; i < firstPairInstances; i++) {
+                testList.add(new Encode(mFirstPair.first, mFirstPair.second, mIsAsync));
+            }
+            for (int i = 0; i < secondPairInstances; i++) {
+                testList.add(new Encode(mSecondPair.first, mSecondPair.second, mIsAsync));
+            }
+            List<Future<Double>> resultList = pool.invokeAll(testList);
+            double achievedFrameRate = 0.0;
+            for (Future<Double> result : resultList) {
+                achievedFrameRate += result.get();
+            }
         }
         // Achieved frame rate is not compared as this test runs in byte buffer mode.
+        if (Utils.isPerfClass()) {
+            assertTrue("Encoder pair " + mFirstPair.second + " and " + mSecondPair.second
+                    + " unable to support minimum concurrent instances. act/exp: " + maxInstances
+                    + "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
+        } else {
+            int pc = maxInstances >= requiredMinInstances ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "MultiEncoderPairPerf_" + mFirstPair.second);
+            log.addValue("encoders",
+                    mFirstPair.first + "_" + mFirstPair.second + "_" + mSecondPair.first + "_"
+                            + mSecondPair.second, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-3,H-1-4 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
index 969dc19..f45c411 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiEncoderPerfTest.java
@@ -16,9 +16,16 @@
 
 package android.mediapc.cts;
 import android.media.MediaFormat;
+import android.os.Build;
 import android.util.Pair;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -74,6 +81,7 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-3,H-1-4")
     public void test720p() throws Exception {
         ArrayList<Pair<String, String>> mimeEncoderPairs = new ArrayList<>();
         mimeEncoderPairs.add(Pair.create(mMime, mEncoderName));
@@ -82,19 +90,32 @@
         if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
             requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9;
         }
-        assertTrue("Encoder " + mEncoderName + " unable to support minimum concurrent " +
-                "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
-                maxInstances >= requiredMinInstances);
-        ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
-        List<Encode> testList = new ArrayList<>();
-        for (int i = 0; i < maxInstances; i++) {
-            testList.add(new Encode(mMime, mEncoderName, mIsAsync));
-        }
-        List<Future<Double>> resultList = pool.invokeAll(testList);
-        double achievedFrameRate = 0.0;
-        for (Future<Double> result : resultList) {
-            achievedFrameRate += result.get();
+        if (maxInstances >= requiredMinInstances) {
+            ExecutorService pool = Executors.newFixedThreadPool(maxInstances);
+            List<Encode> testList = new ArrayList<>();
+            for (int i = 0; i < maxInstances; i++) {
+                testList.add(new Encode(mMime, mEncoderName, mIsAsync));
+            }
+            List<Future<Double>> resultList = pool.invokeAll(testList);
+            double achievedFrameRate = 0.0;
+            for (Future<Double> result : resultList) {
+                achievedFrameRate += result.get();
+            }
         }
         // Achieved frame rate is not compared as this test runs in byte buffer mode.
+        if (Utils.isPerfClass()) {
+            assertTrue("Encoder " + mEncoderName + " unable to support minimum concurrent " +
+                            "instances. act/exp: " + maxInstances + "/" + requiredMinInstances,
+                    maxInstances >= requiredMinInstances);
+        } else {
+            int pc = maxInstances >= requiredMinInstances ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "MultiEncoderPerf_" + mEncoderName);
+            log.addValue("encoder", mMime + "_" + mEncoderName, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-3,H-1-4 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java b/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
index 4854853..29c8dcb 100644
--- a/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/MultiTranscoderPerfTest.java
@@ -16,11 +16,18 @@
 
 package android.mediapc.cts;
 import android.media.MediaFormat;
+import android.os.Build;
 import android.util.Pair;
 import android.view.Surface;
 
 import androidx.test.filters.LargeTest;
 import androidx.test.rule.ActivityTestRule;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -98,6 +105,7 @@
      */
     @LargeTest
     @Test(timeout = CodecTestBase.PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    @CddTest(requirement="2.2.7.1/5.1/H-1-5,H-1-6")
     public void test720p() throws Exception {
         ArrayList<Pair<String, String>> mimeCodecPairs = new ArrayList<>();
         mimeCodecPairs.add(mDecoderPair);
@@ -108,40 +116,63 @@
                 || mEncoderPair.first.equals(MediaFormat.MIMETYPE_VIDEO_VP9)) {
             requiredMinInstances = REQUIRED_MIN_CONCURRENT_INSTANCES_FOR_VP9 / 2;
         }
-        assertTrue("DecodeMime: " + mDecoderPair.first + ", Decoder " + mDecoderPair.second +
-                ", EncodeMime: " + mEncoderPair.first + ", Encoder: " + mEncoderPair.second +
-                ", unable to support minimum concurrent instances. act/exp: " + maxInstances +
-                "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
-        ExecutorService pool = Executors.newFixedThreadPool(maxInstances / 2 + maxInstances % 2);
-        List<Transcode> transcodeList = new ArrayList<>();
-        for (int i = 0; i < maxInstances / 2 ; i++) {
-            transcodeList.add(new Transcode(mEncoderPair.first, mTestFiles.get(mDecoderPair.first),
-                    mDecoderPair.second, mEncoderPair.second, mIsAsync));
-        }
         double achievedFrameRate = 0.0;
-        List<Future<Double>> decodeResultList = null;
-        if (maxInstances % 2 == 1) {
-            List<DecodeToSurface> decodeList = new ArrayList<>();
-            mActivityRule.getActivity().waitTillSurfaceIsCreated();
-            Surface surface = mActivityRule.getActivity().getSurface();
-            assertTrue("Surface created is null.", surface != null);
-            assertTrue("Surface created is invalid.", surface.isValid());
-            mActivityRule.getActivity().setScreenParams(1280, 720, true);
-            decodeList.add(new DecodeToSurface(mDecoderPair.first,
-                    mTestFiles.get(mDecoderPair.first), mDecoderPair.second, surface, mIsAsync));
-            decodeResultList = pool.invokeAll(decodeList);
-        }
-        List<Future<Double>> transcodeResultList = pool.invokeAll(transcodeList);
-        for (Future<Double> result : transcodeResultList) {
-            achievedFrameRate += result.get();
-        }
-        if (decodeResultList != null) {
-            for (Future<Double> result : decodeResultList) {
+        if (maxInstances >= requiredMinInstances) {
+            ExecutorService pool = Executors.newFixedThreadPool(
+                    maxInstances / 2 + maxInstances % 2);
+            List<Transcode> transcodeList = new ArrayList<>();
+            for (int i = 0; i < maxInstances / 2; i++) {
+                transcodeList.add(
+                        new Transcode(mEncoderPair.first, mTestFiles.get(mDecoderPair.first),
+                                mDecoderPair.second, mEncoderPair.second, mIsAsync));
+            }
+            List<Future<Double>> decodeResultList = null;
+            if (maxInstances % 2 == 1) {
+                List<DecodeToSurface> decodeList = new ArrayList<>();
+                mActivityRule.getActivity().waitTillSurfaceIsCreated();
+                Surface surface = mActivityRule.getActivity().getSurface();
+                assertTrue("Surface created is null.", surface != null);
+                assertTrue("Surface created is invalid.", surface.isValid());
+                mActivityRule.getActivity().setScreenParams(1280, 720, true);
+                decodeList.add(new DecodeToSurface(mDecoderPair.first,
+                        mTestFiles.get(mDecoderPair.first), mDecoderPair.second, surface,
+                        mIsAsync));
+                decodeResultList = pool.invokeAll(decodeList);
+            }
+            List<Future<Double>> transcodeResultList = pool.invokeAll(transcodeList);
+            for (Future<Double> result : transcodeResultList) {
                 achievedFrameRate += result.get();
             }
+            if (decodeResultList != null) {
+                for (Future<Double> result : decodeResultList) {
+                    achievedFrameRate += result.get();
+                }
+            }
         }
-        assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
-                + "/" + mMaxFrameRate / 2 + " for " + maxInstances + " instances.",
-                achievedFrameRate >= mMaxFrameRate / 2);
+        if (Utils.isPerfClass()) {
+            assertTrue("DecodeMime: " + mDecoderPair.first + ", Decoder " + mDecoderPair.second +
+                    ", EncodeMime: " + mEncoderPair.first + ", Encoder: " + mEncoderPair.second +
+                    ", unable to support minimum concurrent instances. act/exp: " + maxInstances +
+                    "/" + requiredMinInstances, maxInstances >= requiredMinInstances);
+
+            assertTrue("Unable to achieve the maxFrameRate supported. act/exp: " + achievedFrameRate
+                            + "/" + mMaxFrameRate / 2 + " for " + maxInstances + " instances.",
+                    achievedFrameRate >= mMaxFrameRate / 2);
+        } else {
+            int pc = maxInstances >= requiredMinInstances && achievedFrameRate >= mMaxFrameRate / 2
+                    ? Build.VERSION_CODES.R : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
+                    "MultiTranscoderPairPerf_" + mDecoderPair.second);
+            log.addValue("decoders", mDecoderPair.first + "_" + mDecoderPair.second + "_"
+                            + mEncoderPair.first + "_" + mEncoderPair.second, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.addValue("achieved_framerate", achievedFrameRate, ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+            log.addValue("expected_framerate", mMaxFrameRate, ResultType.NEUTRAL, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.1/5.1/H-1-5,H-1-6 performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
+
     }
 }
diff --git a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
index e493dcd..0ace441 100644
--- a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
@@ -21,12 +21,17 @@
 import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.Build;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.WindowManager;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.DeviceReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Assume;
 import org.junit.Test;
@@ -66,16 +71,14 @@
     }
 
     @Test
+    @CddTest(requirement="2.2.7.3/7.1.1.1,7.1.1.3,7.6.1/H-1-1")
     public void testMinimumMemory() {
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
 
-        if (Utils.isSPerfClass()) {
-            Context context = InstrumentationRegistry.getInstrumentation().getContext();
-
-            // Verify minimum screen density and resolution
-            assertMinDpiAndPixels(context, DENSITY_400, 1920, 1080);
-            // Verify minimum memory
-            assertMinMemoryMb(context, 6 * 1024);
-        }
+        // Verify minimum screen density and resolution
+        assertMinDpiAndPixels(context, DENSITY_400, 1920, 1080);
+        // Verify minimum memory
+        assertMinMemoryMb(context, 6 * 1024);
     }
 
     /** Asserts that the given values conform to the specs in CDD */
@@ -92,11 +95,23 @@
         Log.i(TAG, String.format("minDpi=%d minSize=%dx%dpix", minDpi, minLong, minShort));
         Log.i(TAG, String.format("dpi=%d size=%dx%dpix", density, longPix, shortPix));
 
-        assertTrue("Display density " + density + " must be at least " + minDpi + "dpi",
-                   density >= minDpi);
-        assertTrue("Display resolution " + longPix + "x" + shortPix + "pix must be at least " +
-                   minLong + "x" + minShort + "pix",
-                   longPix >= minLong && shortPix >= minShort);
+        if (Utils.isPerfClass()) {
+            assertTrue("Display density " + density + " must be at least " + minDpi + "dpi",
+                    density >= minDpi);
+            assertTrue("Display resolution " + longPix + "x" + shortPix + "pix must be at least " +
+                            minLong + "x" + minShort + "pix",
+                    longPix >= minLong && shortPix >= minShort);
+        } else {
+            int pc = density >= minDpi && longPix >= minLong && shortPix >= minShort
+                    ? Build.VERSION_CODES.S : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",  "Display");
+            log.addValue("DisplayDensity", density, ResultType.LOWER_BETTER, ResultUnit.NONE);
+            log.addValue("ResolutionLong", longPix, ResultType.LOWER_BETTER, ResultUnit.NONE);
+            log.addValue("ResolutionShort", shortPix, ResultType.LOWER_BETTER, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.3/7.1.1.1,7.1.1.3/H-1-1 performance_class", pc,
+                    ResultType.NEUTRAL, ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
     }
 
     /** Asserts that the given values conform to the specs in CDD 7.6.1 */
@@ -107,9 +122,18 @@
 
         Log.i(TAG, String.format("minMb=%,d", minMb));
         Log.i(TAG, String.format("totalMemoryMb=%,d", totalMemoryMb));
+        if (Utils.isPerfClass()) {
+            assertTrue(String.format("Does not meet minimum memory requirements (CDD 7.6.1)."
+                    + "Found = %d, Minimum = %d", totalMemoryMb, minMb), totalMemoryMb >= minMb);
+        } else {
+            int pc = totalMemoryMb >= minMb ? Build.VERSION_CODES.S : 0;
+            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",  "MinMemory");
+            log.addValue("MemoryMB", totalMemoryMb, ResultType.LOWER_BETTER, ResultUnit.NONE);
+            log.setSummary("CDD 2.2.7.3/7.6.1/H-1-1  performance_class", pc, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            log.submit(InstrumentationRegistry.getInstrumentation());
+        }
 
-        assertTrue(String.format("Does not meet minimum memory requirements (CDD 7.6.1)."
-                + "Found = %d, Minimum = %d", totalMemoryMb, minMb), totalMemoryMb >= minMb);
     }
 
     /**
diff --git a/tests/mediapc/src/android/mediapc/cts/Utils.java b/tests/mediapc/src/android/mediapc/cts/Utils.java
index c4038cf..d3510b6 100644
--- a/tests/mediapc/src/android/mediapc/cts/Utils.java
+++ b/tests/mediapc/src/android/mediapc/cts/Utils.java
@@ -16,19 +16,61 @@
 
 package android.mediapc.cts;
 
+import static android.util.DisplayMetrics.DENSITY_400;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Build;
+import android.os.SystemProperties;
+import android.util.DisplayMetrics;
 import android.util.Log;
+import android.view.WindowManager;
+
+import com.android.compatibility.common.util.ApiLevelUtil;
+
+import static org.junit.Assume.assumeTrue;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
 
 /**
  * Test utilities.
  */
 /* package private */ class Utils {
-    private static final int sPc = Build.VERSION.MEDIA_PERFORMANCE_CLASS;
+    private static final int sPc;
 
     private static final String TAG = "PerformanceClassTestUtils";
 
+    public static final int DISPLAY_DPI;
+    public static final int MIN_DISPLAY_CANDIDATE_DPI = DENSITY_400;
+    public static final int DISPLAY_LONG_PIXELS;
+    public static final int MIN_DISPLAY_LONG_CANDIDATE_PIXELS = 1920;
+    public static final int DISPLAY_SHORT_PIXELS;
+    public static final int MIN_DISPLAY_SHORT_CANDIDATE_PIXELS = 1080;
+
+    public static final long TOTAL_MEMORY_MB;
+    // Media performance requires 6 GB minimum RAM, but keeping the following to 5 GB
+    // as activityManager.getMemoryInfo() returns around 5.4 GB on a 6 GB device.
+    public static final long MIN_MEMORY_PERF_CLASS_CANDIDATE_MB = 5 * 1024;
+
     static {
-        Log.d(TAG, "performance class is "  + sPc);
+        sPc = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.S) ? Build.VERSION.MEDIA_PERFORMANCE_CLASS
+                : SystemProperties.getInt("ro.odm.build.media_performance_class", 0);
+        Log.d(TAG, "performance class is " + sPc);
+
+        Context context = InstrumentationRegistry.getInstrumentation().getContext();
+        DisplayMetrics metrics = new DisplayMetrics();
+        WindowManager windowManager = context.getSystemService(WindowManager.class);
+        windowManager.getDefaultDisplay().getMetrics(metrics);
+        DISPLAY_DPI = metrics.densityDpi;
+        DISPLAY_LONG_PIXELS = Math.max(metrics.widthPixels, metrics.heightPixels);
+        DISPLAY_SHORT_PIXELS = Math.min(metrics.widthPixels, metrics.heightPixels);
+
+        ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
+        activityManager.getMemoryInfo(memoryInfo);
+        TOTAL_MEMORY_MB = memoryInfo.totalMem / 1024 / 1024;
     }
 
     /**
@@ -41,14 +83,25 @@
     }
 
     public static boolean isSPerfClass() {
-        return sPc == Build.VERSION_CODES.R + 1; /* TODO: make this S */
+        return sPc == Build.VERSION_CODES.S;
     }
 
     /**
      * Latest defined media performance class.
      */
-    /* TODO: make this S */
-    private static final int LAST_PERFORMANCE_CLASS = Build.VERSION_CODES.R + 1;
+    private static final int LAST_PERFORMANCE_CLASS = Build.VERSION_CODES.S;
+
+    public static boolean isHandheld() {
+        // handheld nature is not exposed to package manager, for now
+        // we check for touchscreen and NOT watch and NOT tv
+        PackageManager pm =
+                InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
+        return pm.hasSystemFeature(pm.FEATURE_TOUCHSCREEN)
+                && !pm.hasSystemFeature(pm.FEATURE_WATCH)
+                && !pm.hasSystemFeature(pm.FEATURE_TELEVISION)
+                && !pm.hasSystemFeature(pm.FEATURE_AUTOMOTIVE);
+    }
+
 
     public static int getPerfClass() {
         return sPc;
@@ -58,4 +111,28 @@
         return sPc >= FIRST_PERFORMANCE_CLASS &&
                sPc <= LAST_PERFORMANCE_CLASS;
     }
+
+    public static boolean meetsPerformanceClassPreconditions() {
+        if (isPerfClass()) {
+            return true;
+        }
+
+        // If device doesn't advertise performance class, check if this can be ruled out as a
+        // candidate for performance class tests.
+        if (!isHandheld() ||
+                TOTAL_MEMORY_MB < MIN_MEMORY_PERF_CLASS_CANDIDATE_MB ||
+                DISPLAY_DPI < MIN_DISPLAY_CANDIDATE_DPI ||
+                DISPLAY_LONG_PIXELS < MIN_DISPLAY_LONG_CANDIDATE_PIXELS ||
+                DISPLAY_SHORT_PIXELS < MIN_DISPLAY_SHORT_CANDIDATE_PIXELS) {
+            return false;
+        }
+        return true;
+    }
+
+    public static void assumeDeviceMeetsPerformanceClassPreconditions() {
+        assumeTrue(
+                "Test skipped because the device does not meet the hardware requirements for "
+                        + "performance class.",
+                meetsPerformanceClassPreconditions());
+    }
 }
diff --git a/tests/rotationresolverservice/Android.bp b/tests/rotationresolverservice/Android.bp
new file mode 100644
index 0000000..ba2218b
--- /dev/null
+++ b/tests/rotationresolverservice/Android.bp
@@ -0,0 +1,52 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+    // See: http://go/android-license-faq
+    default_applicable_licenses: [
+        "Android-Apache-2.0",
+    ],
+}
+
+android_test {
+    name: "CtsRotationResolverServiceDeviceTestCases",
+    defaults: ["cts_defaults"],
+    dex_preopt: {
+        enabled: false,
+    },
+    optimize: {
+        enabled: false,
+    },
+    static_libs: [
+        "androidx.test.rules",
+        "androidx.test.ext.junit",
+        "compatibility-device-util-axt",
+        "platform-test-annotations",
+        "compatibility-device-util-axt",
+        "cts-wm-util",
+        "android-common",
+        "android-support-v4",
+    ],
+    libs: [
+        "android.test.base",
+        "android.test.runner",
+    ],
+    srcs: ["src/**/*.java"],
+    // Tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    sdk_version: "test_current",
+}
diff --git a/tests/rotationresolverservice/Android.mk b/tests/rotationresolverservice/Android.mk
deleted file mode 100644
index aaaafbc..0000000
--- a/tests/rotationresolverservice/Android.mk
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (C) 2021 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# Don't include this package in any target
-LOCAL_MODULE_TAGS := tests
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_DEX_PREOPT := false
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    androidx.test.rules \
-    androidx.test.ext.junit \
-    compatibility-device-util-axt \
-    platform-test-annotations \
-    compatibility-device-util-axt \
-    cts-wm-util \
-    android-common \
-    android-support-v4 \
-
-LOCAL_JAVA_LIBRARIES := \
-    android.test.base \
-    android.test.runner \
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts general-tests
-
-LOCAL_PACKAGE_NAME := CtsRotationResolverServiceDeviceTestCases
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-
-LOCAL_SDK_VERSION := test_current
-
-include $(BUILD_CTS_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/signature/api-check/OWNERS b/tests/signature/api-check/OWNERS
index c8305d1..2e21bf8 100644
--- a/tests/signature/api-check/OWNERS
+++ b/tests/signature/api-check/OWNERS
@@ -1,7 +1,6 @@
 # Bug component: 24949
-platform-compat-eng+reviews@google.com
-andreionea@google.com
-mathewi@google.com
 ngeoffray@google.com
 paulduffin@google.com
+andreionea@google.com
+mathewi@google.com
 satayev@google.com
diff --git a/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
deleted file mode 100644
index 39dbe17..0000000
--- a/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-# Bug component: 610774
-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-blocklist-test-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
deleted file mode 100644
index 66ea541..0000000
--- a/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-# 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/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
index f90bd5d..1aa05ef 100644
--- a/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
+++ b/tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
@@ -909,6 +909,8 @@
     @AppModeFull(reason = "Test APK Activity not found when installed as an instant app")
     @Test
     public void testIsAppInactive() throws Exception {
+        assumeTrue("Test only works on devices with a battery", BatteryUtils.hasBattery());
+
         setStandByBucket(mTargetPackage, "rare");
 
         try {
@@ -954,6 +956,8 @@
     @AppModeFull(reason = "Test APK Activity not found when installed as an instant app")
     @Test
     public void testIsAppInactive_Charging() throws Exception {
+        assumeTrue("Test only works on devices with a battery", BatteryUtils.hasBattery());
+
         setStandByBucket(TEST_APP_PKG, "rare");
 
         try {
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 343a224..4b0c129 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
@@ -165,7 +165,7 @@
 
   AIBinder_decStrong(binder);
 
-  AIBinder* promoted = AIBinder_Weak_promote(weak);
+  AIBinder* promoted = AIBinder_Weak_promote(copy);
   EXPECT_EQ(nullptr, promoted);
 
   AIBinder_Weak_delete(copy);
diff --git a/tests/tests/car/AndroidTest.xml b/tests/tests/car/AndroidTest.xml
index 7b44a58..f3d0aa7 100644
--- a/tests/tests/car/AndroidTest.xml
+++ b/tests/tests/car/AndroidTest.xml
@@ -18,7 +18,7 @@
             type="module_controller"/>
     <option name="test-suite-tag" value="cts"/>
     <option name="config-descriptor:metadata" key="component" value="auto"/>
-    <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="multi_abi"/>
 
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user"/>
diff --git a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
index b6ee78c..aac7049 100644
--- a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
+++ b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
@@ -520,6 +520,10 @@
             mTelephonyManager.getServiceState();
             mTelephonyManager.getManualNetworkSelectionPlmn();
             mTelephonyManager.setForbiddenPlmns(new ArrayList<String>());
+            int activeModemCount = mTelephonyManager.getActiveModemCount();
+            for (int i = 0; i < activeModemCount; i++) {
+                mTelephonyManager.isModemEnabledForSlot(i);
+            }
         } catch (SecurityException e) {
             fail(NO_CARRIER_PRIVILEGES_FAILURE_MESSAGE);
         }
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
index ae3e7cd..a77433f5 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
@@ -31,6 +31,7 @@
 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.Assume.assumeNotNull;
 
 import android.content.Context;
@@ -38,6 +39,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
 import android.os.Environment;
 import android.os.Parcel;
 import android.os.Process;
@@ -291,6 +293,10 @@
 
     @Test
     public void testIsProduct() throws Exception {
+        // The product flag is supported since P. Suppose that devices lauch on Android P may not
+        // have product partition.
+        assumeFalse(Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.P);
+
         final String systemPath = Environment.getRootDirectory().getAbsolutePath();
         final String productPath = Environment.getProductDirectory().getAbsolutePath();
         final String packageName = getPartitionFirstPackageName(systemPath, productPath);
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
index 8470a12..c8410f3 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java
@@ -154,10 +154,17 @@
     public void testAndroid12RequiresIncFsV2() throws Exception {
         // IncFS is a kernel feature, which is a subject to vendor freeze. That's why
         // the test verifies the vendor API level here, not the system's one.
-        final boolean v2Required = PropertyUtil.isVendorApiLevelNewerThan(30);
+        // Note: vendor API level getter returns either the frozen API level, or the current one for
+        //  non-vendor-freeze devices; need to verify both the system first API level and vendor
+        //  level to make the final decision.
+        final boolean v2ReqdForSystem = PropertyUtil.getFirstApiLevel() > 30;
+        final boolean v2ReqdForVendor = PropertyUtil.isVendorApiLevelNewerThan(30);
+        final boolean v2Required = v2ReqdForSystem && v2ReqdForVendor;
         if (v2Required) {
-            Assert.assertTrue(getPackageManager().hasSystemFeature(
-                    PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
+            Assert.assertTrue("Devices launched at API 31+ with a vendor partition of API 31+ need "
+                    + "to support Incremental Delivery version 2 or higher",
+                    getPackageManager().hasSystemFeature(
+                        PackageManager.FEATURE_INCREMENTAL_DELIVERY, 2));
         }
     }
 
diff --git a/tests/tests/deviceconfig/OWNERS b/tests/tests/deviceconfig/OWNERS
index ac6ec2d..8553170 100644
--- a/tests/tests/deviceconfig/OWNERS
+++ b/tests/tests/deviceconfig/OWNERS
@@ -1,4 +1,4 @@
 # Bug component: 326016
-hongyiz@google.com
-shuc@google.com
+fdunlap@google.com
+jiewenlei@google.com
 svetoslavganov@google.com
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index a495285..7385be8 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -577,24 +577,25 @@
         Display.Mode[] modes = mDefaultDisplay.getSupportedModes();
         assumeTrue("Need two or more display modes to exercise switching.", modes.length > 1);
 
-        // Create a deterministically shuffled list of display modes, which ends with the
-        // current active mode. We'll switch to the modes in this order. The active mode is last
-        // so we don't need an extra mode switch in case the test completes successfully.
-        Display.Mode activeMode = mDefaultDisplay.getMode();
-        List<Display.Mode> modesList = new ArrayList<>(modes.length);
-        for (Display.Mode mode : modes) {
-            if (mode.getModeId() != activeMode.getModeId()) {
-                modesList.add(mode);
-            }
-        }
-        Random random = new Random(42);
-        Collections.shuffle(modesList, random);
-        modesList.add(activeMode);
-
         try {
             mDisplayManager.setShouldAlwaysRespectAppRequestedMode(true);
             assertTrue(mDisplayManager.shouldAlwaysRespectAppRequestedMode());
             final DisplayTestActivity activity = launchActivity(mRetainedDisplayTestActivity);
+
+            // Create a deterministically shuffled list of display modes, which ends with the
+            // current active mode. We'll switch to the modes in this order. The active mode is last
+            // so we don't need an extra mode switch in case the test completes successfully.
+            Display.Mode activeMode = mDefaultDisplay.getMode();
+            List<Display.Mode> modesList = new ArrayList<>(modes.length);
+            for (Display.Mode mode : modes) {
+                if (mode.getModeId() != activeMode.getModeId()) {
+                    modesList.add(mode);
+                }
+            }
+            Random random = new Random(42);
+            Collections.shuffle(modesList, random);
+            modesList.add(activeMode);
+
             for (Display.Mode mode : modesList) {
                 testSwitchToModeId(activity, mode);
             }
diff --git a/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java b/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
index 810aebc..b94877f 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SecurityModelFeatureTest.java
@@ -16,14 +16,15 @@
 
 package android.hardware.cts;
 
-import static android.os.Build.VERSION;
 import static android.os.Build.VERSION_CODES;
 
+import static com.android.compatibility.common.util.PropertyUtil.getFirstApiLevel;
+import static com.android.compatibility.common.util.PropertyUtil.getVendorApiLevel;
+
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
 import android.content.pm.PackageManager;
-import android.os.SystemProperties;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
@@ -47,8 +48,7 @@
 
     @Before
     public void setUp() throws Exception {
-        final int firstApiLevel =
-                SystemProperties.getInt("ro.product.first_api_level", VERSION.SDK_INT);
+        final int firstApiLevel = Math.min(getFirstApiLevel(), getVendorApiLevel());
         assumeTrue("Skipping test: it only applies to devices that first shipped with S or later.",
                    firstApiLevel >= VERSION_CODES.S);
 
diff --git a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
index f2f2a85..45b2683 100644
--- a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
+++ b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
@@ -49,16 +49,35 @@
 #endif
 
 static const std::string kSystemLibraryPath = "/system/" LIB_DIR;
-static const std::string kArtApexLibraryPath = "/apex/com.android.art/" LIB_DIR;
 static const std::string kVendorLibraryPath = "/vendor/" LIB_DIR;
 static const std::string kProductLibraryPath = "/product/" LIB_DIR;
 
+// APEX library paths to check for either presence or absence of public
+// libraries.
+static const std::vector<std::string> kApexLibraryPaths = {
+  "/apex/com.android.art/" LIB_DIR,
+  "/apex/com.android.i18n/" LIB_DIR,
+  "/apex/com.android.neuralnetworks/" LIB_DIR,
+  "/apex/com.android.runtime/" LIB_DIR,
+};
+
 static const std::vector<std::regex> kSystemPathRegexes = {
     std::regex("/system/lib(64)?"),
     std::regex("/apex/com\\.android\\.[^/]*/lib(64)?"),
     std::regex("/system/(lib/arm|lib64/arm64)"), // when CTS runs in ARM ABI on non-ARM CPU. http://b/149852946
 };
 
+// Full paths to libraries in system or APEX search paths that are not public
+// but still may or may not be possible to load in an app.
+static const std::vector<std::string> kOtherLoadableLibrariesInSearchPaths = {
+  // This library may be loaded using DF_1_GLOBAL into the global group in
+  // app_process, which is necessary to make it override some symbols in libc in
+  // all DSO's. As a side effect it also gets inherited into the classloader
+  // namespaces constructed in libnativeloader, and is hence possible to dlopen
+  // even though there is no linker namespace link for it.
+  "/apex/com.android.art/" LIB_DIR "/libsigchain.so",
+};
+
 static const std::string kWebViewPlatSupportLib = "libwebviewchromium_plat_support.so";
 
 static bool is_directory(const char* path) {
@@ -171,6 +190,24 @@
   return error;
 }
 
+static bool skip_subdir_load_check(const std::string& path) {
+  static bool vndk_lite = android::base::GetBoolProperty("ro.vndk.lite", false);
+  static const std::string system_vndk_dir = kSystemLibraryPath + "/vndk-sp-";
+  return vndk_lite && android::base::StartsWith(path, system_vndk_dir);
+}
+
+// Checks that a .so library can or cannot be loaded with dlopen() and
+// System.load(), as appropriate by the other settings:
+// -  clazz: The java class instance of android.jni.cts.LinkerNamespacesHelper,
+//    used for calling System.load() and System.loadLibrary().
+// -  path: Full path to the library to load.
+// -  library_search_paths: Directories that should be searched for public
+//    libraries. They should not be loaded from a subdirectory of these.
+// -  public_library_basenames: File names without paths of expected public
+//    libraries.
+// -  test_system_load_library: Try loading with System.loadLibrary() as well.
+// -  check_absence: Raise an error if it is a non-public library but still is
+//    loaded successfully from a searched directory.
 static bool check_lib(JNIEnv* env,
                       jclass clazz,
                       const std::string& path,
@@ -210,7 +247,7 @@
         return false;
       }
     } else {  // !is_in_search_path
-      if (loaded) {
+      if (loaded && !skip_subdir_load_check(path)) {
         errors->push_back("The library \"" + path +
                           "\" is a public library that was loaded from a subdirectory.");
         return false;
@@ -220,7 +257,10 @@
     // If the library loaded successfully but is in a subdirectory then it is
     // still not public. That is the case e.g. for
     // /apex/com.android.runtime/lib{,64}/bionic/lib*.so.
-    if (loaded && is_in_search_path && check_absence) {
+    if (loaded && is_in_search_path && check_absence &&
+        (std::find(kOtherLoadableLibrariesInSearchPaths.begin(),
+                   kOtherLoadableLibrariesInSearchPaths.end(), path) ==
+         kOtherLoadableLibrariesInSearchPaths.end())) {
       errors->push_back("The library \"" + path + "\" is not a public library but it loaded.");
       return false;
     }
@@ -234,6 +274,7 @@
   return true;
 }
 
+// Calls check_lib for every file found recursively within library_path.
 static bool check_path(JNIEnv* env,
                        jclass clazz,
                        const std::string& library_path,
@@ -279,8 +320,8 @@
 static bool jobject_array_to_set(JNIEnv* env,
                                  jobjectArray java_libraries_array,
                                  std::unordered_set<std::string>* libraries,
-                                 std::string* error_msg) {
-  error_msg->clear();
+                                 std::string* error_msgs) {
+  error_msgs->clear();
   size_t size = env->GetArrayLength(java_libraries_array);
   bool success = true;
   for (size_t i = 0; i<size; ++i) {
@@ -290,7 +331,7 @@
 
     // Verify that the name doesn't contain any directory components.
     if (soname.rfind('/') != std::string::npos) {
-      *error_msg += "\n---Illegal value, no directories allowed: " + soname;
+      *error_msgs += "\n---Illegal value, no directories allowed: " + soname;
       continue;
     }
 
@@ -300,7 +341,7 @@
     if (space_pos != std::string::npos) {
       std::string type = soname.substr(space_pos + 1);
       if (type != "32" && type != "64") {
-        *error_msg += "\n---Illegal value at end of line (only 32 or 64 allowed): " + soname;
+        *error_msgs += "\n---Illegal value at end of line (only 32 or 64 allowed): " + soname;
         success = false;
         continue;
       }
@@ -332,21 +373,21 @@
         JNIEnv* env,
         jclass clazz,
         jobjectArray java_system_public_libraries,
-        jobjectArray java_runtime_public_libraries) {
+        jobjectArray java_apex_public_libraries) {
   bool success = true;
   std::vector<std::string> errors;
-  std::string error_msg;
+  std::string error_msgs;
   std::unordered_set<std::string> system_public_libraries;
   if (!jobject_array_to_set(env, java_system_public_libraries, &system_public_libraries,
-                            &error_msg)) {
+                            &error_msgs)) {
     success = false;
-    errors.push_back("Errors in system public library file:" + error_msg);
+    errors.push_back("Errors in system public library list:" + error_msgs);
   }
-  std::unordered_set<std::string> runtime_public_libraries;
-  if (!jobject_array_to_set(env, java_runtime_public_libraries, &runtime_public_libraries,
-                            &error_msg)) {
+  std::unordered_set<std::string> apex_public_libraries;
+  if (!jobject_array_to_set(env, java_apex_public_libraries, &apex_public_libraries,
+                            &error_msgs)) {
     success = false;
-    errors.push_back("Errors in runtime public library file:" + error_msg);
+    errors.push_back("Errors in APEX public library list:" + error_msgs);
   }
 
   // Check the system libraries.
@@ -362,8 +403,8 @@
   // /apex/com.android.*/lib*.
   std::unordered_set<std::string> system_library_search_paths;
 
-  for (const auto& path : library_search_paths) {
-    for (const auto& regex : kSystemPathRegexes) {
+  for (const std::string& path : library_search_paths) {
+    for (const std::regex& regex : kSystemPathRegexes) {
       if (std::regex_match(path, regex)) {
         system_library_search_paths.insert(path);
         break;
@@ -374,7 +415,7 @@
   // These paths should be tested too - this is because apps may rely on some
   // libraries being available there.
   system_library_search_paths.insert(kSystemLibraryPath);
-  system_library_search_paths.insert(kArtApexLibraryPath);
+  system_library_search_paths.insert(kApexLibraryPaths.begin(), kApexLibraryPaths.end());
 
   if (!check_path(env, clazz, kSystemLibraryPath, system_library_search_paths,
                   system_public_libraries,
@@ -387,17 +428,19 @@
   // don't complain about that in that case.
   bool check_absence = !android::base::GetBoolProperty("ro.vndk.lite", false);
 
-  // Check the runtime libraries.
-  if (!check_path(env, clazz, kArtApexLibraryPath, {kArtApexLibraryPath},
-                  runtime_public_libraries,
-                  /*test_system_load_library=*/true,
-                  check_absence, &errors)) {
-    success = false;
+  // Check the APEX libraries.
+  for (const std::string& apex_path : kApexLibraryPaths) {
+    if (!check_path(env, clazz, apex_path, {apex_path},
+                    apex_public_libraries,
+                    /*test_system_load_library=*/true,
+                    check_absence, &errors)) {
+      success = false;
+    }
   }
 
   if (!success) {
     std::string error_str;
-    for (const auto& line : errors) {
+    for (const std::string& line : errors) {
       error_str += line + '\n';
     }
     return env->NewStringUTF(error_str.c_str());
diff --git a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
index 796fbd8..1f4f351 100644
--- a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
+++ b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
@@ -63,7 +63,6 @@
         "libmediandk.so",
         "libm.so",
         "libnativewindow.so",
-        "libneuralnetworks.so",
         "libOpenMAXAL.so",
         "libOpenSLES.so",
         "libRS.so",
@@ -78,12 +77,16 @@
       "libclang_rt.hwasan-aarch64-android.so"
     };
 
-    // Libraries listed in public.libraries.android.txt, located in /apex/com.android.art/${LIB}
-    private final static String[] PUBLIC_ART_LIBRARIES = {
+    // Libraries listed in public.libraries.android.txt that are located in APEXes
+    private final static String[] PUBLIC_APEX_LIBRARIES = {
+        // Libraries in /apex/com.android.i18n/${LIB}
+        "libicu.so",
         "libicui18n.so",
         "libicuuc.so",
+        // Libraries in /apex/com.android.art/${LIB}
         "libnativehelper.so",
-        "libsigchain.so"
+        // Libraries in /apex/com.android.neuralnetworks/${LIB}
+        "libneuralnetworks.so",
     };
 
     // The grey-list.
@@ -185,13 +188,13 @@
 
     public static String runAccessibilityTest() throws IOException {
         List<String> systemLibs = new ArrayList<>();
-        List<String> artApexLibs = new ArrayList<>();
+        List<String> apexLibs = new ArrayList<>();
 
         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);
+            Collections.addAll(systemLibs, PUBLIC_APEX_LIBRARIES);
         }
 
         if (InstrumentationRegistry.getContext().getPackageManager().
@@ -199,7 +202,7 @@
             systemLibs.add(WEBVIEW_PLAT_SUPPORT_LIB);
         }
 
-        Collections.addAll(artApexLibs, PUBLIC_ART_LIBRARIES);
+        Collections.addAll(apexLibs, PUBLIC_APEX_LIBRARIES);
 
         // Check if /system/etc/public.libraries-company.txt and /product/etc/public.libraries
         // -company.txt files are well-formed. The libraries however are not loaded for test;
@@ -232,11 +235,11 @@
         }
 
         return runAccessibilityTestImpl(systemLibs.toArray(new String[systemLibs.size()]),
-                                        artApexLibs.toArray(new String[artApexLibs.size()]));
+                                        apexLibs.toArray(new String[apexLibs.size()]));
     }
 
     private static native String runAccessibilityTestImpl(String[] publicSystemLibs,
-                                                          String[] publicRuntimeLibs);
+                                                          String[] publicApexLibs);
 
     private static void invokeIncrementGlobal(Class<?> clazz) throws Exception {
         clazz.getMethod("incrementGlobal").invoke(null);
@@ -385,7 +388,7 @@
         String error = null;
         List<String> publicLibs = new ArrayList<>();
         Collections.addAll(publicLibs, PUBLIC_SYSTEM_LIBRARIES);
-        Collections.addAll(publicLibs, PUBLIC_ART_LIBRARIES);
+        Collections.addAll(publicLibs, PUBLIC_APEX_LIBRARIES);
         for (String lib : publicLibs) {
             String result = LinkerNamespacesHelper.tryDlopen(lib);
             if (result != null) {
diff --git a/tests/tests/keystore/src/android/keystore/cts/CipherTest.java b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
index b56c7bf..562910b 100644
--- a/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
@@ -298,7 +298,6 @@
         public void performDeviceUnlock() throws Exception {
             mLockCredential.gotoKeyguard();
             UiDeviceUtils.pressUnlockButton();
-            SystemClock.sleep(200);
             mLockCredential.enterAndConfirmLockCredential();
             launchHomeActivity();
             KeyguardManager keyguardManager = (KeyguardManager)getContext().getSystemService(
diff --git a/tests/tests/media/Android.bp b/tests/tests/media/Android.bp
index f1248d8..c88882b 100644
--- a/tests/tests/media/Android.bp
+++ b/tests/tests/media/Android.bp
@@ -26,13 +26,13 @@
 java_library {
     name: "ctsmediautil",
     srcs: [
-        "src/android/media/cts/CodecImage.java",
-        "src/android/media/cts/YUVImage.java",
-        "src/android/media/cts/CodecUtils.java",
-        "src/android/media/cts/CodecState.java",
-        "src/android/media/cts/MediaCodecTunneledPlayer.java",
-        "src/android/media/cts/MediaTimeProvider.java",
-        "src/android/media/cts/NonBlockingAudioTrack.java",
+        "common/src/android/media/cts/CodecImage.java",
+        "common/src/android/media/cts/YUVImage.java",
+        "common/src/android/media/cts/CodecUtils.java",
+        "common/src/android/media/cts/CodecState.java",
+        "common/src/android/media/cts/MediaCodecTunneledPlayer.java",
+        "common/src/android/media/cts/MediaTimeProvider.java",
+        "common/src/android/media/cts/NonBlockingAudioTrack.java",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -54,33 +54,9 @@
 }
 
 android_library {
-    name: "cts-media-drm-common",
+    name: "cts-media-common",
     srcs: [
-        "src/android/media/cts/AudioHelper.java",
-        "src/android/media/cts/AudioManagerStub.java",
-        "src/android/media/cts/AudioManagerStubHelper.java",
-        "src/android/media/cts/AudioRecordNative.java",
-        "src/android/media/cts/AudioTrackNative.java",
-        "src/android/media/cts/CodecState.java",
-        "src/android/media/cts/ConnectionStatus.java",
-        "src/android/media/cts/IConnectionStatus.java",
-        "src/android/media/cts/InputSurface.java",
-        "src/android/media/cts/InputSurfaceInterface.java",
-        "src/android/media/cts/MediaCodecBlockModelHelper.java",
-        "src/android/media/cts/MediaCodecClearKeyPlayer.java",
-        "src/android/media/cts/MediaCodecPlayerTestBase.java",
-        "src/android/media/cts/MediaCodecWrapper.java",
-        "src/android/media/cts/MediaTimeProvider.java",
-        "src/android/media/cts/MediaStubActivity.java",
-        "src/android/media/cts/NdkInputSurface.java",
-        "src/android/media/cts/NdkMediaCodec.java",
-        "src/android/media/cts/NonBlockingAudioTrack.java",
-        "src/android/media/cts/NonMediaMainlineTest.java",
-        "src/android/media/cts/OutputSurface.java",
-        "src/android/media/cts/Preconditions.java",
-        "src/android/media/cts/TestMediaDataSource.java",
-        "src/android/media/cts/TestUtils.java",
-        "src/android/media/cts/TextureRender.java",
+        "common/src/**/*.java",
     ],
     static_libs: [
         "androidx.heifwriter_heifwriter",
@@ -114,7 +90,7 @@
         "ctstestrunner-axt",
         "hamcrest-library",
         "ctstestserver",
-        "cts-media-drm-common",
+        "cts-media-common",
         "cts-media-res-lib",
         "junit",
         "junit-params",
diff --git a/tests/tests/media/assets/audio_only/00.aac b/tests/tests/media/assets/audio_only/00.aac
deleted file mode 100644
index 1c620bf..0000000
--- a/tests/tests/media/assets/audio_only/00.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/00.key b/tests/tests/media/assets/audio_only/00.key
deleted file mode 100644
index eb61918..0000000
--- a/tests/tests/media/assets/audio_only/00.key
+++ /dev/null
@@ -1 +0,0 @@
-ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/audio_only/01.aac b/tests/tests/media/assets/audio_only/01.aac
deleted file mode 100644
index dc23c48..0000000
--- a/tests/tests/media/assets/audio_only/01.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/02.aac b/tests/tests/media/assets/audio_only/02.aac
deleted file mode 100644
index 1dd827d..0000000
--- a/tests/tests/media/assets/audio_only/02.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/03.aac b/tests/tests/media/assets/audio_only/03.aac
deleted file mode 100644
index f6fd0c0..0000000
--- a/tests/tests/media/assets/audio_only/03.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/04.aac b/tests/tests/media/assets/audio_only/04.aac
deleted file mode 100644
index 60d0aef..0000000
--- a/tests/tests/media/assets/audio_only/04.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/05.aac b/tests/tests/media/assets/audio_only/05.aac
deleted file mode 100644
index 2875292..0000000
--- a/tests/tests/media/assets/audio_only/05.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/06.aac b/tests/tests/media/assets/audio_only/06.aac
deleted file mode 100644
index dd0413f..0000000
--- a/tests/tests/media/assets/audio_only/06.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/07.aac b/tests/tests/media/assets/audio_only/07.aac
deleted file mode 100644
index 5d63cef..0000000
--- a/tests/tests/media/assets/audio_only/07.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/08.aac b/tests/tests/media/assets/audio_only/08.aac
deleted file mode 100644
index 402cd72..0000000
--- a/tests/tests/media/assets/audio_only/08.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/09.aac b/tests/tests/media/assets/audio_only/09.aac
deleted file mode 100644
index 587b910..0000000
--- a/tests/tests/media/assets/audio_only/09.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/10.aac b/tests/tests/media/assets/audio_only/10.aac
deleted file mode 100644
index db8c5b8..0000000
--- a/tests/tests/media/assets/audio_only/10.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/11.aac b/tests/tests/media/assets/audio_only/11.aac
deleted file mode 100644
index 707dd38..0000000
--- a/tests/tests/media/assets/audio_only/11.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/12.aac b/tests/tests/media/assets/audio_only/12.aac
deleted file mode 100644
index 5ebe080..0000000
--- a/tests/tests/media/assets/audio_only/12.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/audio_only/index.m3u8 b/tests/tests/media/assets/audio_only/index.m3u8
deleted file mode 100644
index fedfafa..0000000
--- a/tests/tests/media/assets/audio_only/index.m3u8
+++ /dev/null
@@ -1,31 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-VERSION:5
-#EXT-X-TARGETDURATION:10
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x76fb8e8c870c8f95234d6c40aac52902
-#EXTINF:9.984,
-00.aac
-#EXTINF:9.984,
-01.aac
-#EXTINF:9.984,
-02.aac
-#EXTINF:9.984,
-03.aac
-#EXTINF:9.984,
-04.aac
-#EXTINF:9.984,
-05.aac
-#EXTINF:9.984,
-06.aac
-#EXTINF:9.984,
-07.aac
-#EXTINF:9.984,
-08.aac
-#EXTINF:9.984,
-09.aac
-#EXTINF:9.984,
-10.aac
-#EXTINF:9.984,
-11.aac
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/fileSequence0.ts b/tests/tests/media/assets/fileSequence0.ts
deleted file mode 100644
index 48f2bcd..0000000
--- a/tests/tests/media/assets/fileSequence0.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/fileSequence1.ts b/tests/tests/media/assets/fileSequence1.ts
deleted file mode 100644
index 737fbd0..0000000
--- a/tests/tests/media/assets/fileSequence1.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls.m3u8 b/tests/tests/media/assets/hls.m3u8
deleted file mode 100644
index 127574a..0000000
--- a/tests/tests/media/assets/hls.m3u8
+++ /dev/null
@@ -1,8 +0,0 @@
-#EXTM3U
-#EXT-X-TARGETDURATION:10
-#EXT-X-MEDIA-SEQUENCE:0
-#EXTINF:10, no desc
-segment000000.ts
-#EXTINF:10, no desc
-segment000001.ts
-#EXT-X-ENDLIST
diff --git a/tests/tests/media/assets/hls_variant/165340/00.ts b/tests/tests/media/assets/hls_variant/165340/00.ts
deleted file mode 100644
index 8a95fc5..0000000
--- a/tests/tests/media/assets/hls_variant/165340/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/01.ts b/tests/tests/media/assets/hls_variant/165340/01.ts
deleted file mode 100644
index 7983a01..0000000
--- a/tests/tests/media/assets/hls_variant/165340/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/02.ts b/tests/tests/media/assets/hls_variant/165340/02.ts
deleted file mode 100644
index 2582937..0000000
--- a/tests/tests/media/assets/hls_variant/165340/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/03.ts b/tests/tests/media/assets/hls_variant/165340/03.ts
deleted file mode 100644
index 4e4711e..0000000
--- a/tests/tests/media/assets/hls_variant/165340/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/04.ts b/tests/tests/media/assets/hls_variant/165340/04.ts
deleted file mode 100644
index e210aac..0000000
--- a/tests/tests/media/assets/hls_variant/165340/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/05.ts b/tests/tests/media/assets/hls_variant/165340/05.ts
deleted file mode 100644
index 5d445bf..0000000
--- a/tests/tests/media/assets/hls_variant/165340/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/06.ts b/tests/tests/media/assets/hls_variant/165340/06.ts
deleted file mode 100644
index e83d2a3..0000000
--- a/tests/tests/media/assets/hls_variant/165340/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/07.ts b/tests/tests/media/assets/hls_variant/165340/07.ts
deleted file mode 100644
index 37322c0..0000000
--- a/tests/tests/media/assets/hls_variant/165340/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/08.ts b/tests/tests/media/assets/hls_variant/165340/08.ts
deleted file mode 100644
index 25f9f00..0000000
--- a/tests/tests/media/assets/hls_variant/165340/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/09.ts b/tests/tests/media/assets/hls_variant/165340/09.ts
deleted file mode 100644
index 2debe48..0000000
--- a/tests/tests/media/assets/hls_variant/165340/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/10.ts b/tests/tests/media/assets/hls_variant/165340/10.ts
deleted file mode 100644
index 3eed736..0000000
--- a/tests/tests/media/assets/hls_variant/165340/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/11.ts b/tests/tests/media/assets/hls_variant/165340/11.ts
deleted file mode 100644
index 7ae79e9..0000000
--- a/tests/tests/media/assets/hls_variant/165340/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/12.ts b/tests/tests/media/assets/hls_variant/165340/12.ts
deleted file mode 100644
index 4153626..0000000
--- a/tests/tests/media/assets/hls_variant/165340/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/13.ts b/tests/tests/media/assets/hls_variant/165340/13.ts
deleted file mode 100644
index 027adf4..0000000
--- a/tests/tests/media/assets/hls_variant/165340/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/14.ts b/tests/tests/media/assets/hls_variant/165340/14.ts
deleted file mode 100644
index ea7d0be..0000000
--- a/tests/tests/media/assets/hls_variant/165340/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/15.ts b/tests/tests/media/assets/hls_variant/165340/15.ts
deleted file mode 100644
index 48c92c9..0000000
--- a/tests/tests/media/assets/hls_variant/165340/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/16.ts b/tests/tests/media/assets/hls_variant/165340/16.ts
deleted file mode 100644
index 19f0ebd..0000000
--- a/tests/tests/media/assets/hls_variant/165340/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/17.ts b/tests/tests/media/assets/hls_variant/165340/17.ts
deleted file mode 100644
index 7d4897d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/18.ts b/tests/tests/media/assets/hls_variant/165340/18.ts
deleted file mode 100644
index 47431d0..0000000
--- a/tests/tests/media/assets/hls_variant/165340/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/19.ts b/tests/tests/media/assets/hls_variant/165340/19.ts
deleted file mode 100644
index 9e98a4f..0000000
--- a/tests/tests/media/assets/hls_variant/165340/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/20.ts b/tests/tests/media/assets/hls_variant/165340/20.ts
deleted file mode 100644
index e674296..0000000
--- a/tests/tests/media/assets/hls_variant/165340/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/21.ts b/tests/tests/media/assets/hls_variant/165340/21.ts
deleted file mode 100644
index 2affe9d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/22.ts b/tests/tests/media/assets/hls_variant/165340/22.ts
deleted file mode 100644
index 0634296..0000000
--- a/tests/tests/media/assets/hls_variant/165340/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/23.ts b/tests/tests/media/assets/hls_variant/165340/23.ts
deleted file mode 100644
index faf9ca8..0000000
--- a/tests/tests/media/assets/hls_variant/165340/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/24.ts b/tests/tests/media/assets/hls_variant/165340/24.ts
deleted file mode 100644
index 3b3f4d7..0000000
--- a/tests/tests/media/assets/hls_variant/165340/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/165340/index.m3u8 b/tests/tests/media/assets/hls_variant/165340/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/165340/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/1676816/00.ts b/tests/tests/media/assets/hls_variant/1676816/00.ts
deleted file mode 100644
index aba6f79..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/01.ts b/tests/tests/media/assets/hls_variant/1676816/01.ts
deleted file mode 100644
index 18c382b..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/02.ts b/tests/tests/media/assets/hls_variant/1676816/02.ts
deleted file mode 100644
index 8b45649..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/03.ts b/tests/tests/media/assets/hls_variant/1676816/03.ts
deleted file mode 100644
index 5a1dee6..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/04.ts b/tests/tests/media/assets/hls_variant/1676816/04.ts
deleted file mode 100644
index 69c4dfa..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/05.ts b/tests/tests/media/assets/hls_variant/1676816/05.ts
deleted file mode 100644
index bd1e938..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/06.ts b/tests/tests/media/assets/hls_variant/1676816/06.ts
deleted file mode 100644
index dfdfe31..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/07.ts b/tests/tests/media/assets/hls_variant/1676816/07.ts
deleted file mode 100644
index be22e90..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/08.ts b/tests/tests/media/assets/hls_variant/1676816/08.ts
deleted file mode 100644
index a892318..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/09.ts b/tests/tests/media/assets/hls_variant/1676816/09.ts
deleted file mode 100644
index 9a1e3c9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/10.ts b/tests/tests/media/assets/hls_variant/1676816/10.ts
deleted file mode 100644
index 528e424..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/11.ts b/tests/tests/media/assets/hls_variant/1676816/11.ts
deleted file mode 100644
index 2ad52f9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/12.ts b/tests/tests/media/assets/hls_variant/1676816/12.ts
deleted file mode 100644
index 5275b47..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/13.ts b/tests/tests/media/assets/hls_variant/1676816/13.ts
deleted file mode 100644
index 5894d31..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/14.ts b/tests/tests/media/assets/hls_variant/1676816/14.ts
deleted file mode 100644
index 44f5200..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/15.ts b/tests/tests/media/assets/hls_variant/1676816/15.ts
deleted file mode 100644
index e548fb18..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/16.ts b/tests/tests/media/assets/hls_variant/1676816/16.ts
deleted file mode 100644
index 9ad2c6a..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/17.ts b/tests/tests/media/assets/hls_variant/1676816/17.ts
deleted file mode 100644
index 1cd735f..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/18.ts b/tests/tests/media/assets/hls_variant/1676816/18.ts
deleted file mode 100644
index a593dba..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/19.ts b/tests/tests/media/assets/hls_variant/1676816/19.ts
deleted file mode 100644
index 3fb49cb..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/20.ts b/tests/tests/media/assets/hls_variant/1676816/20.ts
deleted file mode 100644
index 7a586e7..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/21.ts b/tests/tests/media/assets/hls_variant/1676816/21.ts
deleted file mode 100644
index bd70554..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/22.ts b/tests/tests/media/assets/hls_variant/1676816/22.ts
deleted file mode 100644
index 12ea80d..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/23.ts b/tests/tests/media/assets/hls_variant/1676816/23.ts
deleted file mode 100644
index c1b5be9..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/24.ts b/tests/tests/media/assets/hls_variant/1676816/24.ts
deleted file mode 100644
index 76bd0b5..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/1676816/index.m3u8 b/tests/tests/media/assets/hls_variant/1676816/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/1676816/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/344388/00.ts b/tests/tests/media/assets/hls_variant/344388/00.ts
deleted file mode 100644
index e26ad20..0000000
--- a/tests/tests/media/assets/hls_variant/344388/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/01.ts b/tests/tests/media/assets/hls_variant/344388/01.ts
deleted file mode 100644
index fa5395d..0000000
--- a/tests/tests/media/assets/hls_variant/344388/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/02.ts b/tests/tests/media/assets/hls_variant/344388/02.ts
deleted file mode 100644
index a924b05..0000000
--- a/tests/tests/media/assets/hls_variant/344388/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/03.ts b/tests/tests/media/assets/hls_variant/344388/03.ts
deleted file mode 100644
index 4136491..0000000
--- a/tests/tests/media/assets/hls_variant/344388/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/04.ts b/tests/tests/media/assets/hls_variant/344388/04.ts
deleted file mode 100644
index cf03032..0000000
--- a/tests/tests/media/assets/hls_variant/344388/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/05.ts b/tests/tests/media/assets/hls_variant/344388/05.ts
deleted file mode 100644
index 25d127b..0000000
--- a/tests/tests/media/assets/hls_variant/344388/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/06.ts b/tests/tests/media/assets/hls_variant/344388/06.ts
deleted file mode 100644
index f132be4..0000000
--- a/tests/tests/media/assets/hls_variant/344388/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/07.ts b/tests/tests/media/assets/hls_variant/344388/07.ts
deleted file mode 100644
index b1e7f36..0000000
--- a/tests/tests/media/assets/hls_variant/344388/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/08.ts b/tests/tests/media/assets/hls_variant/344388/08.ts
deleted file mode 100644
index bbeb4fd..0000000
--- a/tests/tests/media/assets/hls_variant/344388/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/09.ts b/tests/tests/media/assets/hls_variant/344388/09.ts
deleted file mode 100644
index f444ab9..0000000
--- a/tests/tests/media/assets/hls_variant/344388/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/10.ts b/tests/tests/media/assets/hls_variant/344388/10.ts
deleted file mode 100644
index 910dd43..0000000
--- a/tests/tests/media/assets/hls_variant/344388/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/11.ts b/tests/tests/media/assets/hls_variant/344388/11.ts
deleted file mode 100644
index 892a6b3..0000000
--- a/tests/tests/media/assets/hls_variant/344388/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/12.ts b/tests/tests/media/assets/hls_variant/344388/12.ts
deleted file mode 100644
index 2a8bfeb..0000000
--- a/tests/tests/media/assets/hls_variant/344388/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/13.ts b/tests/tests/media/assets/hls_variant/344388/13.ts
deleted file mode 100644
index bf9f1a4..0000000
--- a/tests/tests/media/assets/hls_variant/344388/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/14.ts b/tests/tests/media/assets/hls_variant/344388/14.ts
deleted file mode 100644
index 45c604c..0000000
--- a/tests/tests/media/assets/hls_variant/344388/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/15.ts b/tests/tests/media/assets/hls_variant/344388/15.ts
deleted file mode 100644
index 4d5de4f..0000000
--- a/tests/tests/media/assets/hls_variant/344388/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/16.ts b/tests/tests/media/assets/hls_variant/344388/16.ts
deleted file mode 100644
index 9551838..0000000
--- a/tests/tests/media/assets/hls_variant/344388/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/17.ts b/tests/tests/media/assets/hls_variant/344388/17.ts
deleted file mode 100644
index dde4452..0000000
--- a/tests/tests/media/assets/hls_variant/344388/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/18.ts b/tests/tests/media/assets/hls_variant/344388/18.ts
deleted file mode 100644
index c7b3919..0000000
--- a/tests/tests/media/assets/hls_variant/344388/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/19.ts b/tests/tests/media/assets/hls_variant/344388/19.ts
deleted file mode 100644
index 5aa3c84..0000000
--- a/tests/tests/media/assets/hls_variant/344388/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/20.ts b/tests/tests/media/assets/hls_variant/344388/20.ts
deleted file mode 100644
index 0d509bb..0000000
--- a/tests/tests/media/assets/hls_variant/344388/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/21.ts b/tests/tests/media/assets/hls_variant/344388/21.ts
deleted file mode 100644
index 252a953..0000000
--- a/tests/tests/media/assets/hls_variant/344388/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/22.ts b/tests/tests/media/assets/hls_variant/344388/22.ts
deleted file mode 100644
index 7098fdd..0000000
--- a/tests/tests/media/assets/hls_variant/344388/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/23.ts b/tests/tests/media/assets/hls_variant/344388/23.ts
deleted file mode 100644
index 69bd886..0000000
--- a/tests/tests/media/assets/hls_variant/344388/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/24.ts b/tests/tests/media/assets/hls_variant/344388/24.ts
deleted file mode 100644
index 0542cc2..0000000
--- a/tests/tests/media/assets/hls_variant/344388/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/344388/index.m3u8 b/tests/tests/media/assets/hls_variant/344388/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/344388/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/387360/00.ts b/tests/tests/media/assets/hls_variant/387360/00.ts
deleted file mode 100644
index c7233c2..0000000
--- a/tests/tests/media/assets/hls_variant/387360/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/01.ts b/tests/tests/media/assets/hls_variant/387360/01.ts
deleted file mode 100644
index 4d092dd..0000000
--- a/tests/tests/media/assets/hls_variant/387360/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/02.ts b/tests/tests/media/assets/hls_variant/387360/02.ts
deleted file mode 100644
index 5b0322e..0000000
--- a/tests/tests/media/assets/hls_variant/387360/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/03.ts b/tests/tests/media/assets/hls_variant/387360/03.ts
deleted file mode 100644
index 5081ef0..0000000
--- a/tests/tests/media/assets/hls_variant/387360/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/04.ts b/tests/tests/media/assets/hls_variant/387360/04.ts
deleted file mode 100644
index 0f6f0fe..0000000
--- a/tests/tests/media/assets/hls_variant/387360/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/05.ts b/tests/tests/media/assets/hls_variant/387360/05.ts
deleted file mode 100644
index e455dec..0000000
--- a/tests/tests/media/assets/hls_variant/387360/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/06.ts b/tests/tests/media/assets/hls_variant/387360/06.ts
deleted file mode 100644
index 14afcb9d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/07.ts b/tests/tests/media/assets/hls_variant/387360/07.ts
deleted file mode 100644
index 6f23d02..0000000
--- a/tests/tests/media/assets/hls_variant/387360/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/08.ts b/tests/tests/media/assets/hls_variant/387360/08.ts
deleted file mode 100644
index a3d8dfd..0000000
--- a/tests/tests/media/assets/hls_variant/387360/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/09.ts b/tests/tests/media/assets/hls_variant/387360/09.ts
deleted file mode 100644
index 87d6de1..0000000
--- a/tests/tests/media/assets/hls_variant/387360/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/10.ts b/tests/tests/media/assets/hls_variant/387360/10.ts
deleted file mode 100644
index 04ab37a..0000000
--- a/tests/tests/media/assets/hls_variant/387360/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/11.ts b/tests/tests/media/assets/hls_variant/387360/11.ts
deleted file mode 100644
index 1fa238b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/12.ts b/tests/tests/media/assets/hls_variant/387360/12.ts
deleted file mode 100644
index 445b0b9..0000000
--- a/tests/tests/media/assets/hls_variant/387360/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/13.ts b/tests/tests/media/assets/hls_variant/387360/13.ts
deleted file mode 100644
index 6bcd81b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/14.ts b/tests/tests/media/assets/hls_variant/387360/14.ts
deleted file mode 100644
index f3f8e78..0000000
--- a/tests/tests/media/assets/hls_variant/387360/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/15.ts b/tests/tests/media/assets/hls_variant/387360/15.ts
deleted file mode 100644
index 6b12e72..0000000
--- a/tests/tests/media/assets/hls_variant/387360/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/16.ts b/tests/tests/media/assets/hls_variant/387360/16.ts
deleted file mode 100644
index d95eeba..0000000
--- a/tests/tests/media/assets/hls_variant/387360/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/17.ts b/tests/tests/media/assets/hls_variant/387360/17.ts
deleted file mode 100644
index 141ae44..0000000
--- a/tests/tests/media/assets/hls_variant/387360/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/18.ts b/tests/tests/media/assets/hls_variant/387360/18.ts
deleted file mode 100644
index fc52f1d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/19.ts b/tests/tests/media/assets/hls_variant/387360/19.ts
deleted file mode 100644
index 077db9b..0000000
--- a/tests/tests/media/assets/hls_variant/387360/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/20.ts b/tests/tests/media/assets/hls_variant/387360/20.ts
deleted file mode 100644
index 4ffb301..0000000
--- a/tests/tests/media/assets/hls_variant/387360/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/21.ts b/tests/tests/media/assets/hls_variant/387360/21.ts
deleted file mode 100644
index 6072368..0000000
--- a/tests/tests/media/assets/hls_variant/387360/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/22.ts b/tests/tests/media/assets/hls_variant/387360/22.ts
deleted file mode 100644
index 5edc055..0000000
--- a/tests/tests/media/assets/hls_variant/387360/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/23.ts b/tests/tests/media/assets/hls_variant/387360/23.ts
deleted file mode 100644
index 7870e39..0000000
--- a/tests/tests/media/assets/hls_variant/387360/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/24.ts b/tests/tests/media/assets/hls_variant/387360/24.ts
deleted file mode 100644
index f4fc858..0000000
--- a/tests/tests/media/assets/hls_variant/387360/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/387360/index.m3u8 b/tests/tests/media/assets/hls_variant/387360/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/387360/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/765178/00.ts b/tests/tests/media/assets/hls_variant/765178/00.ts
deleted file mode 100644
index c544131..0000000
--- a/tests/tests/media/assets/hls_variant/765178/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/01.ts b/tests/tests/media/assets/hls_variant/765178/01.ts
deleted file mode 100644
index 11adb7a..0000000
--- a/tests/tests/media/assets/hls_variant/765178/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/02.ts b/tests/tests/media/assets/hls_variant/765178/02.ts
deleted file mode 100644
index d5300f4..0000000
--- a/tests/tests/media/assets/hls_variant/765178/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/03.ts b/tests/tests/media/assets/hls_variant/765178/03.ts
deleted file mode 100644
index 8a3ce79..0000000
--- a/tests/tests/media/assets/hls_variant/765178/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/04.ts b/tests/tests/media/assets/hls_variant/765178/04.ts
deleted file mode 100644
index 94b1ced..0000000
--- a/tests/tests/media/assets/hls_variant/765178/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/05.ts b/tests/tests/media/assets/hls_variant/765178/05.ts
deleted file mode 100644
index d44d4a6..0000000
--- a/tests/tests/media/assets/hls_variant/765178/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/06.ts b/tests/tests/media/assets/hls_variant/765178/06.ts
deleted file mode 100644
index 52455dd..0000000
--- a/tests/tests/media/assets/hls_variant/765178/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/07.ts b/tests/tests/media/assets/hls_variant/765178/07.ts
deleted file mode 100644
index cea2858..0000000
--- a/tests/tests/media/assets/hls_variant/765178/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/08.ts b/tests/tests/media/assets/hls_variant/765178/08.ts
deleted file mode 100644
index 79a1ef1..0000000
--- a/tests/tests/media/assets/hls_variant/765178/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/09.ts b/tests/tests/media/assets/hls_variant/765178/09.ts
deleted file mode 100644
index 6e987f2..0000000
--- a/tests/tests/media/assets/hls_variant/765178/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/10.ts b/tests/tests/media/assets/hls_variant/765178/10.ts
deleted file mode 100644
index c5f1af4..0000000
--- a/tests/tests/media/assets/hls_variant/765178/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/11.ts b/tests/tests/media/assets/hls_variant/765178/11.ts
deleted file mode 100644
index 1a96c19..0000000
--- a/tests/tests/media/assets/hls_variant/765178/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/12.ts b/tests/tests/media/assets/hls_variant/765178/12.ts
deleted file mode 100644
index b6095bb..0000000
--- a/tests/tests/media/assets/hls_variant/765178/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/13.ts b/tests/tests/media/assets/hls_variant/765178/13.ts
deleted file mode 100644
index b91b740..0000000
--- a/tests/tests/media/assets/hls_variant/765178/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/14.ts b/tests/tests/media/assets/hls_variant/765178/14.ts
deleted file mode 100644
index d033f16..0000000
--- a/tests/tests/media/assets/hls_variant/765178/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/15.ts b/tests/tests/media/assets/hls_variant/765178/15.ts
deleted file mode 100644
index f294842..0000000
--- a/tests/tests/media/assets/hls_variant/765178/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/16.ts b/tests/tests/media/assets/hls_variant/765178/16.ts
deleted file mode 100644
index 15a9e9e..0000000
--- a/tests/tests/media/assets/hls_variant/765178/16.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/17.ts b/tests/tests/media/assets/hls_variant/765178/17.ts
deleted file mode 100644
index e024ce0..0000000
--- a/tests/tests/media/assets/hls_variant/765178/17.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/18.ts b/tests/tests/media/assets/hls_variant/765178/18.ts
deleted file mode 100644
index 9e7fea2..0000000
--- a/tests/tests/media/assets/hls_variant/765178/18.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/19.ts b/tests/tests/media/assets/hls_variant/765178/19.ts
deleted file mode 100644
index 4bb80bf..0000000
--- a/tests/tests/media/assets/hls_variant/765178/19.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/20.ts b/tests/tests/media/assets/hls_variant/765178/20.ts
deleted file mode 100644
index 591fda9..0000000
--- a/tests/tests/media/assets/hls_variant/765178/20.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/21.ts b/tests/tests/media/assets/hls_variant/765178/21.ts
deleted file mode 100644
index a3cab10..0000000
--- a/tests/tests/media/assets/hls_variant/765178/21.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/22.ts b/tests/tests/media/assets/hls_variant/765178/22.ts
deleted file mode 100644
index c60c3f8..0000000
--- a/tests/tests/media/assets/hls_variant/765178/22.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/23.ts b/tests/tests/media/assets/hls_variant/765178/23.ts
deleted file mode 100644
index e60a254..0000000
--- a/tests/tests/media/assets/hls_variant/765178/23.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/24.ts b/tests/tests/media/assets/hls_variant/765178/24.ts
deleted file mode 100644
index bc75f31..0000000
--- a/tests/tests/media/assets/hls_variant/765178/24.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/hls_variant/765178/index.m3u8 b/tests/tests/media/assets/hls_variant/765178/index.m3u8
deleted file mode 100644
index f36f33d..0000000
--- a/tests/tests/media/assets/hls_variant/765178/index.m3u8
+++ /dev/null
@@ -1,53 +0,0 @@
-#EXTM3U
-#EXT-X-VERSION:3
-#EXT-X-TARGETDURATION:5
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:5,
-00.ts
-#EXTINF:5,
-01.ts
-#EXTINF:5,
-02.ts
-#EXTINF:5,
-03.ts
-#EXTINF:5,
-04.ts
-#EXTINF:5,
-05.ts
-#EXTINF:5,
-06.ts
-#EXTINF:5,
-07.ts
-#EXTINF:5,
-08.ts
-#EXTINF:5,
-09.ts
-#EXTINF:5,
-10.ts
-#EXTINF:5,
-11.ts
-#EXTINF:5,
-12.ts
-#EXTINF:5,
-13.ts
-#EXTINF:5,
-14.ts
-#EXTINF:5,
-15.ts
-#EXTINF:5,
-16.ts
-#EXTINF:5,
-17.ts
-#EXTINF:5,
-18.ts
-#EXTINF:5,
-19.ts
-#EXTINF:5,
-20.ts
-#EXTINF:5,
-21.ts
-#EXTINF:5,
-22.ts
-#EXTINF:5,
-23.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/hls_variant/index.m3u8 b/tests/tests/media/assets/hls_variant/index.m3u8
deleted file mode 100644
index 2e94f5d..0000000
--- a/tests/tests/media/assets/hls_variant/index.m3u8
+++ /dev/null
@@ -1,12 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=165340,RESOLUTION=256x144,CODECS="mp4a.40.5,avc1.42c00b"
-165340/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=344388,RESOLUTION=426x240,CODECS="mp4a.40.5,avc1.4d4015"
-344388/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=387360,RESOLUTION=640x360,CODECS="mp4a.40.2,avc1.4d401e"
-387360/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=765178,RESOLUTION=854x480,CODECS="mp4a.40.2,avc1.4d401f"
-765178/index.m3u8
-#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,BANDWIDTH=1676816,RESOLUTION=1280x720,CODECS="mp4a.40.2,avc1.4d401f"
-1676816/index.m3u8
diff --git a/tests/tests/media/assets/prog_index.m3u8 b/tests/tests/media/assets/prog_index.m3u8
deleted file mode 100644
index 88f99d3..0000000
--- a/tests/tests/media/assets/prog_index.m3u8
+++ /dev/null
@@ -1,10 +0,0 @@
-#EXTM3U
-#EXT-X-TARGETDURATION:10
-#EXT-X-VERSION:3
-#EXT-X-MEDIA-SEQUENCE:0
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXTINF:9.90000,
-fileSequence0.ts
-#EXTINF:10.00000,
-fileSequence1.ts
-#EXT-X-ENDLIST
diff --git a/tests/tests/media/assets/segment000000.ts b/tests/tests/media/assets/segment000000.ts
deleted file mode 100644
index 8992c7b..0000000
--- a/tests/tests/media/assets/segment000000.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/segment000001.ts b/tests/tests/media/assets/segment000001.ts
deleted file mode 100644
index fb112ec..0000000
--- a/tests/tests/media/assets/segment000001.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.key b/tests/tests/media/assets/unmuxed_1500k/00.key
deleted file mode 100644
index eb61918..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/00.key
+++ /dev/null
@@ -1 +0,0 @@
-ëÝbñhÒ{hï*üä®<
\ No newline at end of file
diff --git a/tests/tests/media/assets/unmuxed_1500k/00.ts b/tests/tests/media/assets/unmuxed_1500k/00.ts
deleted file mode 100644
index 9891dc6..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/00.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/01.ts b/tests/tests/media/assets/unmuxed_1500k/01.ts
deleted file mode 100644
index d374565..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/01.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/02.ts b/tests/tests/media/assets/unmuxed_1500k/02.ts
deleted file mode 100644
index 6a6fbdb..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/02.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/03.ts b/tests/tests/media/assets/unmuxed_1500k/03.ts
deleted file mode 100644
index cba18a5..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/03.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/04.ts b/tests/tests/media/assets/unmuxed_1500k/04.ts
deleted file mode 100644
index bed2e63..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/04.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/05.ts b/tests/tests/media/assets/unmuxed_1500k/05.ts
deleted file mode 100644
index 35504ca..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/05.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/06.ts b/tests/tests/media/assets/unmuxed_1500k/06.ts
deleted file mode 100644
index 8456a79..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/06.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/07.ts b/tests/tests/media/assets/unmuxed_1500k/07.ts
deleted file mode 100644
index e19ec6b..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/07.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/08.ts b/tests/tests/media/assets/unmuxed_1500k/08.ts
deleted file mode 100644
index 9a695cd..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/08.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/09.ts b/tests/tests/media/assets/unmuxed_1500k/09.ts
deleted file mode 100644
index eecdb09..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/09.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/10.ts b/tests/tests/media/assets/unmuxed_1500k/10.ts
deleted file mode 100644
index ce1383a..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/10.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/11.ts b/tests/tests/media/assets/unmuxed_1500k/11.ts
deleted file mode 100644
index 99a9ba2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/11.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/12.ts b/tests/tests/media/assets/unmuxed_1500k/12.ts
deleted file mode 100644
index e63f897..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/12.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/13.ts b/tests/tests/media/assets/unmuxed_1500k/13.ts
deleted file mode 100644
index 50010e2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/13.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/14.ts b/tests/tests/media/assets/unmuxed_1500k/14.ts
deleted file mode 100644
index 8667a91..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/14.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/15.ts b/tests/tests/media/assets/unmuxed_1500k/15.ts
deleted file mode 100644
index 124b1b5..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/15.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/unmuxed_1500k/index.m3u8 b/tests/tests/media/assets/unmuxed_1500k/index.m3u8
deleted file mode 100644
index ee979a2..0000000
--- a/tests/tests/media/assets/unmuxed_1500k/index.m3u8
+++ /dev/null
@@ -1,37 +0,0 @@
-#EXTM3U
-#EXT-X-INDEPENDENT-SEGMENTS
-#EXT-X-VERSION:5
-#EXT-X-TARGETDURATION:10
-#EXT-X-PLAYLIST-TYPE:VOD
-#EXT-X-KEY:METHOD=SAMPLE-AES,URI="00.key",IV=0x10428210ced85ee2ece4f45206ba81ce
-#EXTINF:5.04167,
-00.ts
-#EXTINF:6.83333,
-01.ts
-#EXTINF:3.875,
-02.ts
-#EXTINF:7.29167,
-03.ts
-#EXTINF:10,
-04.ts
-#EXTINF:10,
-05.ts
-#EXTINF:4.66667,
-06.ts
-#EXTINF:8.375,
-07.ts
-#EXTINF:7.70833,
-08.ts
-#EXTINF:9.66667,
-09.ts
-#EXTINF:6.5,
-10.ts
-#EXTINF:9.79167,
-11.ts
-#EXTINF:10,
-12.ts
-#EXTINF:4.16667,
-13.ts
-#EXTINF:8.75,
-14.ts
-#EXT-X-ENDLIST
\ No newline at end of file
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4
deleted file mode 100644
index d66b238..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1216x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4
deleted file mode 100644
index e46a7c7..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x544_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4
deleted file mode 100644
index 8af2cf1..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1280x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4
deleted file mode 100644
index 92815cb..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_136x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4
deleted file mode 100644
index ec81fe7..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1440x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4
deleted file mode 100644
index 97e4958..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4
deleted file mode 100644
index 6e22847..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4
deleted file mode 100644
index 9c061e0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_1920x818_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4
deleted file mode 100644
index 58d899d..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_192x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4
deleted file mode 100644
index ade1d8e..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_202x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4
deleted file mode 100644
index fc5a7b82..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1090_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4
deleted file mode 100644
index 52d2466..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2560x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4
deleted file mode 100644
index 55b2a50..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x108_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4
deleted file mode 100644
index 34bef63..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_256x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4
deleted file mode 100644
index dd8ff39..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_270x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4
deleted file mode 100644
index 2437833..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_2880x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4
deleted file mode 100644
index 1e249f3..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_320x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4
deleted file mode 100644
index 7d52627..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x1634_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4
deleted file mode 100644
index a44925b..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_3840x2160_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4
deleted file mode 100644
index 8ca7660..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_406x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4
deleted file mode 100644
index e190f9f..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x182_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4
deleted file mode 100644
index 01f33de..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_426x240_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4
deleted file mode 100644
index 2163aebe..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_480x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4
deleted file mode 100644
index 5bae22d9..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_608x1080_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4
deleted file mode 100644
index 34738b0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x272_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4
deleted file mode 100644
index 257037c..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4
deleted file mode 100644
index 6caa288..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_640x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4
deleted file mode 100644
index 081a5d3..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_810x1440_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4
deleted file mode 100644
index 48463db..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_82x144_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4
deleted file mode 100644
index bfe1fe0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x362_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4
deleted file mode 100644
index 97df960..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_854x480_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4 b/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4
deleted file mode 100644
index 671329e..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-h264_960x720_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm
deleted file mode 100644
index 3e987e0..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1216x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm
deleted file mode 100644
index 4453d53..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x544_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm
deleted file mode 100644
index 086a0ee..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1280x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm
deleted file mode 100644
index 6b54d00..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_136x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm
deleted file mode 100644
index edf8a42..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1440x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm
deleted file mode 100644
index b8515e5..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm
deleted file mode 100644
index 6c6f219..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm
deleted file mode 100644
index 1870a54..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_1920x818_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm
deleted file mode 100644
index 45dcd2b..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_192x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm
deleted file mode 100644
index 74e4e89..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_202x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm
deleted file mode 100644
index 20eef7d..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1090_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm
deleted file mode 100644
index 2108a75..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2560x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm
deleted file mode 100644
index 2242a44..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x108_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm
deleted file mode 100644
index 48962e8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_256x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm
deleted file mode 100644
index 121e955..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_270x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm
deleted file mode 100644
index e95fc45..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_2880x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm
deleted file mode 100644
index e105985..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_320x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm
deleted file mode 100644
index a3ade36..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x1634_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm
deleted file mode 100644
index e94d4da..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_3840x2160_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm
deleted file mode 100644
index 7b903de..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_406x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm
deleted file mode 100644
index a37299c..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x182_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm
deleted file mode 100644
index 85974a8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_426x240_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm
deleted file mode 100644
index efb8747ff..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_480x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm
deleted file mode 100644
index af82abf..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_608x1080_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm
deleted file mode 100644
index e8ff426..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x272_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm
deleted file mode 100644
index bb40cd8..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm
deleted file mode 100644
index d252278..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_640x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm
deleted file mode 100644
index 853981a..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_810x1440_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm
deleted file mode 100644
index b6dc9a5..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_82x144_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm
deleted file mode 100644
index cbc6b2cc..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x362_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm
deleted file mode 100644
index adef5bc..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_854x480_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm b/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm
deleted file mode 100644
index 44c0b82..0000000
--- a/tests/tests/media/assets/video_decode_accuracy_and_capability-vp9_960x720_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4 b/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4
deleted file mode 100644
index 9a899b2..0000000
--- a/tests/tests/media/assets/video_decode_with_cropping-h264_520x360_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm b/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm
deleted file mode 100644
index df2723c..0000000
--- a/tests/tests/media/assets/video_decode_with_cropping-vp9_520x360_30fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AudioHelper.java b/tests/tests/media/common/src/android/media/cts/AudioHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioHelper.java
rename to tests/tests/media/common/src/android/media/cts/AudioHelper.java
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerStub.java b/tests/tests/media/common/src/android/media/cts/AudioManagerStub.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioManagerStub.java
rename to tests/tests/media/common/src/android/media/cts/AudioManagerStub.java
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerStubHelper.java b/tests/tests/media/common/src/android/media/cts/AudioManagerStubHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioManagerStubHelper.java
rename to tests/tests/media/common/src/android/media/cts/AudioManagerStubHelper.java
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordNative.java b/tests/tests/media/common/src/android/media/cts/AudioRecordNative.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioRecordNative.java
rename to tests/tests/media/common/src/android/media/cts/AudioRecordNative.java
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackNative.java b/tests/tests/media/common/src/android/media/cts/AudioTrackNative.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/AudioTrackNative.java
rename to tests/tests/media/common/src/android/media/cts/AudioTrackNative.java
diff --git a/tests/tests/media/src/android/media/cts/CodecImage.java b/tests/tests/media/common/src/android/media/cts/CodecImage.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecImage.java
rename to tests/tests/media/common/src/android/media/cts/CodecImage.java
diff --git a/tests/tests/media/src/android/media/cts/CodecState.java b/tests/tests/media/common/src/android/media/cts/CodecState.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecState.java
rename to tests/tests/media/common/src/android/media/cts/CodecState.java
diff --git a/tests/tests/media/src/android/media/cts/CodecUtils.java b/tests/tests/media/common/src/android/media/cts/CodecUtils.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CodecUtils.java
rename to tests/tests/media/common/src/android/media/cts/CodecUtils.java
diff --git a/tests/tests/media/src/android/media/cts/CompositionTextureView.java b/tests/tests/media/common/src/android/media/cts/CompositionTextureView.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/CompositionTextureView.java
rename to tests/tests/media/common/src/android/media/cts/CompositionTextureView.java
diff --git a/tests/tests/media/src/android/media/cts/ConnectionStatus.java b/tests/tests/media/common/src/android/media/cts/ConnectionStatus.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/ConnectionStatus.java
rename to tests/tests/media/common/src/android/media/cts/ConnectionStatus.java
diff --git a/tests/tests/media/src/android/media/cts/DeviceUtils.java b/tests/tests/media/common/src/android/media/cts/DeviceUtils.java
similarity index 84%
rename from tests/tests/media/src/android/media/cts/DeviceUtils.java
rename to tests/tests/media/common/src/android/media/cts/DeviceUtils.java
index 9051c69..eb7dc6c 100644
--- a/tests/tests/media/src/android/media/cts/DeviceUtils.java
+++ b/tests/tests/media/common/src/android/media/cts/DeviceUtils.java
@@ -27,27 +27,27 @@
 
 import android.util.Log;
 
-/* package */ class DeviceUtils {
+public class DeviceUtils {
     private static final String TAG = "DeviceUtils";
 
-    /* package */ static boolean hasOutputDevice(AudioManager audioMgr) {
+    public static boolean hasOutputDevice(AudioManager audioMgr) {
         AudioDeviceInfo[] devices = audioMgr.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
         return devices.length != 0;
     }
 
-    /* package */ static boolean hasInputDevice(AudioManager audioMgr) {
+    public static boolean hasInputDevice(AudioManager audioMgr) {
         AudioDeviceInfo[] devices = audioMgr.getDevices(AudioManager.GET_DEVICES_INPUTS);
         return devices.length != 0;
     }
 
-    /* package */ static boolean isTVDevice(Context context) {
+    public static boolean isTVDevice(Context context) {
         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
     }
 
     /*
      * HDMI
      */
-    /* package */ static boolean isHDMIConnected(Context context) {
+    public static boolean isHDMIConnected(Context context) {
         // configure the IntentFilter
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(AudioManager.ACTION_HDMI_AUDIO_PLUG);
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java b/tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
rename to tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
index 0dbedee..4ad8d27 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
+++ b/tests/tests/media/common/src/android/media/cts/EncodeVirtualDisplayWithCompositionTestImpl.java
@@ -87,10 +87,10 @@
     private static final int COLOR_BLUE =  makeColor(0, 0, 100);
     private static final int COLOR_GREY =  makeColor(100, 100, 100);
 
-    static final int BITRATE_1080p = 20000000;
-    static final int BITRATE_720p = 14000000;
-    static final int BITRATE_800x480 = 14000000;
-    static final int BITRATE_DEFAULT = 10000000;
+    public static final int BITRATE_1080p = 20000000;
+    public static final int BITRATE_720p = 14000000;
+    public static final int BITRATE_800x480 = 14000000;
+    public static final int BITRATE_DEFAULT = 10000000;
 
     private static final int IFRAME_INTERVAL = 10;
 
@@ -139,14 +139,14 @@
      * @param h
      * @throws Exception
      */
-    void runTestRenderingInSeparateThread(final Context context, final String mimeType,
+    public void runTestRenderingInSeparateThread(final Context context, final String mimeType,
             final int w, final int h, final boolean runRemotely, final boolean multipleWindows)
             throws Throwable {
         runTestRenderingInSeparateThread(
                 context, mimeType, w, h, runRemotely, multipleWindows, /* degrees */ 0, null);
     }
 
-    void runTestRenderingInSeparateThread(final Context context, final String mimeType,
+    public void runTestRenderingInSeparateThread(final Context context, final String mimeType,
             final int w, final int h, final boolean runRemotely, final boolean multipleWindows,
             final int degrees, final String decoderName) throws Throwable {
         mTestException = null;
@@ -435,7 +435,8 @@
     private static final int NUM_CODEC_CREATION = 5;
     private static final int NUM_DISPLAY_CREATION = 10;
     private static final int NUM_RENDERING = 10;
-    void doTestVirtualDisplayRecycles(final Context context, int numDisplays) throws Exception {
+    public void doTestVirtualDisplayRecycles(final Context context, int numDisplays)
+            throws Exception {
         Size maxSize = getMaxSupportedEncoderSize();
         if (maxSize == null) {
             Log.i(TAG, "no codec found, skipping");
@@ -1470,7 +1471,7 @@
      * Check is done for 4 different levels: 1080p, 720p, 800x480, 480p
      * (The last one is required by CDD.)
      */
-    Size checkMaxConcurrentEncodingDecodingResolution() {
+    public Size checkMaxConcurrentEncodingDecodingResolution() {
         if (isConcurrentEncodingDecodingSupported(MIME_TYPE, 1920, 1080, BITRATE_1080p)) {
             return new Size(1920, 1080);
         } else if (isConcurrentEncodingDecodingSupported(MIME_TYPE, 1280, 720, BITRATE_720p)) {
@@ -1484,12 +1485,12 @@
         return null;
     }
 
-    boolean isConcurrentEncodingDecodingSupported(
+    public boolean isConcurrentEncodingDecodingSupported(
             String mimeType, int w, int h, int bitRate) {
         return isConcurrentEncodingDecodingSupported(mimeType, w, h, bitRate, null);
     }
 
-    boolean isConcurrentEncodingDecodingSupported(
+    public boolean isConcurrentEncodingDecodingSupported(
             String mimeType, int w, int h, int bitRate, String decoderName) {
         MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
         MediaFormat testFormat = MediaFormat.createVideoFormat(mimeType, w, h);
diff --git a/tests/tests/media/src/android/media/cts/IConnectionStatus.java b/tests/tests/media/common/src/android/media/cts/IConnectionStatus.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/IConnectionStatus.java
rename to tests/tests/media/common/src/android/media/cts/IConnectionStatus.java
diff --git a/tests/tests/media/src/android/media/cts/InputSurface.java b/tests/tests/media/common/src/android/media/cts/InputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/InputSurface.java
rename to tests/tests/media/common/src/android/media/cts/InputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/InputSurfaceInterface.java b/tests/tests/media/common/src/android/media/cts/InputSurfaceInterface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/InputSurfaceInterface.java
rename to tests/tests/media/common/src/android/media/cts/InputSurfaceInterface.java
diff --git a/tests/tests/media/src/android/media/cts/LocalMediaProjectionService.java b/tests/tests/media/common/src/android/media/cts/LocalMediaProjectionService.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/LocalMediaProjectionService.java
rename to tests/tests/media/common/src/android/media/cts/LocalMediaProjectionService.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelHelper.java b/tests/tests/media/common/src/android/media/cts/MediaCodecBlockModelHelper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecBlockModelHelper.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecBlockModelHelper.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java b/tests/tests/media/common/src/android/media/cts/MediaCodecClearKeyPlayer.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecClearKeyPlayer.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java b/tests/tests/media/common/src/android/media/cts/MediaCodecPlayerTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecPlayerTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTunneledPlayer.java b/tests/tests/media/common/src/android/media/cts/MediaCodecTunneledPlayer.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecTunneledPlayer.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecTunneledPlayer.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecWrapper.java b/tests/tests/media/common/src/android/media/cts/MediaCodecWrapper.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaCodecWrapper.java
rename to tests/tests/media/common/src/android/media/cts/MediaCodecWrapper.java
diff --git a/tests/tests/media/src/android/media/cts/MediaHeavyPresubmitTest.java b/tests/tests/media/common/src/android/media/cts/MediaHeavyPresubmitTest.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaHeavyPresubmitTest.java
rename to tests/tests/media/common/src/android/media/cts/MediaHeavyPresubmitTest.java
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/common/src/android/media/cts/MediaPlayerTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
rename to tests/tests/media/common/src/android/media/cts/MediaPlayerTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/MediaProjectionActivity.java b/tests/tests/media/common/src/android/media/cts/MediaProjectionActivity.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaProjectionActivity.java
rename to tests/tests/media/common/src/android/media/cts/MediaProjectionActivity.java
diff --git a/tests/tests/media/src/android/media/cts/MediaStubActivity.java b/tests/tests/media/common/src/android/media/cts/MediaStubActivity.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaStubActivity.java
rename to tests/tests/media/common/src/android/media/cts/MediaStubActivity.java
diff --git a/tests/tests/media/src/android/media/cts/MediaStubActivity2.java b/tests/tests/media/common/src/android/media/cts/MediaStubActivity2.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaStubActivity2.java
rename to tests/tests/media/common/src/android/media/cts/MediaStubActivity2.java
diff --git a/tests/tests/media/src/android/media/cts/MediaTimeProvider.java b/tests/tests/media/common/src/android/media/cts/MediaTimeProvider.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/MediaTimeProvider.java
rename to tests/tests/media/common/src/android/media/cts/MediaTimeProvider.java
diff --git a/tests/tests/media/src/android/media/cts/NdkInputSurface.java b/tests/tests/media/common/src/android/media/cts/NdkInputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NdkInputSurface.java
rename to tests/tests/media/common/src/android/media/cts/NdkInputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/NdkMediaCodec.java b/tests/tests/media/common/src/android/media/cts/NdkMediaCodec.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NdkMediaCodec.java
rename to tests/tests/media/common/src/android/media/cts/NdkMediaCodec.java
diff --git a/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java b/tests/tests/media/common/src/android/media/cts/NonBlockingAudioTrack.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java
rename to tests/tests/media/common/src/android/media/cts/NonBlockingAudioTrack.java
diff --git a/tests/tests/media/src/android/media/cts/NonMediaMainlineTest.java b/tests/tests/media/common/src/android/media/cts/NonMediaMainlineTest.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/NonMediaMainlineTest.java
rename to tests/tests/media/common/src/android/media/cts/NonMediaMainlineTest.java
diff --git a/tests/tests/media/src/android/media/cts/OutputSurface.java b/tests/tests/media/common/src/android/media/cts/OutputSurface.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/OutputSurface.java
rename to tests/tests/media/common/src/android/media/cts/OutputSurface.java
diff --git a/tests/tests/media/src/android/media/cts/PostProcTestBase.java b/tests/tests/media/common/src/android/media/cts/PostProcTestBase.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/PostProcTestBase.java
rename to tests/tests/media/common/src/android/media/cts/PostProcTestBase.java
diff --git a/tests/tests/media/src/android/media/cts/Preconditions.java b/tests/tests/media/common/src/android/media/cts/Preconditions.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/Preconditions.java
rename to tests/tests/media/common/src/android/media/cts/Preconditions.java
diff --git a/tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java b/tests/tests/media/common/src/android/media/cts/RemoteVirtualDisplayService.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java
rename to tests/tests/media/common/src/android/media/cts/RemoteVirtualDisplayService.java
diff --git a/tests/tests/media/src/android/media/cts/SdkMediaCodec.java b/tests/tests/media/common/src/android/media/cts/SdkMediaCodec.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/SdkMediaCodec.java
rename to tests/tests/media/common/src/android/media/cts/SdkMediaCodec.java
diff --git a/tests/tests/media/src/android/media/cts/TestMediaDataSource.java b/tests/tests/media/common/src/android/media/cts/TestMediaDataSource.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/TestMediaDataSource.java
rename to tests/tests/media/common/src/android/media/cts/TestMediaDataSource.java
diff --git a/tests/tests/media/src/android/media/cts/TestUtils.java b/tests/tests/media/common/src/android/media/cts/TestUtils.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/TestUtils.java
rename to tests/tests/media/common/src/android/media/cts/TestUtils.java
index ae4cb59..79aaada 100644
--- a/tests/tests/media/src/android/media/cts/TestUtils.java
+++ b/tests/tests/media/common/src/android/media/cts/TestUtils.java
@@ -78,7 +78,7 @@
      * @param minVersion the minimum version
      * @throws AssumptionViolatedException if module version < minVersion
      */
-    static void assumeMainlineModuleAtLeast(String module, long minVersion) {
+    public static void assumeMainlineModuleAtLeast(String module, long minVersion) {
         try {
             long actualVersion = getModuleVersion(module);
             assumeTrue("Assume  module  " + module + " version " + actualVersion + " < minVersion"
diff --git a/tests/tests/media/src/android/media/cts/TextureRender.java b/tests/tests/media/common/src/android/media/cts/TextureRender.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/TextureRender.java
rename to tests/tests/media/common/src/android/media/cts/TextureRender.java
diff --git a/tests/tests/media/src/android/media/cts/Utils.java b/tests/tests/media/common/src/android/media/cts/Utils.java
similarity index 98%
rename from tests/tests/media/src/android/media/cts/Utils.java
rename to tests/tests/media/common/src/android/media/cts/Utils.java
index c95768b..bf942a7 100644
--- a/tests/tests/media/src/android/media/cts/Utils.java
+++ b/tests/tests/media/common/src/android/media/cts/Utils.java
@@ -106,7 +106,7 @@
         }
     }
 
-    protected static void toggleNotificationPolicyAccess(String packageName,
+    public static void toggleNotificationPolicyAccess(String packageName,
             Instrumentation instrumentation, boolean on) throws IOException {
 
         String command = " cmd notification " + (on ? "allow_dnd " : "disallow_dnd ") + packageName;
diff --git a/tests/tests/media/src/android/media/cts/WorkDir.java b/tests/tests/media/common/src/android/media/cts/WorkDir.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/WorkDir.java
rename to tests/tests/media/common/src/android/media/cts/WorkDir.java
diff --git a/tests/tests/media/src/android/media/cts/YUVImage.java b/tests/tests/media/common/src/android/media/cts/YUVImage.java
similarity index 100%
rename from tests/tests/media/src/android/media/cts/YUVImage.java
rename to tests/tests/media/common/src/android/media/cts/YUVImage.java
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
index 1585462..b4f41cd 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
@@ -358,18 +358,19 @@
                             rowSampling = 2;
                             colSampling = 2;
                         }
-                        long timestampUs = 1000000l * frameIndex / kFrameRate;
-                        ++frameIndex;
-                        if (frameIndex >= 32) {
-                            signaledEos = true;
-                        }
-                        timestampList.add(timestampUs);
-                        mediaCodec.getQueueRequest(event.index)
-                                .setHardwareBuffer(buffer)
-                                .setPresentationTimeUs(timestampUs)
-                                .setFlags(signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0)
-                                .queue();
                     }
+
+                    long timestampUs = 1000000l * frameIndex / kFrameRate;
+                    ++frameIndex;
+                    if (frameIndex >= 32) {
+                        signaledEos = true;
+                    }
+                    timestampList.add(timestampUs);
+                    mediaCodec.getQueueRequest(event.index)
+                            .setHardwareBuffer(buffer)
+                            .setPresentationTimeUs(timestampUs)
+                            .setFlags(signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0)
+                            .queue();
                 } else {
                     MediaCodec.OutputFrame frame = mediaCodec.getOutputFrame(event.index);
                     eos = (frame.getFlags() & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
diff --git a/tests/tests/mediadrm/Android.bp b/tests/tests/mediadrm/Android.bp
index 5430869..27afc76 100644
--- a/tests/tests/mediadrm/Android.bp
+++ b/tests/tests/mediadrm/Android.bp
@@ -33,9 +33,8 @@
         "androidx.test.ext.junit",
         "compatibility-device-util-axt",
         "ctsdeviceutillegacy-axt",
-        "ctsmediautil",
         "ctstestrunner-axt",
-        "cts-media-drm-common",
+        "cts-media-common",
         "cts-media-res-lib",
         "hamcrest-library",
         "ctstestserver",
diff --git a/tests/tests/mediatranscoding/OWNERS b/tests/tests/mediatranscoding/OWNERS
index dbe0a55..9334bfa 100644
--- a/tests/tests/mediatranscoding/OWNERS
+++ b/tests/tests/mediatranscoding/OWNERS
@@ -1,3 +1,4 @@
 # Bug component: 761430
-hkuang@google.com
-lnilsson@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
\ No newline at end of file
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
new file mode 100644
index 0000000..41f6c22
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_480p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4 b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
new file mode 100644
index 0000000..7211fec1
--- /dev/null
+++ b/tests/tests/mediatranscoding/res/raw/Video_HEVC_720p_30Frames.mp4
Binary files differ
diff --git a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
index 15cdf5d..9cc7e1f 100644
--- a/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
+++ b/tests/tests/mediatranscoding/src/android/media/mediatranscoding/cts/MediaTranscodingManagerTest.java
@@ -24,6 +24,9 @@
 import android.content.pm.PackageManager;
 import android.content.res.AssetFileDescriptor;
 import android.media.ApplicationMediaCapabilities;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.MediaTranscodingManager;
 import android.media.MediaTranscodingManager.TranscodingRequest;
@@ -85,9 +88,9 @@
 
     // Default setting for transcoding to H.264.
     private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
-    private static final int BIT_RATE = 20000000;            // 20Mbps
-    private static final int WIDTH = 1920;
-    private static final int HEIGHT = 1080;
+    private static final int BIT_RATE = 4000000;            // 4Mbps
+    private static final int WIDTH = 720;
+    private static final int HEIGHT = 480;
 
     // Threshold for the psnr to make sure the transcoded video is valid.
     private static final int PSNR_THRESHOLD = 20;
@@ -145,9 +148,9 @@
         androidx.test.InstrumentationRegistry.registerInstance(
                 InstrumentationRegistry.getInstrumentation(), new Bundle());
 
-        // Setup source HEVC file uri.
-        mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_30Frames,
-                "Video_HEVC_30Frames.mp4");
+        // Setup default source HEVC 480p file uri.
+        mSourceHEVCVideoUri = resourceToUri(mContext, R.raw.Video_HEVC_480p_30Frames,
+                "Video_HEVC_480p_30Frames.mp4");
 
         // Setup source AVC file uri.
         mSourceAVCVideoUri = resourceToUri(mContext, R.raw.Video_AVC_30Frames,
@@ -376,6 +379,14 @@
                 TranscodingSession.RESULT_SUCCESS);
     }
 
+    public void testHevcTranscoding720PVideo30FramesWithoutAudio() throws Exception {
+        if (shouldSkip()) {
+            return;
+        }
+        transcodeFile(resourceToUri(mContext, R.raw.Video_HEVC_720p_30Frames,
+                "Video_HEVC_720p_30Frames.mp4"), false /* testFileDescriptor */);
+    }
+
     public void testAvcTranscoding1080PVideo30FramesWithoutAudio() throws Exception {
         if (shouldSkip()) {
             return;
@@ -423,14 +434,6 @@
         if (shouldSkip()) {
             return;
         }
-        MediaFormat format = new MediaFormat();
-        format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_VIDEO_HEVC);
-        format.setInteger(MediaFormat.KEY_WIDTH, 3840);
-        format.setInteger(MediaFormat.KEY_HEIGHT, 2160);
-        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
-        if (!MediaUtils.canDecode(format) || !MediaUtils.canEncode(format) ) {
-            return;
-        }
         transcodeFile(resourceToUri(mContext, R.raw.Video_4K_HEVC_64Frames_Audio,
                 "Video_4K_HEVC_64Frames_Audio.mp4"), false /* testFileDescriptor */);
     }
@@ -453,14 +456,26 @@
         ApplicationMediaCapabilities clientCaps =
                 new ApplicationMediaCapabilities.Builder().build();
 
+        MediaFormat srcVideoFormat = getVideoTrackFormat(fileUri);
+        assertNotNull(srcVideoFormat);
+
+        int width = srcVideoFormat.getInteger(MediaFormat.KEY_WIDTH);
+        int height = srcVideoFormat.getInteger(MediaFormat.KEY_HEIGHT);
+
         TranscodingRequest.VideoFormatResolver
                 resolver = new TranscodingRequest.VideoFormatResolver(clientCaps,
                 MediaFormat.createVideoFormat(
-                        MediaFormat.MIMETYPE_VIDEO_HEVC, WIDTH, HEIGHT));
+                        MediaFormat.MIMETYPE_VIDEO_HEVC, width, height));
         assertTrue(resolver.shouldTranscode());
         MediaFormat videoTrackFormat = resolver.resolveVideoFormat();
         assertNotNull(videoTrackFormat);
 
+        // Return if the source or target video format is not supported
+        if (!isFormatSupported(srcVideoFormat, false)
+                || !isFormatSupported(videoTrackFormat, true)) {
+            return;
+        }
+
         int pid = android.os.Process.myPid();
         int uid = android.os.Process.myUid();
 
@@ -758,4 +773,51 @@
         assertTrue("Failed to receive at least 10 progress updates",
                 progressUpdateCount.get() > 10);
     }
+
+    private MediaFormat getVideoTrackFormat(Uri fileUri) throws IOException {
+        MediaFormat videoFormat = null;
+        MediaExtractor extractor = new MediaExtractor();
+        extractor.setDataSource(fileUri.toString());
+        // Find video track format
+        for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+            MediaFormat format = extractor.getTrackFormat(trackID);
+            if (format.getString(MediaFormat.KEY_MIME).startsWith("video/")) {
+                videoFormat = format;
+                break;
+            }
+        }
+        extractor.release();
+        return videoFormat;
+    }
+
+    private boolean isFormatSupported(MediaFormat format, boolean isEncoder) {
+        String mime = format.getString(MediaFormat.KEY_MIME);
+        MediaCodec codec = null;
+        try {
+            // The underlying transcoder library uses AMediaCodec_createEncoderByType
+            // to create encoder. So we cannot perform an exhaustive search of
+            // all codecs that support the format. This is because the codec that
+            // advertises support for the format during search may not be the one
+            // instantiated by the transcoder library. So, we have to check whether
+            // the codec returned by createEncoderByType supports the format.
+            // The same point holds for decoder too.
+            if (isEncoder) {
+                codec = MediaCodec.createEncoderByType(mime);
+            } else {
+                codec = MediaCodec.createDecoderByType(mime);
+            }
+            MediaCodecInfo info = codec.getCodecInfo();
+            MediaCodecInfo.CodecCapabilities caps = info.getCapabilitiesForType(mime);
+            if (caps != null && caps.isFormatSupported(format) && info.isHardwareAccelerated()) {
+                return true;
+            }
+        } catch (IOException e) {
+            Log.d(TAG, "Exception: " + e);
+        } finally {
+            if (codec != null) {
+                codec.release();
+            }
+        }
+        return false;
+    }
 }
diff --git a/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java b/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
index c6ad0dc..1851b36 100644
--- a/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
+++ b/tests/tests/neuralnetworks/benchmark/src/com/android/nn/benchmark/cts/NNAccuracyTest.java
@@ -22,6 +22,7 @@
 import android.util.Pair;
 
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.RequiresDevice;
 import androidx.test.rule.ActivityTestRule;
 
 import com.android.nn.benchmark.core.BenchmarkException;
@@ -91,6 +92,7 @@
     }
 
     @Test
+    @RequiresDevice
     @LargeTest
     public void testNNAPI() throws BenchmarkException, IOException {
         List<String> accelerators = new ArrayList<>();
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
index ef2a0c1..e5026de 100644
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -81,8 +81,6 @@
     @CddTest(requirement="7.1.4.1/C-0-1")
     @Test
     public void testOpenGlEsVersion() throws InterruptedException {
-        Assume.assumeFalse(isRunningANGLE());
-
         int detectedMajorVersion = getDetectedMajorVersion();
         int reportedVersion = getVersionFromActivityManager(mActivity);
 
@@ -102,8 +100,6 @@
     @CddTest(requirement="7.1.4.1/C-2-2")
     @Test
     public void testRequiredExtensions() throws InterruptedException {
-        Assume.assumeFalse(isRunningANGLE());
-
         int reportedVersion = getVersionFromActivityManager(mActivity);
 
         if (getMajorVersion(reportedVersion) < 3)
@@ -134,8 +130,6 @@
     @CddTest(requirement="7.1.4.1/C-2-1,C-5-1,C-4-1")
     @Test
     public void testExtensionPack() throws InterruptedException {
-        Assume.assumeFalse(isRunningANGLE());
-
         // Requirements:
         // 1. If the device claims support for the system feature, the extension must be available.
         // 2. If the extension is available, the device must claim support for it.
@@ -165,8 +159,6 @@
     @CddTest(requirement="7.9.2/C-1-4")
     @Test
     public void testOpenGlEsVersionForVrHighPerformance() throws InterruptedException {
-        Assume.assumeFalse(isRunningANGLE());
-
         if (!supportsVrHighPerformance())
             return;
         restartActivityWithClientVersion(3);
@@ -183,8 +175,6 @@
     @CddTest(requirement="7.9.2/C-1-6,C-1-8")
     @Test
     public void testRequiredExtensionsForVrHighPerformance() throws InterruptedException {
-        Assume.assumeFalse(isRunningANGLE());
-
         if (!supportsVrHighPerformance())
             return;
         restartActivityWithClientVersion(3);
@@ -291,8 +281,6 @@
             "EGL_EXT_surface_CTA861_3_metadata",
         };
 
-        Assume.assumeFalse(isRunningANGLE());
-
         // This requirement only applies if device is handheld and claims to be HDR capable.
         boolean isHdrCapable = mActivity.getResources().getConfiguration().isScreenHdr();
         if (!isHdrCapable || !isHandheld())
@@ -336,8 +324,6 @@
     @CddTest(requirement="7.1.4.5/C-1-5")
     @Test
     public void testRequiredEglExtensionsForWideColorDisplay() {
-        Assume.assumeFalse(isRunningANGLE());
-
         // See CDD section 7.1.4.5
         // This test covers the EGL portion of the CDD requirement. The VK portion of the
         // requirement is covered elsewhere.
@@ -523,14 +509,4 @@
         PackageManager pm = mActivity.getPackageManager();
         return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
     }
-
-    private boolean isRunningANGLE() {
-        try {
-            // We expect to find something like: OpenGL ES 1.0 (ANGLE 2.1.0.310294adacdd)
-            return mActivity.getVersionString().contains("ANGLE");
-        } catch (Exception e) {
-            Log.e(TAG, "Caught exception: " + e);
-        }
-        return false;
-    }
 }
diff --git a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
index c8cf735..ac1feba 100644
--- a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
+++ b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
@@ -83,14 +83,6 @@
     asm volatile ( "swp r0, r0, [%0]" : "+r"(ptr) : : "r0" );
 }
 
-static void setend()
-{
-    asm volatile (
-        "setend be" "\n"
-        "setend le" "\n"
-    );
-}
-
 static void cp15_dsb()
 {
     asm volatile ( "mcr p15, 0, %0, c7, c10, 4" : : "r"(0) );
@@ -101,11 +93,6 @@
     return test_instruction(swp);
 }
 
-jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
-{
-    return test_instruction(setend);
-}
-
 jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
 {
     return test_instruction(cp15_dsb);
@@ -116,11 +103,6 @@
     return false;
 }
 
-jboolean android_os_cts_CpuInstructions_hasSetend(JNIEnv *, jobject)
-{
-    return false;
-}
-
 jboolean android_os_cts_CpuInstructions_hasCp15Barriers(JNIEnv *, jobject)
 {
     return false;
@@ -130,7 +112,6 @@
 static JNINativeMethod gMethods[] = {
     { "canReadCntvct", "()Z", (void *)android_os_cts_CpuInstructions_canReadCntvct },
     { "hasSwp", "()Z", (void *)android_os_cts_CpuInstructions_hasSwp },
-    { "hasSetend", "()Z", (void *)android_os_cts_CpuInstructions_hasSetend },
     { "hasCp15Barriers", "()Z",
             (void *)android_os_cts_CpuInstructions_hasCp15Barriers },
 };
diff --git a/tests/tests/os/src/android/os/cts/BundleTest.java b/tests/tests/os/src/android/os/cts/BundleTest.java
index bb6b904..8c91216 100644
--- a/tests/tests/os/src/android/os/cts/BundleTest.java
+++ b/tests/tests/os/src/android/os/cts/BundleTest.java
@@ -54,6 +54,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Callable;
@@ -837,6 +838,61 @@
     }
 
     @Test
+    public void testHasFileDescriptors_withParcelable() throws Exception {
+        assertTrue(mBundle.isEmpty());
+        assertFalse(mBundle.hasFileDescriptors());
+
+        mBundle.putParcelable("key", ParcelFileDescriptor.dup(FileDescriptor.in));
+        assertTrue(mBundle.hasFileDescriptors());
+
+        mBundle.putParcelable("key", new CustomParcelable(13, "Tiramisu"));
+        assertFalse(mBundle.hasFileDescriptors());
+    }
+
+    @Test
+    public void testHasFileDescriptors_withStringArray() throws Exception {
+        assertTrue(mBundle.isEmpty());
+        assertFalse(mBundle.hasFileDescriptors());
+
+        mBundle.putStringArray("key", new String[] { "string" });
+        assertFalse(mBundle.hasFileDescriptors());
+    }
+
+    @Test
+    public void testHasFileDescriptors_withSparseArray() throws Exception {
+        assertTrue(mBundle.isEmpty());
+        assertFalse(mBundle.hasFileDescriptors());
+
+        SparseArray<Parcelable> fdArray = new SparseArray<>();
+        fdArray.append(0, ParcelFileDescriptor.dup(FileDescriptor.in));
+        mBundle.putSparseParcelableArray("key", fdArray);
+        assertTrue(mBundle.hasFileDescriptors());
+
+        SparseArray<Parcelable> noFdArray = new SparseArray<>();
+        noFdArray.append(0, new CustomParcelable(13, "Tiramisu"));
+        mBundle.putSparseParcelableArray("key", noFdArray);
+        assertFalse(mBundle.hasFileDescriptors());
+
+        SparseArray<Parcelable> emptyArray = new SparseArray<>();
+        mBundle.putSparseParcelableArray("key", emptyArray);
+        assertFalse(mBundle.hasFileDescriptors());
+    }
+
+    @Test
+    public void testHasFileDescriptors_withParcelableArray() throws Exception {
+        assertTrue(mBundle.isEmpty());
+        assertFalse(mBundle.hasFileDescriptors());
+
+        mBundle.putParcelableArray("key",
+                new Parcelable[] { ParcelFileDescriptor.dup(FileDescriptor.in) });
+        assertTrue(mBundle.hasFileDescriptors());
+
+        mBundle.putParcelableArray("key",
+                new Parcelable[] { new CustomParcelable(13, "Tiramisu") });
+        assertFalse(mBundle.hasFileDescriptors());
+    }
+
+    @Test
     public void testHasFileDescriptorsOnNullValuedCollection() {
         assertFalse(mBundle.hasFileDescriptors());
 
@@ -857,6 +913,23 @@
         mBundle.clear();
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testHasFileDescriptors_withNestedContainers() throws IOException {
+        // Purposely omitting generic types here, this is still "valid" app code after all.
+        ArrayList nested = new ArrayList(
+                Arrays.asList(Arrays.asList(ParcelFileDescriptor.dup(FileDescriptor.in))));
+        mBundle.putParcelableArrayList("list", nested);
+        assertTrue(mBundle.hasFileDescriptors());
+
+        roundtrip(/* parcel */ false);
+        assertTrue(mBundle.hasFileDescriptors());
+
+        mBundle.isEmpty(); // Triggers partial deserialization (leaving lazy values)
+        mBundle.remove("unexistent"); // Removes cached value (removes FLAG_HAS_FDS_KNOWN)
+        assertTrue(mBundle.hasFileDescriptors()); // Checks lazy value
+    }
+
     @Test
     public void testHasFileDescriptors_withOriginalParcelContainingFdButNotItems() throws IOException {
         mBundle.putParcelable("fd", ParcelFileDescriptor.dup(FileDescriptor.in));
diff --git a/tests/tests/os/src/android/os/cts/CpuInstructions.java b/tests/tests/os/src/android/os/cts/CpuInstructions.java
index 45fb2f1..1def367 100644
--- a/tests/tests/os/src/android/os/cts/CpuInstructions.java
+++ b/tests/tests/os/src/android/os/cts/CpuInstructions.java
@@ -24,6 +24,5 @@
 
     public static native boolean canReadCntvct();
     public static native boolean hasSwp();
-    public static native boolean hasSetend();
     public static native boolean hasCp15Barriers();
 }
diff --git a/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
index 780be99..3d4f396 100644
--- a/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
+++ b/tests/tests/os/src/android/os/cts/CpuInstructionsTest.java
@@ -41,8 +41,6 @@
 
         assertTrue("Machine does not support ARM swp instruction emulation",
                 CpuInstructions.hasSwp());
-        assertTrue("Machine does not support ARM setend instruction emulation",
-                CpuInstructions.hasSetend());
         assertTrue("Machine does not support ARM CP15 barrier emulation",
                 CpuInstructions.hasCp15Barriers());
     }
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index 054adf9..8b5a6e8 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -2051,6 +2051,59 @@
         p.recycle();
     }
 
+    public void testReadSerializableWithClass_whenNull(){
+        Parcel p = Parcel.obtain();
+        MockClassLoader mcl = new MockClassLoader();
+        p.writeSerializable(null);
+        p.setDataPosition(0);
+        assertNull(p.readSerializable(mcl, Exception.class));
+
+        p.setDataPosition(0);
+        assertNull(p.readSerializable(null, Exception.class));
+        p.recycle();
+    }
+
+    public void testReadSerializableWithClass_whenSameClass(){
+        Parcel p = Parcel.obtain();
+        MockClassLoader mcl = new MockClassLoader();
+        Throwable throwable = new Throwable("test");
+        p.writeSerializable(throwable);
+        p.setDataPosition(0);
+        Object object = p.readSerializable(mcl, Throwable.class);
+        assertTrue(object instanceof Throwable);
+        Throwable t1 = (Throwable) object;
+        assertEquals("test", t1.getMessage());
+
+        p.setDataPosition(0);
+        Object object1 = p.readSerializable(null, Throwable.class);
+        assertTrue(object1 instanceof Throwable);
+        Throwable t2 = (Throwable) object1;
+        assertEquals("test", t2.getMessage());
+        p.recycle();
+    }
+
+    public void testReadSerializableWithClass_whenSubClass(){
+        Parcel p = Parcel.obtain();
+        MockClassLoader mcl = new MockClassLoader();
+        Exception exception = new Exception("test");
+        p.writeSerializable(exception);
+        p.setDataPosition(0);
+        Object object = p.readSerializable(mcl, Throwable.class);
+        assertTrue(object instanceof Exception);
+        Exception e1 = (Exception) object;
+        assertEquals("test", e1.getMessage());
+
+        p.setDataPosition(0);
+        Object object1 = p.readSerializable(null, Throwable.class);
+        assertTrue(object1 instanceof Exception);
+        Exception e2 = (Exception) object1;
+        assertEquals("test", e2.getMessage());
+
+        p.setDataPosition(0);
+        assertThrows(BadParcelableException.class, () -> p.readSerializable(mcl, String.class));
+        p.recycle();
+    }
+
     public void testReadParcelable() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3342,6 +3395,182 @@
         p.recycle();
     }
 
+    public void testInterfaceArray() {
+        Parcel p;
+        MockIInterface[] iface2 = {new MockIInterface(), new MockIInterface(), null};
+        MockIInterface[] iface3 = new MockIInterface[iface2.length];
+        MockIInterface[] iface4 = new MockIInterface[iface2.length + 1];
+
+        p = Parcel.obtain();
+        p.writeInterfaceArray(null);
+        p.setDataPosition(0);
+        try {
+            // input array shouldn't be null
+            p.readInterfaceArray(null, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        try {
+            // can't read null array
+            p.readInterfaceArray(iface3, MockIInterface::asInterface);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        // null if parcel has null array
+        assertNull(p.createInterfaceArray(MockIInterface[]::new, MockIInterface::asInterface));
+        p.recycle();
+
+        p = Parcel.obtain();
+        p.writeInterfaceArray(iface2);
+        p.setDataPosition(0);
+        try {
+            // input array shouldn't be null
+            p.readInterfaceArray(null, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        try {
+            // input array should be the same size
+            p.readInterfaceArray(iface4, MockIInterface::asInterface);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        try {
+            // asInterface shouldn't be null
+            p.readInterfaceArray(iface3, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        // read into input array with the exact size
+        p.readInterfaceArray(iface3, MockIInterface::asInterface);
+        for (int i = 0; i < iface3.length; i++) {
+            assertEquals(iface2[i], iface3[i]);
+        }
+
+        p.setDataPosition(0);
+        try {
+            // newArray/asInterface shouldn't be null
+            p.createInterfaceArray(null, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        // create a new array from parcel
+        MockIInterface[] iface5 =
+            p.createInterfaceArray(MockIInterface[]::new, MockIInterface::asInterface);
+        assertNotNull(iface5);
+        assertEquals(iface2.length, iface5.length);
+        for (int i = 0; i < iface5.length; i++) {
+            assertEquals(iface2[i], iface5[i]);
+        }
+        p.recycle();
+    }
+
+    public void testInterfaceList() {
+        Parcel p;
+        ArrayList<MockIInterface> arrayList = new ArrayList<>();
+        ArrayList<MockIInterface> arrayList2 = new ArrayList<>();
+        ArrayList<MockIInterface> arrayList3;
+        arrayList.add(new MockIInterface());
+        arrayList.add(new MockIInterface());
+        arrayList.add(null);
+
+        p = Parcel.obtain();
+        p.writeInterfaceList(null);
+        p.setDataPosition(0);
+        try {
+            // input list shouldn't be null
+            p.readInterfaceList(null, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        arrayList2.clear();
+        arrayList2.add(null);
+        try {
+            // can't read null list into non-empty list
+            p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        arrayList2.clear();
+        // read null list into empty list
+        p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+        assertEquals(0, arrayList2.size());
+
+        p.setDataPosition(0);
+        // null if parcel has null list
+        arrayList3 = p.createInterfaceArrayList(MockIInterface::asInterface);
+        assertNull(arrayList3);
+        p.recycle();
+
+        p = Parcel.obtain();
+        p.writeInterfaceList(arrayList);
+        p.setDataPosition(0);
+        try {
+            // input list shouldn't be null
+            p.readInterfaceList(null, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            // expected
+        }
+
+        p.setDataPosition(0);
+        arrayList2.clear();
+        try {
+            // asInterface shouldn't be null
+            p.readInterfaceList(arrayList2, null);
+            fail("Should throw a RuntimeException");
+        } catch (RuntimeException e) {
+            //expected
+        }
+
+        p.setDataPosition(0);
+        arrayList2.clear();
+        // fill a list with parcel
+        p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+        assertEquals(arrayList, arrayList2);
+
+        p.setDataPosition(0);
+        arrayList2.clear();
+        // add one more item
+        for (int i=0; i<arrayList.size() + 1; i++) {
+            arrayList2.add(null);
+        }
+        // extra item should be discarded after read
+        p.readInterfaceList(arrayList2, MockIInterface::asInterface);
+        assertEquals(arrayList, arrayList2);
+
+        p.setDataPosition(0);
+        // create a new ArrayList from parcel
+        arrayList3 = p.createInterfaceArrayList(MockIInterface::asInterface);
+        assertEquals(arrayList, arrayList3);
+        p.recycle();
+    }
+
+
     @SuppressWarnings("unchecked")
     public void testWriteMap() {
         Parcel p;
@@ -3372,6 +3601,84 @@
         p.recycle();
     }
 
+    public void testReadMapWithClass_whenNull() {
+        Parcel p = Parcel.obtain();
+        MockClassLoader mcl = new MockClassLoader();
+        p.writeMap(null);
+        HashMap<String, Intent> map = new HashMap<>();
+
+        p.setDataPosition(0);
+        p.readMap(map, mcl, String.class, Intent.class);
+        assertEquals(0, map.size());
+
+        p.recycle();
+    }
+
+    public void testReadMapWithClass_whenMismatchingClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<Signature, TestSubIntent> map = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        map.put(new Signature("1234"), new TestSubIntent(
+                baseIntent, "test_intent1"));
+        map.put(new Signature("4321"), new TestSubIntent(
+                baseIntent, "test_intent2"));
+        p.writeMap(map);
+
+        p.setDataPosition(0);
+        assertThrows(BadParcelableException.class, () ->
+                p.readMap(new HashMap<Intent, TestSubIntent>(), loader,
+                        Intent.class, TestSubIntent.class));
+
+        p.setDataPosition(0);
+        assertThrows(BadParcelableException.class, () ->
+                p.readMap(new HashMap<Signature, Signature>(), loader,
+                        Signature.class, Signature.class));
+        p.recycle();
+    }
+
+    public void testReadMapWithClass_whenSameClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<String, TestSubIntent> map = new HashMap<>();
+        HashMap<String, TestSubIntent> map2 = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        map.put("key1", new TestSubIntent(
+                baseIntent, "test_intent1"));
+        map.put("key2", new TestSubIntent(
+                baseIntent, "test_intent2"));
+        p.writeMap(map);
+        p.setDataPosition(0);
+        p.readMap(map2, loader, String.class, TestSubIntent.class);
+        assertEquals(map, map2);
+
+        p.recycle();
+    }
+
+    public void testReadMapWithClass_whenSubClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<TestSubIntent, TestSubIntent> map = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        map.put(new TestSubIntent(baseIntent, "test_intent_key1"), new TestSubIntent(
+                baseIntent, "test_intent_val1"));
+        p.writeMap(map);
+        p.setDataPosition(0);
+        HashMap<Intent, Intent> map2 = new HashMap<>();
+        p.readMap(map2, loader, Intent.class, TestSubIntent.class);
+        assertEquals(map, map2);
+
+        p.setDataPosition(0);
+        HashMap<Intent, Intent> map3 = new HashMap<>();
+        p.readMap(map3, loader, TestSubIntent.class, Intent.class);
+        assertEquals(map, map3);
+
+        p.recycle();
+    }
+
     @SuppressWarnings("unchecked")
     public void testReadHashMap() {
         Parcel p;
@@ -3402,6 +3709,80 @@
         p.recycle();
     }
 
+    public void testReadHashMapWithClass_whenNull() {
+        Parcel p = Parcel.obtain();
+        MockClassLoader mcl = new MockClassLoader();
+        p.writeMap(null);
+        p.setDataPosition(0);
+        assertNull(p.readHashMap(mcl, String.class, Intent.class));
+
+        p.setDataPosition(0);
+        assertNull(p.readHashMap(null, String.class, Intent.class));
+        p.recycle();
+    }
+
+    public void testReadHashMapWithClass_whenMismatchingClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<Signature, TestSubIntent> map = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        map.put(new Signature("1234"), new TestSubIntent(
+                baseIntent, "test_intent1"));
+        map.put(new Signature("4321"), new TestSubIntent(
+                baseIntent, "test_intent2"));
+        p.writeMap(map);
+
+        p.setDataPosition(0);
+        assertThrows(BadParcelableException.class, () ->
+                p.readHashMap(loader, Intent.class, TestSubIntent.class));
+
+        p.setDataPosition(0);
+        assertThrows(BadParcelableException.class, () ->
+                p.readHashMap(loader, Signature.class, Signature.class));
+        p.recycle();
+    }
+
+    public void testReadHashMapWithClass_whenSameClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<String, TestSubIntent> map = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        map.put("key1", new TestSubIntent(
+                baseIntent, "test_intent1"));
+        map.put("key2", new TestSubIntent(
+                baseIntent, "test_intent2"));
+
+        p.writeMap(map);
+        p.setDataPosition(0);
+        HashMap<String, TestSubIntent> map2 = p.readHashMap(loader, String.class,
+                TestSubIntent.class);
+        assertEquals(map, map2);
+
+        p.recycle();
+    }
+
+    public void testReadHashMapWithClass_whenSubClass() {
+        Parcel p = Parcel.obtain();
+        ClassLoader loader = getClass().getClassLoader();
+        HashMap<TestSubIntent, TestSubIntent> map = new HashMap<>();
+
+        Intent baseIntent = new Intent();
+        TestSubIntent test_intent_key1 = new TestSubIntent(baseIntent, "test_intent_key1");
+        map.put(test_intent_key1, new TestSubIntent(
+                baseIntent, "test_intent_val1"));
+        p.writeMap(map);
+        p.setDataPosition(0);
+        HashMap<Intent, Intent> map2 = p.readHashMap(loader, Intent.class, TestSubIntent.class);
+        assertEquals(map, map2);
+
+        p.setDataPosition(0);
+        HashMap<Intent, Intent> map3 = p.readHashMap(loader, TestSubIntent.class, Intent.class);
+        assertEquals(map, map3);
+        p.recycle();
+    }
+
     @SuppressWarnings("unchecked")
     public void testReadList() {
         Parcel p;
@@ -3567,16 +3948,27 @@
         }
     }
 
-    private class MockIInterface implements IInterface {
+    private static class MockIInterface implements IInterface {
         public Binder binder;
-
+        private static final String DESCRIPTOR = "MockIInterface";
         public MockIInterface() {
             binder = new Binder();
+            binder.attachInterface(this, DESCRIPTOR);
         }
 
         public IBinder asBinder() {
             return binder;
         }
+
+        public static MockIInterface asInterface(IBinder binder) {
+            if (binder != null) {
+                IInterface iface = binder.queryLocalInterface(DESCRIPTOR);
+                if (iface != null && iface instanceof MockIInterface) {
+                    return (MockIInterface) iface;
+                }
+            }
+            return null;
+        }
     }
 
     private static boolean parcelableWithBadCreatorInitializerHasRun;
@@ -3933,6 +4325,11 @@
             final TestSubIntent other = (TestSubIntent) obj;
             return mString.equals(other.mString);
         }
+
+        @Override
+        public int hashCode() {
+            return mString.hashCode();
+        }
     }
 
     public static class ParcelObjectFreeService extends Service {
diff --git a/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java b/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
index 70147e2..f243b3b 100644
--- a/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/OneTimePermissionTest.java
@@ -34,6 +34,7 @@
 import android.provider.DeviceConfig;
 import android.support.test.uiautomator.By;
 import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -256,9 +257,10 @@
     }
 
     private void clickOneTimeButton() throws Throwable {
-        UiAutomatorUtils.waitFindObject(By.res(
-                "com.android.permissioncontroller:id/permission_allow_one_time_button"), 10000)
-                .click();
+        final UiObject2 uiObject = UiAutomatorUtils.waitFindObject(By.res(
+                "com.android.permissioncontroller:id/permission_allow_one_time_button"), 10000);
+        Thread.sleep(500);
+        uiObject.click();
     }
 
     /**
diff --git a/tests/tests/preference/src/android/preference/cts/TestUtils.java b/tests/tests/preference/src/android/preference/cts/TestUtils.java
index 1992b95..e69e98f 100644
--- a/tests/tests/preference/src/android/preference/cts/TestUtils.java
+++ b/tests/tests/preference/src/android/preference/cts/TestUtils.java
@@ -16,6 +16,8 @@
 
 package android.preference.cts;
 
+import static org.junit.Assert.assertNotNull;
+
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.app.UiAutomation;
@@ -69,6 +71,7 @@
         waitForIdle();
 
         Bitmap bt = mAutomation.takeScreenshot();
+        assertNotNull("Screenshot must not return null", bt);
 
         // Crop-out the status bar to avoid flakiness with changing notifications / time.
         int statusBarHeight = getStatusBarHeight();
diff --git a/tests/tests/security/native/Android.bp b/tests/tests/security/native/Android.bp
index c0cb8c5..bf840b6 100644
--- a/tests/tests/security/native/Android.bp
+++ b/tests/tests/security/native/Android.bp
@@ -28,5 +28,8 @@
         ":__subpackages__",
     ],
     srcs: ["utils.cpp"],
+    shared_libs: [
+        "libbase",
+    ],
     export_include_dirs: ["."],
 }
diff --git a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
index 2952105..e5d824c 100644
--- a/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
+++ b/tests/tests/security/native/encryption/FileBasedEncryptionPolicyTest.cpp
@@ -37,17 +37,6 @@
 #define R_API_LEVEL 30
 #define S_API_LEVEL 31
 
-static int getFirstApiLevel(void) {
-    int level = property_get_int32("ro.product.first_api_level", 0);
-    if (level == 0) {
-        level = property_get_int32("ro.build.version.sdk", 0);
-    }
-    if (level == 0) {
-        ADD_FAILURE() << "Failed to determine first API level";
-    }
-    return level;
-}
-
 #ifdef __arm__
 // For ARM32, assemble the 'aese.8' instruction as an .inst, since otherwise
 // clang does not accept it.  It would be allowed in a separate file compiled
@@ -203,6 +192,7 @@
 // https://source.android.com/security/encryption/file-based.html
 TEST(FileBasedEncryptionPolicyTest, allowedPolicy) {
     int first_api_level = getFirstApiLevel();
+    int vendor_api_level = getVendorApiLevel();
     char crypto_type[PROPERTY_VALUE_MAX];
     struct fscrypt_get_policy_ex_arg arg;
     int res;
@@ -219,10 +209,13 @@
     property_get("ro.crypto.type", crypto_type, "");
     GTEST_LOG_(INFO) << "ro.crypto.type is '" << crypto_type << "'";
     GTEST_LOG_(INFO) << "First API level is " << first_api_level;
+    GTEST_LOG_(INFO) << "Vendor API level is " << vendor_api_level;
 
     // This feature name check only applies to devices that first shipped with
     // SC or later.
-    if(first_api_level >= S_API_LEVEL &&
+    int min_api_level = (first_api_level < vendor_api_level) ? first_api_level
+                                                             : vendor_api_level;
+    if (min_api_level >= S_API_LEVEL &&
        !deviceSupportsFeature("android.hardware.security.model.compatible")) {
         GTEST_SKIP()
             << "Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.";
diff --git a/tests/tests/security/native/utils.cpp b/tests/tests/security/native/utils.cpp
index 373b00e..fb9b1ee 100644
--- a/tests/tests/security/native/utils.cpp
+++ b/tests/tests/security/native/utils.cpp
@@ -15,6 +15,10 @@
  */
 
 #include <string>
+#include <vector>
+
+#include <android-base/properties.h>
+#include <gtest/gtest.h>
 
 #include "utils.h"
 
@@ -34,4 +38,29 @@
     pclose(p);
   }
   return device_supports_feature;
+}
+
+int getFirstApiLevel() {
+  int level = android::base::GetIntProperty("ro.product.first_api_level", 0);
+  if (level == 0) {
+    level = android::base::GetIntProperty("ro.build.version.sdk", 0);
+  }
+  if (level == 0) {
+    ADD_FAILURE() << "Failed to determine first API level";
+  }
+  return level;
+}
+
+int getVendorApiLevel() {
+    std::vector<std::string> BOARD_API_LEVEL_PROPS = {
+            "ro.board.api_level", "ro.board.first_api_level", "ro.vndk.version",
+            "ro.vendor.build.version.sdk"};
+    const int API_LEVEL_CURRENT = 10000;
+    for (const auto& api_level_prop : BOARD_API_LEVEL_PROPS) {
+        int api_level = android::base::GetIntProperty(api_level_prop, API_LEVEL_CURRENT);
+        if (api_level != API_LEVEL_CURRENT) {
+            return api_level;
+        }
+    }
+    return API_LEVEL_CURRENT;
 }
\ No newline at end of file
diff --git a/tests/tests/security/native/utils.h b/tests/tests/security/native/utils.h
index d6c651c..3176dbb 100644
--- a/tests/tests/security/native/utils.h
+++ b/tests/tests/security/native/utils.h
@@ -18,5 +18,7 @@
 #define CTS_TESTS_TESTS_SECURITY_NATIVE_UTILS_H
 
 bool deviceSupportsFeature(const char *feature);
+int getFirstApiLevel();
+int getVendorApiLevel();
 
 #endif  // CTS_TESTS_TESTS_SECURITY_NATIVE_UTILS_H
diff --git a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
index 625ef66..424da9a9 100644
--- a/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
+++ b/tests/tests/security/native/verified_boot/VerifiedBootTest.cpp
@@ -28,23 +28,14 @@
 // The relevant Android API levels
 constexpr auto S_API_LEVEL = 31;
 
-static int getFirstApiLevel() {
-  int level = android::base::GetIntProperty("ro.product.first_api_level", 0);
-  if (level == 0) {
-    level = android::base::GetIntProperty("ro.build.version.sdk", 0);
-  }
-  if (level == 0) {
-    ADD_FAILURE() << "Failed to determine first API level";
-  }
-  return level;
-}
-
 // As required by CDD, verified boot MUST use verification algorithms as strong
 // as current recommendations from NIST for hashing algorithms (SHA-256).
 // https://source.android.com/compatibility/11/android-11-cdd#9_10_device_integrity
 TEST(VerifiedBootTest, avbHashtreeNotUsingSha1) {
   int first_api_level = getFirstApiLevel();
+  int vendor_api_level = getVendorApiLevel();
   GTEST_LOG_(INFO) << "First API level is " << first_api_level;
+  GTEST_LOG_(INFO) << "Vendor API level is " << vendor_api_level;
   if (first_api_level < S_API_LEVEL) {
     GTEST_LOG_(INFO)
         << "Exempt from avb hash tree test due to old starting API level";
@@ -52,11 +43,24 @@
   }
 
   // This feature name check only applies to devices that first shipped with
-  // SC or later. The check above already screens out pre-S devices.
-  if(!deviceSupportsFeature("android.hardware.security.model.compatible")) {
+  // SC or later.
+  int min_api_level = (first_api_level < vendor_api_level) ? first_api_level
+                                                           : vendor_api_level;
+  if (min_api_level >= S_API_LEVEL &&
+      !deviceSupportsFeature("android.hardware.security.model.compatible")) {
       GTEST_SKIP()
           << "Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.";
-    return;
+      return;
+  }
+
+  android::fs_mgr::Fstab mounted_fstab;
+  ASSERT_TRUE(ReadFstabFromFile("/proc/mounts", &mounted_fstab))
+      << "Failed to read the mounted fstab";
+  // Build a list of mount points that are either mounted or known to have
+  // importance.
+  std::set<std::string> mount_points = {"/", "/system"};
+  for (const auto& entry : mounted_fstab) {
+    mount_points.insert(entry.mount_point);
   }
   android::fs_mgr::Fstab fstab;
   ASSERT_TRUE(ReadDefaultFstab(&fstab)) << "Failed to read default fstab";
@@ -66,13 +70,19 @@
       continue;
     }
 
+    if (mount_points.find(entry.mount_point) == mount_points.end()) {
+      GTEST_LOG_(INFO) << entry.mount_point << " isn't mounted, skipping"
+          << " hashtree algorithm verification";
+      continue;
+    }
+
     if (android::base::EqualsIgnoreCase(entry.fs_type, "emmc")) {
       GTEST_LOG_(INFO) << entry.mount_point << " has emmc fs_type, skipping"
           << " hashtree algorithm verification";
       continue;
     }
 
-    GTEST_LOG_(ERROR) << "partition enabled verity " << entry.mount_point;
+    GTEST_LOG_(INFO) << "partition enabled verity " << entry.mount_point;
 
     // The verity sysprop use "system" as the partition name in the system as
     // root case.
diff --git a/tests/tests/security/src/android/security/cts/EncryptionTest.java b/tests/tests/security/src/android/security/cts/EncryptionTest.java
index 7a40bb6..f6c5240 100644
--- a/tests/tests/security/src/android/security/cts/EncryptionTest.java
+++ b/tests/tests/security/src/android/security/cts/EncryptionTest.java
@@ -51,7 +51,9 @@
         Context context = InstrumentationRegistry.getInstrumentation().getContext();
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+        final int firstApiLevel =
+                Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+        if (firstApiLevel >= Build.VERSION_CODES.S) {
             // Assumes every test in this file asserts a requirement of CDD section 9.
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     !context.getPackageManager()
diff --git a/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java b/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
index 64b3c33..a0f2aea 100644
--- a/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
+++ b/tests/tests/security/src/android/security/cts/FileIntegrityManagerTest.java
@@ -62,7 +62,9 @@
         mContext = InstrumentationRegistry.getInstrumentation().getContext();
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+        final int firstApiLevel =
+                Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+        if (firstApiLevel >= Build.VERSION_CODES.S) {
             // Assumes every test in this file asserts a requirement of CDD section 9.
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     mContext.getPackageManager()
diff --git a/tests/tests/security/src/android/security/cts/VerifiedBootTest.java b/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
index 6342bf4..fb5d621 100644
--- a/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
+++ b/tests/tests/security/src/android/security/cts/VerifiedBootTest.java
@@ -43,7 +43,9 @@
         mContext = InstrumentationRegistry.getInstrumentation().getContext();
         // This feature name check only applies to devices that first shipped with
         // SC or later.
-        if (PropertyUtil.getFirstApiLevel() >= Build.VERSION_CODES.S) {
+        final int firstApiLevel =
+                Math.min(PropertyUtil.getFirstApiLevel(), PropertyUtil.getVendorApiLevel());
+        if (firstApiLevel >= Build.VERSION_CODES.S) {
             // Assumes every test in this file asserts a requirement of CDD section 9.
             assumeTrue("Skipping test: FEATURE_SECURITY_MODEL_COMPATIBLE missing.",
                     mContext.getPackageManager()
diff --git a/tests/tests/telephony/OWNERS b/tests/tests/telephony/OWNERS
index 1111752..c26db0f 100644
--- a/tests/tests/telephony/OWNERS
+++ b/tests/tests/telephony/OWNERS
@@ -1,5 +1,4 @@
 # Bug component: 20868
-amitmahajan@google.com
 breadley@google.com
 fionaxu@google.com
 jackyu@google.com
@@ -7,11 +6,10 @@
 tgunn@google.com
 jminjie@google.com
 shuoq@google.com
-nazaninb@google.com
 sarahchin@google.com
 xiaotonj@google.com
 huiwang@google.com
 jayachandranc@google.com
 chinmayd@google.com
 amruthr@google.com
-
+sasindran@google.com
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
index 2e39996..75383bf 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/AvailableNetworkInfoTest.java
@@ -20,6 +20,7 @@
 
 import android.os.Parcel;
 import android.telephony.AvailableNetworkInfo;
+import android.telephony.RadioAccessSpecifier;
 
 import org.junit.Test;
 
@@ -29,17 +30,28 @@
 public class AvailableNetworkInfoTest {
     private static final String OPERATOR_MCCMNC_1 = "123456";
     private static final String OPERATOR_MCCMNC_2 = "246135";
+    private static final RadioAccessSpecifier RAS_1 =
+        new RadioAccessSpecifier(1, new int[]{2,4,6,8}, new int[]{1,3,5,7});
+    private static final RadioAccessSpecifier RAS_2 =
+        new RadioAccessSpecifier(2, new int[]{1,3,5,7}, new int[]{2,4,6,8});
     private static final int SUB_ID = 123;
 
+    private static List<String> mccMncs = new ArrayList<String>();
+    private static List<Integer> bands = new ArrayList<Integer>();
+    private static List<RadioAccessSpecifier> ras = new ArrayList<RadioAccessSpecifier>();
+
+    static {
+        mccMncs.add(OPERATOR_MCCMNC_1);
+        mccMncs.add(OPERATOR_MCCMNC_2);
+
+        ras.add(RAS_1);
+        ras.add(RAS_2);
+    }
+
     @Test
     public void testAvailableNetworkInfo() {
-        List<String> mccMncs = new ArrayList<String>();
-        mccMncs.add(OPERATOR_MCCMNC_1);
-        mccMncs.add(OPERATOR_MCCMNC_2);
-        List<Integer> bands = new ArrayList<Integer>();
-
         AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(SUB_ID,
-                AvailableNetworkInfo.PRIORITY_HIGH, mccMncs, bands);
+            AvailableNetworkInfo.PRIORITY_HIGH, mccMncs, bands);
         assertEquals(0, availableNetworkInfo.describeContents());
         assertEquals(SUB_ID, availableNetworkInfo.getSubId());
         assertEquals(AvailableNetworkInfo.PRIORITY_HIGH, availableNetworkInfo.getPriority());
@@ -50,7 +62,44 @@
         availableNetworkInfo.writeToParcel(availableNetworkInfoParcel, 0);
         availableNetworkInfoParcel.setDataPosition(0);
         AvailableNetworkInfo tempAvailableNetworkInfo =
-                AvailableNetworkInfo.CREATOR.createFromParcel(availableNetworkInfoParcel);
+            AvailableNetworkInfo.CREATOR.createFromParcel(availableNetworkInfoParcel);
         assertTrue(tempAvailableNetworkInfo.equals(availableNetworkInfo));
     }
-}
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAvailableNetworkInfoBuilder_invalidPriority_throwsIllegalArgumentException() {
+        AvailableNetworkInfo.Builder availableNetworkInfo =
+            new AvailableNetworkInfo.Builder(SUB_ID)
+                .setPriority(0);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testAvailableNetworkInfoBuilder_nullMccMnc_throwsNullPointerException() {
+        AvailableNetworkInfo.Builder availableNetworkInfo =
+            new AvailableNetworkInfo.Builder(SUB_ID)
+                .setMccMncs(null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testAvailableNetworkInfoBuilder_nullRAS_throwsNullPointerException() {
+        AvailableNetworkInfo.Builder availableNetworkInfo =
+            new AvailableNetworkInfo.Builder(SUB_ID)
+                .setRadioAccessSpecifiers(null);
+    }
+
+    @Test
+    public void testAvailableNetworkInfoBuilder_success() {
+        AvailableNetworkInfo availableNetworkInfo =
+            new AvailableNetworkInfo.Builder(SUB_ID)
+                .setMccMncs(mccMncs)
+                .setPriority(AvailableNetworkInfo.PRIORITY_HIGH)
+                .setRadioAccessSpecifiers(ras)
+                .build();
+
+        assertEquals(SUB_ID, availableNetworkInfo.getSubId());
+        assertEquals(AvailableNetworkInfo.PRIORITY_HIGH, availableNetworkInfo.getPriority());
+        assertEquals(mccMncs, availableNetworkInfo.getMccMncs());
+        assertEquals(ras, availableNetworkInfo.getRadioAccessSpecifiers());
+        assertEquals(bands, availableNetworkInfo.getBands());
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java b/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
index 5740272..7faf091 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/DataProfileTest.java
@@ -18,9 +18,15 @@
 
 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.fail;
+
 import android.os.Parcel;
+import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
 import android.telephony.data.DataProfile;
+import android.telephony.data.TrafficDescriptor;
 
 import org.junit.Test;
 
@@ -33,9 +39,9 @@
     private static final String PASSWORD = "PASSWORD";
     private static final int TYPE = DataProfile.TYPE_3GPP2;
     private static final boolean IS_ENABLED = true;
-    private static final int APN_BITMASK = 1;
+    private static final int APN_BITMASK = ApnSetting.TYPE_DEFAULT;
     private static final int ROAMING_PROTOCOL_TYPE = ApnSetting.PROTOCOL_IP;
-    private static final int BEARER_BITMASK = 14;
+    private static final int BEARER_BITMASK = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
     private static final int MTU_V4 = 1440;
     private static final int MTU_V6 = 1400;
     private static final boolean IS_PREFERRED = true;
@@ -188,5 +194,130 @@
 
         DataProfile parcelProfile = DataProfile.CREATOR.createFromParcel(stateParcel);
         assertThat(profile).isEqualTo(parcelProfile);
+
+        ApnSetting apnSetting = new ApnSetting.Builder()
+                .setEntryName(APN)
+                .setApnName(APN)
+                .setApnTypeBitmask(APN_BITMASK)
+                .setNetworkTypeBitmask(BEARER_BITMASK)
+                .setMtuV4(MTU_V4)
+                .setMtuV6(MTU_V6)
+                .setModemCognitive(IS_PERSISTENT)
+                .setProtocol(PROTOCOL_TYPE)
+                .setRoamingProtocol(ROAMING_PROTOCOL_TYPE)
+                .setUser(USER_NAME)
+                .setPassword(PASSWORD)
+                .setCarrierEnabled(IS_ENABLED)
+                .setProfileId(PROFILE_ID)
+                .setAuthType(AUTH_TYPE)
+                .build();
+
+        byte[] osAppId = {1, 2, 3, 4};
+        TrafficDescriptor td = new TrafficDescriptor.Builder()
+                .setDataNetworkName(APN)
+                .setOsAppId(osAppId)
+                .build();
+
+        profile = new DataProfile.Builder()
+                .setApnSetting(apnSetting)
+                .setTrafficDescriptor(td)
+                .build();
+
+        stateParcel = Parcel.obtain();
+        profile.writeToParcel(stateParcel, 0);
+        stateParcel.setDataPosition(0);
+
+        parcelProfile = DataProfile.CREATOR.createFromParcel(stateParcel);
+        assertThat(profile).isEqualTo(parcelProfile);
+
+        stateParcel.recycle();
+    }
+
+    @Test
+    public void testGetApnSetting() {
+        ApnSetting apnSetting = new ApnSetting.Builder()
+                .setEntryName(APN)
+                .setApnName(APN)
+                .setApnTypeBitmask(APN_BITMASK)
+                .setNetworkTypeBitmask(BEARER_BITMASK)
+                .setMtuV4(MTU_V4)
+                .setMtuV6(MTU_V6)
+                .setModemCognitive(IS_PERSISTENT)
+                .setProtocol(PROTOCOL_TYPE)
+                .setRoamingProtocol(ROAMING_PROTOCOL_TYPE)
+                .setUser(USER_NAME)
+                .setPassword(PASSWORD)
+                .setCarrierEnabled(IS_ENABLED)
+                .setProfileId(PROFILE_ID)
+                .setAuthType(AUTH_TYPE)
+                .build();
+
+        DataProfile profile = new DataProfile.Builder()
+                .setApnSetting(apnSetting)
+                .build();
+
+        assertEquals(apnSetting, profile.getApnSetting());
+    }
+
+    @Test
+    public void testGetTrafficDescriptor() {
+        byte[] osAppId = {1, 2, 3, 4};
+        TrafficDescriptor td = new TrafficDescriptor.Builder()
+                .setDataNetworkName(APN)
+                .setOsAppId(osAppId)
+                .build();
+
+        DataProfile profile = new DataProfile.Builder()
+                .setTrafficDescriptor(td)
+                .build();
+
+        assertEquals(td, profile.getTrafficDescriptor());
+    }
+
+    @Test
+    public void testNullApnSetting() {
+        byte[] osAppId = {1, 2, 3, 4};
+        TrafficDescriptor td = new TrafficDescriptor.Builder()
+                .setDataNetworkName(APN)
+                .setOsAppId(osAppId)
+                .build();
+        DataProfile profile = new DataProfile.Builder()
+                .setApnSetting(null)
+                .setTrafficDescriptor(td)
+                .build();
+
+        assertEquals("", profile.getApn());
+        assertEquals(null, profile.getApnSetting());
+        assertEquals(ApnSetting.AUTH_TYPE_NONE, profile.getAuthType());
+        assertEquals((int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN,
+                profile.getBearerBitmask());
+        assertEquals(0, profile.getMtu());
+        assertEquals(0, profile.getMtuV4());
+        assertEquals(0, profile.getMtuV6());
+        assertEquals(null, profile.getUserName());
+        assertEquals(null, profile.getPassword());
+        assertEquals(0, profile.getProfileId());
+        assertEquals(ApnSetting.PROTOCOL_IP, profile.getProtocolType());
+        assertEquals(ApnSetting.PROTOCOL_IP, profile.getRoamingProtocolType());
+        assertEquals(ApnSetting.TYPE_NONE, profile.getSupportedApnTypesBitmask());
+        assertEquals(DataProfile.TYPE_COMMON, profile.getType());
+        assertFalse(profile.isEnabled());
+        assertFalse(profile.isPersistent());
+        assertFalse(profile.isPreferred());
+        assertEquals(td, profile.getTrafficDescriptor());
+    }
+
+    @Test
+    public void illegalDataProfile() {
+        try {
+            DataProfile profile = new DataProfile.Builder()
+                    .setApnSetting(null)
+                    .setTrafficDescriptor(null)
+                    .build();
+            fail("Should throw exception if both APN setting and traffic descriptor are null.");
+        } catch (IllegalArgumentException ex) {
+            // Expected to get illegal argument exception.
+        }
+
     }
 }
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 5c9d8b9..dfe41cf 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -279,53 +279,6 @@
         assertTrue(mOnSignalStrengthChangedCalled);
     }
 
-     /**
-     * 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 testOnAlwaysReportedSignalStrengthChanged() throws Throwable {
-        if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
-            Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
-            return;
-        }
-
-        assertTrue(mSignalStrength == null);
-
-        mHandler.post(() -> {
-            mListener = new PhoneStateListener() {
-                @Override
-                public void onSignalStrengthsChanged(SignalStrength signalStrength) {
-                    synchronized (mLock) {
-                        mSignalStrength = signalStrength;
-                        mLock.notify();
-                    }
-                }
-            };
-            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
-                    (tm) -> tm.listen(mListener,
-                            PhoneStateListener.LISTEN_ALWAYS_REPORTED_SIGNAL_STRENGTH));
-        });
-        synchronized (mLock) {
-            if (mSignalStrength == null) {
-                mLock.wait(WAIT_TIME);
-            }
-        }
-
-        assertTrue(mSignalStrength != null);
-        // Call SignalStrength methods to make sure they do not throw any exceptions
-        mSignalStrength.getCdmaDbm();
-        mSignalStrength.getCdmaEcio();
-        mSignalStrength.getEvdoDbm();
-        mSignalStrength.getEvdoEcio();
-        mSignalStrength.getEvdoSnr();
-        mSignalStrength.getGsmBitErrorRate();
-        mSignalStrength.getGsmSignalStrength();
-        mSignalStrength.isGsm();
-        mSignalStrength.getLevel();
-    }
-    */
-
     @Test
     public void testOnSignalStrengthsChanged() throws Throwable {
         if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
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 e61f748..729b444 100755
--- a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
@@ -232,8 +232,10 @@
     public void testActiveSubscriptions() throws Exception {
         if (!isSupported()) return;
 
-        List<SubscriptionInfo> subList = mSm.getActiveSubscriptionInfoList();
-        int[] idList = mSm.getActiveSubscriptionIdList();
+        List<SubscriptionInfo> subList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+                (sm) -> sm.getActiveSubscriptionInfoList());
+        int[] idList = ShellIdentityUtils.invokeMethodWithShellPermissions(mSm,
+                (sm) -> sm.getActiveSubscriptionIdList());
         // Assert when there is no sim card present or detected
         assertNotNull("Active subscriber required", subList);
         assertNotNull("Active subscriber required", idList);
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 d60fee5..55c8467 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
@@ -1422,7 +1422,8 @@
             return;
         }
 
-        int[] allSubs = mSubscriptionManager.getActiveSubscriptionIdList();
+        int[] allSubs  = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mSubscriptionManager, (sm) ->sm.getActiveSubscriptionIdList());
         // generate a subscription that is valid (>0) but inactive (not part of active subId list)
         // A simple way to do this is sum the active subIds and add 1
         int inactiveValidSub = 1;
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java b/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
index b20ea16..ea46c9b 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/util/CarrierPrivilegeUtils.java
@@ -160,11 +160,9 @@
             // the CarrierConfig override (as it will override the existing shell permissions).
             if (isShell) {
                 configManager.overrideConfig(subId, carrierConfigs);
-                configManager.notifyConfigChangedForSubId(subId);
             } else {
                 runWithShellPermissionIdentity(() -> {
                     configManager.overrideConfig(subId, carrierConfigs);
-                    configManager.notifyConfigChangedForSubId(subId);
                 }, android.Manifest.permission.MODIFY_PHONE_STATE);
             }
 
diff --git a/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java b/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
index c5baf84..0a16299 100644
--- a/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/gba/cts/GbaServiceTest.java
@@ -328,8 +328,11 @@
                 PackageManager.FEATURE_TELEPHONY)) {
             return false;
         }
-        int[] activeSubs = InstrumentationRegistry.getContext().getSystemService(
-                SubscriptionManager.class).getActiveSubscriptionIdList();
+
+        SubscriptionManager subscriptionManager = InstrumentationRegistry.getContext()
+                .getSystemService(SubscriptionManager.class);
+        int[] activeSubs = ShellIdentityUtils.invokeMethodWithShellPermissions(subscriptionManager,
+                (sm) -> sm.getActiveSubscriptionIdList());
         if (activeSubs.length == 0) {
             return false;
         }
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
index c707d0e..e962912 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsMmTelManagerTest.java
@@ -37,6 +37,7 @@
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsStateCallback;
 import android.telephony.ims.feature.MmTelFeature;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -576,6 +577,59 @@
         } catch (SecurityException e) {
             fail("getRegistrationTransportType requires READ_PRIVILEGED_PHONE_STATE permission.");
         }
+
+        ImsStateCallback callback = new ImsStateCallback() {
+            @Override
+            public void onUnavailable(int reason) { }
+            @Override
+            public void onAvailable() { }
+            @Override
+            public void onError() { }
+        };
+
+        try {
+            mMmTelManager.registerImsStateCallback(Runnable::run, callback);
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (SecurityException e) {
+            //expected
+        } catch (ImsException ie) {
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(mMmTelManager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.READ_PRECISE_PHONE_STATE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            mMmTelManager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            fail("uregisterImsStateCallback requires no permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(mMmTelManager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            mMmTelManager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            // unreachable, already passed permission check
+            fail("uregisterImsStateCallback requires no permission.");
+        }
     }
 
     private void overrideCarrierConfig(PersistableBundle bundle) throws Exception {
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java
new file mode 100644
index 0000000..e5d9804
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsRcsManagerTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.telephony.ims.cts;
+
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+import android.os.Looper;
+import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsRcsManager;
+import android.telephony.ims.ImsStateCallback;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.ShellIdentityUtils;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class ImsRcsManagerTest {
+
+    private static int sTestSub = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+    @BeforeClass
+    public static void beforeAllTests() {
+        // assumeTrue() in @BeforeClass is not supported by our test runner.
+        // Resort to the early exit.
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        sTestSub = ImsUtils.getPreferredActiveSubId();
+
+        if (Looper.getMainLooper() == null) {
+            Looper.prepareMainLooper();
+        }
+    }
+
+    @Before
+    public void beforeTest() {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        if (!SubscriptionManager.isValidSubscriptionId(sTestSub)) {
+            fail("This test requires that there is a SIM in the device!");
+        }
+    }
+
+    /**
+     * Test Permissions on various APIs.
+     */
+    @Test
+    public void testMethodPermissions() throws Exception {
+        if (!ImsUtils.shouldTestTelephony()) {
+            return;
+        }
+
+        // This verifies the permission checking in ITelephony,
+        // not the IMS service's behavior.
+        // Since SecurityException has the highest priority,
+        // DEFAULT_SUBSCRIPTION_ID is enough to check permissions.
+        // Though it throws an ImsException, we ignore that.
+        if (sTestSub == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            sTestSub = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+        }
+
+        ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+        ImsRcsManager rcsManager = imsManager.getImsRcsManager(sTestSub);
+
+        ImsStateCallback callback = new ImsStateCallback() {
+            @Override
+            public void onUnavailable(int reason) { }
+            @Override
+            public void onAvailable() { }
+            @Override
+            public void onError() { }
+        };
+
+        try {
+            rcsManager.registerImsStateCallback(Runnable::run, callback);
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE, "
+                    + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (SecurityException e) {
+            //expected
+        } catch (ImsException ie) {
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE, "
+                    + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.READ_PRECISE_PHONE_STATE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires READ_PRECISE_PHONE_STATE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            rcsManager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            fail("uregisterImsStateCallback requires no permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.ACCESS_RCS_USER_CAPABILITY_EXCHANGE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires "
+                    + "ACCESS_RCS_USER_CAPABILITY_EXCHANGE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            rcsManager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            // unreachable, already passed permission check
+            fail("uregisterImsStateCallback requires no permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(rcsManager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            rcsManager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            // unreachable, already passed permission check
+            fail("uregisterImsStateCallback requires no permission.");
+        }
+    }
+
+    private static Context getContext() {
+        return InstrumentationRegistry.getInstrumentation().getContext();
+    }
+}
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 4970d89..e9fc555 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
@@ -48,12 +48,14 @@
 import android.telephony.ims.ImsRcsManager;
 import android.telephony.ims.ImsReasonInfo;
 import android.telephony.ims.ImsRegistrationAttributes;
+import android.telephony.ims.ImsStateCallback;
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.RcsClientConfiguration;
 import android.telephony.ims.RcsContactUceCapability;
 import android.telephony.ims.RcsUceAdapter;
 import android.telephony.ims.RegistrationManager;
 import android.telephony.ims.RtpHeaderExtensionType;
+import android.telephony.ims.SipDelegateManager;
 import android.telephony.ims.feature.ImsFeature;
 import android.telephony.ims.feature.MmTelFeature;
 import android.telephony.ims.feature.RcsFeature.RcsImsCapabilities;
@@ -198,6 +200,8 @@
     private static final String FILE_TRANSFER_SERVICE_ID =
             "org.openmobilealliance:File-Transfer-HTTP";
 
+    private static final int FEATURE_STATE_READY = 0;
+
     private static CarrierConfigReceiver sReceiver;
     private static SingleRegistrationCapabilityReceiver sSrcReceiver;
 
@@ -3531,6 +3535,267 @@
         }
     }
 
+    @Test
+    public void testImsMmTelManagerImsStateCallback() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+        if (imsManager == null) {
+            fail("Cannot find IMS service");
+        }
+
+        LinkedBlockingQueue<Integer> stateQueue = new LinkedBlockingQueue<>();
+        ImsStateCallback callback = buildImsStateCallback(stateQueue);
+
+        ImsMmTelManager mmTelManager = null;
+        final UiAutomation automan = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        try {
+            automan.adoptShellPermissionIdentity();
+            mmTelManager = imsManager.getImsMmTelManager(sTestSub);
+            mmTelManager.registerImsStateCallback(getContext().getMainExecutor(), callback);
+        } finally {
+            automan.dropShellPermissionIdentity();
+        }
+
+        int reason = waitForIntResult(stateQueue);
+        assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+                || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+                || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+                || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+        mmTelManager.unregisterImsStateCallback(callback);
+
+        // Connect to device ImsService with MmTelFeature
+        triggerFrameworkConnectToCarrierImsService();
+
+        stateQueue = new LinkedBlockingQueue<>();
+        callback = buildImsStateCallback(stateQueue);
+
+        try {
+            automan.adoptShellPermissionIdentity();
+            mmTelManager.registerImsStateCallback(getContext().getMainExecutor(), callback);
+        } finally {
+            automan.dropShellPermissionIdentity();
+        }
+
+        // expects FEATURE_MMTEL STATE_READY
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(stateQueue));
+
+        if (sServiceConnector != null) {
+            sServiceConnector.getCarrierService().getMmTelFeature().setFeatureState(
+                    ImsFeature.STATE_INITIALIZING);
+        }
+
+        // expects NOT_READY
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+                waitForIntResult(stateQueue));
+
+        // Unbind the GTS ImsService
+        if (sServiceConnector != null) {
+            sServiceConnector.disconnectCarrierImsService();
+        }
+
+        // expects DISCONNECTED
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+                waitForIntResult(stateQueue));
+
+        mmTelManager.unregisterImsStateCallback(callback);
+    }
+
+    @Test
+    public void testImsRcsManagerImsStateCallback() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+        if (imsManager == null) {
+            fail("Cannot find IMS service");
+        }
+
+        LinkedBlockingQueue<Integer> rcsQueue = new LinkedBlockingQueue<>();
+        ImsStateCallback rcsCallback = buildImsStateCallback(rcsQueue);
+
+        LinkedBlockingQueue<Integer> sipQueue = new LinkedBlockingQueue<>();
+        ImsStateCallback sipCallback = buildImsStateCallback(sipQueue);
+
+        ImsRcsManager imsRcsManager;
+        SipDelegateManager imsSipManager;
+        final UiAutomation automan = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        try {
+            automan.adoptShellPermissionIdentity();
+            imsRcsManager = imsManager.getImsRcsManager(sTestSub);
+            imsRcsManager.registerImsStateCallback(getContext().getMainExecutor(), rcsCallback);
+            imsSipManager = imsManager.getSipDelegateManager(sTestSub);
+            imsSipManager.registerImsStateCallback(getContext().getMainExecutor(), sipCallback);
+        } finally {
+            automan.dropShellPermissionIdentity();
+        }
+
+        int reason = waitForIntResult(rcsQueue);
+        assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+                || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+                || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+                || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+        reason = waitForIntResult(sipQueue);
+        assertTrue(reason == ImsStateCallback.REASON_UNKNOWN_TEMPORARY_ERROR
+                || reason == ImsStateCallback.REASON_UNKNOWN_PERMANENT_ERROR
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED
+                || reason == ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED
+                || reason == ImsStateCallback.REASON_SUBSCRIPTION_INACTIVE
+                || reason == ImsStateCallback.REASON_IMS_SERVICE_NOT_READY);
+
+        imsRcsManager.unregisterImsStateCallback(rcsCallback);
+        imsSipManager.unregisterImsStateCallback(sipCallback);
+
+        // Override the carrier config
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+        bundle.putBoolean(
+                CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+        overrideCarrierConfig(bundle);
+
+        // Connect to device ImsService with RcsFeature
+        triggerFrameworkConnectToLocalImsServiceBindRcsFeature();
+
+        rcsQueue = new LinkedBlockingQueue<>();
+        rcsCallback = buildImsStateCallback(rcsQueue);
+
+        sipQueue = new LinkedBlockingQueue<>();
+        sipCallback = buildImsStateCallback(sipQueue);
+
+        try {
+            automan.adoptShellPermissionIdentity();
+            imsRcsManager.registerImsStateCallback(getContext().getMainExecutor(), rcsCallback);
+            imsSipManager.registerImsStateCallback(getContext().getMainExecutor(), sipCallback);
+        } finally {
+            automan.dropShellPermissionIdentity();
+        }
+
+        // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(sipQueue));
+
+        // Override the carrier config
+        bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+        overrideCarrierConfig(bundle);
+
+        // Wait for the framework to set the capabilities on the ImsService
+        sServiceConnector.getCarrierService().waitForLatchCountdown(
+                TestImsService.LATCH_RCS_CAP_SET);
+
+        // expects FEATURE_RCS, STATE_READY
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+        bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(sipQueue));
+
+        // Override the carrier config
+        bundle = new PersistableBundle();
+        bundle.putBoolean(
+                CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, STATE_READY
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+        bundle = new PersistableBundle();
+        bundle.putBoolean(
+                CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(sipQueue));
+
+        // Override the carrier config
+        bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+        bundle.putBoolean(
+                CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, STATE_READY
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+        bundle = new PersistableBundle();
+        bundle.putBoolean(
+                CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+        overrideCarrierConfig(bundle);
+
+        // ensure no change in state since having one active feature
+        reason = waitForIntResult(rcsQueue, 3000);
+        assertEquals(Integer.MAX_VALUE, reason);
+        reason = waitForIntResult(sipQueue, 1000);
+        assertEquals(Integer.MAX_VALUE, reason);
+
+        bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, NO_IMS_SERVICE_CONFIGURED
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_NO_IMS_SERVICE_CONFIGURED,
+                waitForIntResult(sipQueue));
+
+        // Override the carrier config
+        bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.Ims.KEY_ENABLE_PRESENCE_PUBLISH_BOOL, true);
+        overrideCarrierConfig(bundle);
+
+        // expects FEATURE_RCS, STATE_READY
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(rcsQueue));
+        assertEquals(FEATURE_STATE_READY, waitForIntResult(sipQueue));
+
+        if (sServiceConnector != null) {
+            sServiceConnector.getCarrierService().getRcsFeature().setFeatureState(
+                    ImsFeature.STATE_INITIALIZING);
+        }
+
+        // expects NOT_READY
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_NOT_READY,
+                waitForIntResult(sipQueue));
+
+        // Unbind the GTS ImsService
+        if (sServiceConnector != null) {
+            sServiceConnector.disconnectCarrierImsService();
+        }
+
+        // expects DISCONNECTED
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+                waitForIntResult(rcsQueue));
+        assertEquals(ImsStateCallback.REASON_IMS_SERVICE_DISCONNECTED,
+                waitForIntResult(sipQueue));
+
+        imsRcsManager.unregisterImsStateCallback(rcsCallback);
+        imsSipManager.unregisterImsStateCallback(sipCallback);
+    }
+
     private void verifyIntKey(ProvisioningManager pm,
             LinkedBlockingQueue<Pair<Integer, Integer>> intQueue, int key, int value)
             throws Exception {
@@ -3655,6 +3920,25 @@
                 sTestSlot, serviceSlot);
     }
 
+    private ImsStateCallback buildImsStateCallback(final LinkedBlockingQueue<Integer> stateQueue) {
+        return new ImsStateCallback() {
+            @Override
+            public void onUnavailable(int reason) {
+                stateQueue.offer(reason);
+            }
+
+            @Override
+            public void onAvailable() {
+                stateQueue.offer(FEATURE_STATE_READY);
+            }
+
+            @Override
+            public void onError() {
+                stateQueue.offer(-1);
+            }
+        };
+    }
+
     private ProvisioningManager.RcsProvisioningCallback buildRcsProvisioningCallback(
             LinkedBlockingQueue<Integer> actionQueue,
             LinkedBlockingQueue<RcsProvisioningCallbackParams> paramQueue) {
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
index 13e9a33..e8e4aec 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
@@ -43,6 +43,7 @@
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsService;
+import android.telephony.ims.ImsStateCallback;
 import android.telephony.ims.SipDelegateConfiguration;
 import android.telephony.ims.SipDelegateManager;
 import android.telephony.ims.SipMessage;
@@ -325,6 +326,60 @@
         } catch (SecurityException e) {
             //expected
         }
+
+
+        ImsStateCallback callback = new ImsStateCallback() {
+            @Override
+            public void onUnavailable(int reason) { }
+            @Override
+            public void onAvailable() { }
+            @Override
+            public void onError() { }
+        };
+
+        try {
+            manager.registerImsStateCallback(Runnable::run, callback);
+            fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (SecurityException e) {
+            //expected
+        } catch (ImsException ignore) {
+            fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION or "
+                    + "READ_PRIVILEGED_PHONE_STATE permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(manager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.PERFORM_IMS_SINGLE_REGISTRATION");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires PERFORM_IMS_SINGLE_REGISTRATION permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            manager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            fail("uregisterImsStateCallback requires no permission.");
+        }
+
+        try {
+            ShellIdentityUtils.invokeThrowableMethodWithShellPermissionsNoReturn(manager,
+                    m -> m.registerImsStateCallback(Runnable::run, callback),
+                    ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE");
+        } catch (SecurityException e) {
+            fail("registerImsStateCallback requires READ_PRIVILEGED_PHONE_STATE permission.");
+        } catch (ImsException ignore) {
+            // don't care, permission check passed
+        }
+
+        try {
+            manager.unregisterImsStateCallback(callback);
+        } catch (SecurityException e) {
+            // unreachable, already passed permission check
+            fail("uregisterImsStateCallback requires no permission.");
+        }
     }
 
     @Test
diff --git a/tests/tests/vcn/OWNERS b/tests/tests/vcn/OWNERS
index 574aa9f..b3efc7b 100644
--- a/tests/tests/vcn/OWNERS
+++ b/tests/tests/vcn/OWNERS
@@ -1,3 +1,3 @@
 # Bug component: 685852
 nharold@google.com
-junyin@google.com
\ No newline at end of file
+yangji@google.com
\ No newline at end of file
diff --git a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
index f401d55..8376ccb 100644
--- a/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
+++ b/tests/tests/vcn/src/android/net/vcn/cts/VcnManagerTest.java
@@ -439,8 +439,10 @@
 
         // Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
         // waiting for VCN Network.
-        final NetworkRequest cellNetworkReq =
-                new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+        final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_CELLULAR)
+                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                .build();
         final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
         mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
         final Network cellNetwork = cellNetworkCb.waitForAvailable();
@@ -560,8 +562,10 @@
 
         // Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
         // waiting for VCN Network.
-        final NetworkRequest cellNetworkReq =
-                new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+        final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_CELLULAR)
+                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                .build();
         final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
         mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
         final Network cellNetwork = cellNetworkCb.waitForAvailable();
@@ -661,8 +665,10 @@
 
         // Get current cell Network then wait for it to drop (due to losing NOT_VCN_MANAGED) before
         // waiting for VCN Network.
-        final NetworkRequest cellNetworkReq =
-                new NetworkRequest.Builder().addTransportType(TRANSPORT_CELLULAR).build();
+        final NetworkRequest cellNetworkReq = new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_CELLULAR)
+                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                .build();
         final VcnTestNetworkCallback cellNetworkCb = new VcnTestNetworkCallback();
         mConnectivityManager.requestNetwork(cellNetworkReq, cellNetworkCb);
         final Network cellNetwork = cellNetworkCb.waitForAvailable();
diff --git a/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java b/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
index bf73550..b0a882c 100644
--- a/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
+++ b/tests/tests/view/src/android/view/cts/KeyEventInterceptTest.java
@@ -41,6 +41,9 @@
  *      KEYCODE_ASSIST
  *      KEYCODE_VOICE_ASSIST
  *      KEYCODE_HOME
+ *      KEYCODE_VIDEO_APP_X
+ *      KEYCODE_FEATURED_APP_X
+ *      KEYCODE_DEMO_APP_X
  * This test launches an Activity and injects KeyEvents with the corresponding key codes.
  * The test will fail if any of these keys are received by the activity.
  * Note: The ASSIST tests were removed because they caused a side-effect of launching the
@@ -76,6 +79,26 @@
     }
 
     @Test
+    public void testKeyCodesForLaunchingApplications() {
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_1);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_2);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_3);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_4);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_5);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_6);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_7);
+        testKey(KeyEvent.KEYCODE_VIDEO_APP_8);
+        testKey(KeyEvent.KEYCODE_FEATURED_APP_1);
+        testKey(KeyEvent.KEYCODE_FEATURED_APP_2);
+        testKey(KeyEvent.KEYCODE_FEATURED_APP_3);
+        testKey(KeyEvent.KEYCODE_FEATURED_APP_4);
+        testKey(KeyEvent.KEYCODE_DEMO_APP_1);
+        testKey(KeyEvent.KEYCODE_DEMO_APP_2);
+        testKey(KeyEvent.KEYCODE_DEMO_APP_3);
+        testKey(KeyEvent.KEYCODE_DEMO_APP_4);
+    }
+
+    @Test
     public void testKeyCodeHomeShortcutLeftMeta() {
         testKeyCodeHomeShortcut(KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON);
     }
diff --git a/tests/tests/voiceinteraction/common/Android.bp b/tests/tests/voiceinteraction/common/Android.bp
index e9052de..d667329 100644
--- a/tests/tests/voiceinteraction/common/Android.bp
+++ b/tests/tests/voiceinteraction/common/Android.bp
@@ -19,5 +19,6 @@
 java_library {
     name: "CtsVoiceInteractionCommon",
     srcs: ["src/**/*.java"],
-    sdk_version: "current",
+    static_libs: ["compatibility-device-util-axt"],
+    sdk_version: "test_current",
 }
diff --git a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
index 4a34e2a..29a8bb5 100644
--- a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
+++ b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
@@ -22,7 +22,10 @@
 import android.os.Parcelable;
 import android.util.Log;
 
+import com.android.compatibility.common.util.PropertyUtil;
+
 import java.util.ArrayList;
+import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
@@ -267,4 +270,10 @@
         }
         return bits;
     }
+
+    public static boolean isVirtualDevice() {
+        final String property = PropertyUtil.getProperty("ro.hardware.virtual_device");
+        Log.v(TAG, "virtual device property=" + property);
+        return Objects.equals(property, "1");
+    }
 }
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
index d63dc3d..9e547ad 100644
--- a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainHotwordDetectionService.java
@@ -310,6 +310,11 @@
                 }
                 numBytes += bytesRead;
             }
+            // The audio data will be zero on virtual device, so it would be better to skip to
+            // check the audio data.
+            if (Utils.isVirtualDevice()) {
+                return true;
+            }
             for (byte b : buffer) {
                 // TODO: Maybe check that some portion of the bytes are non-zero.
                 if (b != 0) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 47153af..0161540 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -38,8 +38,6 @@
 import android.webkit.cts.WebViewSyncLoader.WaitForLoadedClient;
 import android.util.Pair;
 
-import androidx.test.filters.FlakyTest;
-
 import com.android.compatibility.common.util.NullWebViewUtils;
 import com.android.compatibility.common.util.PollingCheck;
 import com.google.common.util.concurrent.SettableFuture;
@@ -144,7 +142,6 @@
 
     // Verify shouldoverrideurlloading called on webview called via onCreateWindow
     // TODO(sgurun) upstream this test to Aw.
-    @FlakyTest(bugId = 172331117)
     public void testShouldOverrideUrlLoadingOnCreateWindow() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
diff --git a/tests/video/src/android/video/cts/CodecInfo.java b/tests/video/src/android/video/cts/CodecInfo.java
index 4309a96..5b07326 100644
--- a/tests/video/src/android/video/cts/CodecInfo.java
+++ b/tests/video/src/android/video/cts/CodecInfo.java
@@ -43,6 +43,8 @@
     public boolean mSupportSemiPlanar = false;
     /** if codec is supporting YUV planar format */
     public boolean mSupportPlanar = false;
+    /** if codec is software-based */
+    public boolean mIsSoftware = false;
 
     private static final String TAG = "CodecInfo";
     private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
@@ -86,6 +88,8 @@
         info.mFps = format.getInteger(MediaFormat.KEY_FRAME_RATE);
         info.mBitRate = format.getInteger(MediaFormat.KEY_BIT_RATE);
 
+        info.mIsSoftware = !codec.getCodecInfo().isHardwareAccelerated();
+
         codec.release();
         return info;
     }
diff --git a/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java b/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
index ea15e91..4755b9a 100644
--- a/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
+++ b/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
@@ -143,6 +143,16 @@
 
     private TestConfig mTestConfig;
 
+    private static boolean isPreferredAbi() {
+        boolean prefers64Bit = false;
+        if (Build.SUPPORTED_64_BIT_ABIS.length > 0 &&
+                Build.SUPPORTED_ABIS.length > 0 &&
+                Build.SUPPORTED_ABIS[0].equals(Build.SUPPORTED_64_BIT_ABIS[0])) {
+            prefers64Bit = true;
+        }
+        return android.os.Process.is64Bit() ? prefers64Bit : !prefers64Bit;
+    }
+
     @Override
     protected void setUp() throws Exception {
         mEncodedOutputBuffer = new LinkedList<Pair<ByteBuffer, BufferInfo>>();
@@ -702,6 +712,7 @@
         if (MediaUtils.onFrankenDevice()) {
             mTestConfig.mMaxTimeMs /= 10;
         }
+        Log.i(TAG, "current ABI is " + (isPreferredAbi() ? "" : "not ") + "a preferred one");
 
         mVideoWidth = w;
         mVideoHeight = h;
@@ -811,7 +822,14 @@
             String error = MediaPerfUtils.verifyAchievableFrameRates(
                     encoderName, mimeType, w, h, measuredFps);
             // Performance numbers only make sense on real devices, so skip on non-real devices
-            if (MediaUtils.onFrankenDevice() && error != null) {
+            //
+            // Also ignore verification on non-preferred ABIs due to the possibility of
+            // this being emulated. On some CPU-s 32-bit mode is emulated using big cores
+            // that results in the SW codecs also running much faster (perhaps they are
+            // scheduled for the big cores as well)
+            // TODO: still verify lower bound.
+            if ((MediaUtils.onFrankenDevice() || (infoEnc.mIsSoftware && !isPreferredAbi()))
+                    && error != null) {
                 // ensure there is data, but don't insist that it is correct
                 assertFalse(error, error.startsWith("Failed to get "));
             } else {
diff --git a/tools/cts-dynamic-config/Android.bp b/tools/cts-dynamic-config/Android.bp
index c978ab2..61f9e54 100644
--- a/tools/cts-dynamic-config/Android.bp
+++ b/tools/cts-dynamic-config/Android.bp
@@ -33,7 +33,7 @@
     test_suites: [
         "cts",
         "general-tests",
-        "mts",
+        "mts-media",
     ],
     java_resources: [
         ":cts-dynamic-config.dynamic",
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
index b50c906..673d93c 100644
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/ApkPackageNameCheck.java
@@ -23,6 +23,7 @@
 import com.android.tradefed.config.ConfigurationException;
 import com.android.tradefed.config.ConfigurationFactory;
 import com.android.tradefed.config.IConfiguration;
+import com.android.tradefed.config.IDeviceConfiguration;
 import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.targetprep.PushFilePreparer;
 import com.android.tradefed.targetprep.TestAppInstallSetup;
@@ -87,64 +88,65 @@
             // For each config, we check all the apk it's going to install
             List<File> apkNames = new ArrayList<>();
             List<String> packageListNames = new ArrayList<>();
-            for (ITargetPreparer prep : c.getTargetPreparers()) {
-                if (prep instanceof TestAppInstallSetup) {
-                    apkNames.addAll(((TestAppInstallSetup) prep).getTestsFileName());
-                }
-                // Ensure the files requested to be pushed exist.
-                if (prep instanceof FilePusher && ((FilePusher) prep).shouldAppendBitness()) {
-                    for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
-                        String path = f.getPath();
-                        if (!new File(testcases, path + "32").exists()
-                                || !new File(testcases, path + "64").exists()) {
-                            // TODO: Enforce should abort on failure is True in CTS
-                            if (((FilePusher) prep).shouldAbortOnFailure()) {
-                                fail(
-                                        String.format(
-                                                "File %s[32/64] wasn't found in testcases/ while "
-                                                        + "it's expected to be pushed as part of "
-                                                        + "%s",
-                                                path, config.getName()));
+            for (IDeviceConfiguration dConfig : c.getDeviceConfig()) {
+                for (ITargetPreparer prep : dConfig.getTargetPreparers()) {
+                    if (prep instanceof TestAppInstallSetup) {
+                        apkNames.addAll(((TestAppInstallSetup) prep).getTestsFileName());
+                    }
+                    // Ensure the files requested to be pushed exist.
+                    if (prep instanceof FilePusher && ((FilePusher) prep).shouldAppendBitness()) {
+                        for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
+                            String path = f.getPath();
+                            if (!new File(testcases, path + "32").exists()
+                                    || !new File(testcases, path + "64").exists()) {
+                                // TODO: Enforce should abort on failure is True in CTS
+                                if (((FilePusher) prep).shouldAbortOnFailure()) {
+                                    fail(
+                                            String.format(
+                                                    "File %s[32/64] wasn't found in testcases/ while "
+                                                            + "it's expected to be pushed as part of "
+                                                            + "%s",
+                                                    path, config.getName()));
+                                }
                             }
                         }
-                    }
-                } else if (prep instanceof PushFilePreparer) {
-                    for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
-                        String path = f.getPath();
-                        if (!new File(testcases, path).exists()) {
-                            // TODO: Enforce should abort on failure is True in CTS
-                            if (((PushFilePreparer) prep).shouldAbortOnFailure()) {
-                                fail(
-                                        String.format(
-                                                "File %s wasn't found in testcases/ while it's "
-                                                        + "expected to be pushed as part of %s",
-                                                path, config.getName()));
+                    } else if (prep instanceof PushFilePreparer) {
+                        for (File f : ((PushFilePreparer) prep).getPushSpecs(null).values()) {
+                            String path = f.getPath();
+                            if (!new File(testcases, path).exists()) {
+                                // TODO: Enforce should abort on failure is True in CTS
+                                if (((PushFilePreparer) prep).shouldAbortOnFailure()) {
+                                    fail(
+                                            String.format(
+                                                    "File %s wasn't found in testcases/ while it's "
+                                                            + "expected to be pushed as part of %s",
+                                                    path, config.getName()));
+                                }
                             }
                         }
                     }
                 }
-            }
-
-            for (File apk : apkNames) {
-                String apkName = apk.getName();
-                File apkFile = new File(testcases, apkName);
-                if (!apkFile.exists()) {
-                    fail(String.format("Module %s is trying to install %s which does not "
-                            + "exists in testcases/", config.getName(), apkFile));
-                }
-                AaptParser res = AaptParser.parse(apkFile);
-                assertNotNull(res);
-                String packageName = res.getPackageName();
-                String put = packageNames.put(packageName, apkName);
-                packageListNames.add(packageName);
-                // The package already exists and it's a different apk
-                if (put != null && !apkName.equals(put) && !EXCEPTION_LIST.contains(packageName)) {
-                    fail(String.format("Module %s: Package name '%s' from apk '%s' was already "
-                            + "added by previous apk '%s'.",
-                            config.getName(), packageName, apkName, put));
+    
+                for (File apk : apkNames) {
+                    String apkName = apk.getName();
+                    File apkFile = new File(testcases, apkName);
+                    if (!apkFile.exists()) {
+                        fail(String.format("Module %s is trying to install %s which does not "
+                                + "exists in testcases/", config.getName(), apkFile));
+                    }
+                    AaptParser res = AaptParser.parse(apkFile);
+                    assertNotNull(res);
+                    String packageName = res.getPackageName();
+                    String put = packageNames.put(packageName, apkName);
+                    packageListNames.add(packageName);
+                    // The package already exists and it's a different apk
+                    if (put != null && !apkName.equals(put) && !EXCEPTION_LIST.contains(packageName)) {
+                        fail(String.format("Module %s: Package name '%s' from apk '%s' was already "
+                                + "added by previous apk '%s'.",
+                                config.getName(), packageName, apkName, put));
+                    }
                 }
             }
-
             // Catch a test trying to run something it doesn't install.
             List<IRemoteTest> tests = c.getTests();
             for (IRemoteTest test : tests) {
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
index d8fb115..da4208e 100644
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
@@ -27,6 +27,7 @@
 import com.android.tradefed.config.ConfigurationException;
 import com.android.tradefed.config.ConfigurationFactory;
 import com.android.tradefed.config.IConfiguration;
+import com.android.tradefed.config.IDeviceConfiguration;
 import com.android.tradefed.invoker.ExecutionFiles.FilesKey;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.invoker.shard.token.TokenProperty;
@@ -215,31 +216,36 @@
         for (File config : listConfig) {
             IConfiguration c = ConfigurationFactory.getInstance()
                     .createConfigurationFromArgs(new String[] {config.getAbsolutePath()});
-            // Ensure the deprecated ApkInstaller is not used anymore.
-            for (ITargetPreparer prep : c.getTargetPreparers()) {
-                if (prep.getClass().isAssignableFrom(ApkInstaller.class)) {
-                    throw new ConfigurationException(
-                            String.format("%s: Use com.android.tradefed.targetprep.suite."
-                                    + "SuiteApkInstaller instead of com.android.compatibility."
-                                    + "common.tradefed.targetprep.ApkInstaller, options will be "
-                                    + "the same.", config));
-                }
-                if (prep.getClass().isAssignableFrom(PreconditionPreparer.class)) {
-                    throw new ConfigurationException(
-                            String.format(
-                                    "%s: includes a PreconditionPreparer (%s) which is not allowed"
-                                            + " in modules.",
-                                    config.getName(), prep.getClass()));
-                }
-                if (prep.getClass().isAssignableFrom(DeviceSetup.class)) {
-                   DeviceSetup deviceSetup = (DeviceSetup) prep;
-                   if (!deviceSetup.isForceSkipSystemProps()) {
-                       throw new ConfigurationException(
-                               String.format("%s: %s needs to be configured with "
-                                       + "<option name=\"force-skip-system-props\" "
-                                       + "value=\"true\" /> in CTS.",
-                                             config.getName(), prep.getClass()));
-                   }
+            if (c.getDeviceConfig().size() > 2) {
+                throw new ConfigurationException(String.format("%s declares more than 2 devices.", config));
+            }
+            for (IDeviceConfiguration dConfig : c.getDeviceConfig()) {
+                // Ensure the deprecated ApkInstaller is not used anymore.
+                for (ITargetPreparer prep : dConfig.getTargetPreparers()) {
+                    if (prep.getClass().isAssignableFrom(ApkInstaller.class)) {
+                        throw new ConfigurationException(
+                                String.format("%s: Use com.android.tradefed.targetprep.suite."
+                                        + "SuiteApkInstaller instead of com.android.compatibility."
+                                        + "common.tradefed.targetprep.ApkInstaller, options will be "
+                                        + "the same.", config));
+                    }
+                    if (prep.getClass().isAssignableFrom(PreconditionPreparer.class)) {
+                        throw new ConfigurationException(
+                                String.format(
+                                        "%s: includes a PreconditionPreparer (%s) which is not "
+                                                + "allowed in modules.",
+                                        config.getName(), prep.getClass()));
+                    }
+                    if (prep.getClass().isAssignableFrom(DeviceSetup.class)) {
+                       DeviceSetup deviceSetup = (DeviceSetup) prep;
+                       if (!deviceSetup.isForceSkipSystemProps()) {
+                           throw new ConfigurationException(
+                                   String.format("%s: %s needs to be configured with "
+                                           + "<option name=\"force-skip-system-props\" "
+                                           + "value=\"true\" /> in CTS.",
+                                                 config.getName(), prep.getClass()));
+                       }
+                    }
                 }
             }
             // We can ensure that Host side tests are not empty.
@@ -292,6 +298,7 @@
                     }
                 }
             }
+
             ConfigurationDescriptor cd = c.getConfigurationDescription();
             Assert.assertNotNull(config + ": configuration descriptor is null", cd);
             List<String> component = cd.getMetaData(METADATA_COMPONENT);
diff --git a/tools/vm-tests-tf/Android.bp b/tools/vm-tests-tf/Android.bp
index c9b656a..97c17196 100644
--- a/tools/vm-tests-tf/Android.bp
+++ b/tools/vm-tests-tf/Android.bp
@@ -101,3 +101,80 @@
     ],
     installable: false,
 }
+
+java_library_host {
+    name: "cts-tf-dalvik-buildutil",
+    srcs: [
+        "build/src/**/*.java",
+        "src/**/*.java",
+    ],
+    libs: [
+        "junit",
+        "jsr305",
+        "d8",
+        "smali",
+    ],
+}
+
+java_genrule_host {
+    name: "vm-tests-tf-lib",
+    tools: [
+        "soong_zip",
+        "d8"
+    ],
+    srcs: [
+        ":cts-tf-dalvik-buildutil",
+        ":vmtests-generated-resources",
+        ":vmtests-mains",
+        ":cts-vmtests-dot",
+        ":junit",
+        ":d8",
+        ":smali",
+    ],
+    cmd: "echo Generating BuildDalvikSuite tests" +
+         " && mkdir -p $(genDir)/classes" +
+         " && unzip -bq $(location :cts-tf-dalvik-buildutil) -d $(genDir)/classes" +
+         " && mkdir -p $(genDir)/tests" +
+         " && java" +
+         "     -cp $(location :cts-tf-dalvik-buildutil):$(location :junit):$(location :d8):$(location :smali):$(location :cts-vmtests-dot)" +
+         "     util.build.BuildDalvikSuite" +
+         "     cts/tools/vm-tests-tf/src" +
+         "     $(genDir)/tests" +
+         "     $(genDir)/classes" +
+         " && echo Generating dexcore tests" +
+         " && $(location soong_zip) -jar -o $(genDir)/tests/dot/junit/dexcore.jar-class.jar" +
+         "     -C $(genDir)/classes" +
+         "         -f $(genDir)/classes/dot/junit/DxUtil.class" +
+         "         -f $(genDir)/classes/dot/junit/DxAbstractMain.class" +
+         "         -f $(genDir)/classes/dot/junit/AssertionFailedException.class" +
+         " && mkdir -p $(genDir)/dexcore" +
+         " && $(location d8) -JXms16M -JXmx2048M" +
+         "     --output $(genDir)/dexcore" +
+         "     $(genDir)/tests/dot/junit/dexcore.jar-class.jar" +
+         " && $(location soong_zip) -jar -o $(genDir)/tests/dot/junit/dexcore.jar" +
+         "     -C $(genDir)/dexcore" +
+         "         -D $(genDir)/dexcore" +
+         " && echo Combining tests" +
+         " && mkdir -p $(genDir)/out" +
+         " && unzip -bq $(location :vmtests-generated-resources) -d $(genDir)/generated-resources" +
+         " && cp $(location :vmtests-mains) $(genDir)/mains.jar" +
+         " && $(location soong_zip) -o $(out)" +
+         "     -C $(genDir)/generated-resources" +
+         "         -D $(genDir)/generated-resources" +
+         "     -C $(genDir)" +
+         "         -D $(genDir)/tests" +
+         "     -j -P tests -f $(genDir)/mains.jar",
+    out: ["vm-tests-tf-lib.jar"],
+}
+
+java_test_host {
+    name: "vm-tests-tf",
+    static_libs: [
+        "vm-tests-tf-lib"
+    ],
+    test_config: "AndroidTest.xml",
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
deleted file mode 100644
index 18449e1..0000000
--- a/tools/vm-tests-tf/Android.mk
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# test dex library
-# ============================================================
-include $(CLEAR_VARS)
-
-# custom variables used to generate test description. do not touch!
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE := cts-tf-dalvik-lib
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := junit
-include $(BUILD_JAVA_LIBRARY)
-
-cts-tf-dalvik-lib.jar := $(full_classes_jar)
-
-# buildutil java library
-# ============================================================
-include $(CLEAR_VARS)
-
-# custom variables used by cts/tools/utils/CollectAllTests.java to generate test description. do not touch!
-LOCAL_TEST_TYPE := vmHostTest
-LOCAL_JAR_PATH := android.core.vm-tests-tf.jar
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src build/src)
-
-LOCAL_MODULE := cts-tf-dalvik-buildutil
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := junit jsr305 d8 smali
-
-LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Buid android.core.vm-tests-tf.jar
-# ============================================================
-#
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := vm-tests-tf
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-LOCAL_BUILT_MODULE_STEM := javalib.jar
-intermediates := $(call local-intermediates-dir)
-# Install the module as $(intermediates)/android.core.vm-tests-tf.jar.
-LOCAL_INSTALLED_MODULE_STEM := android.core.vm-tests-tf.jar
-LOCAL_MODULE_PATH := $(intermediates)
-
-# Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts general-tests
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-vmteststf_dep_jars := \
-    $(HOST_JDK_TOOLS_JAR) \
-    $(cts-tf-dalvik-lib.jar) \
-    $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, cts-tf-dalvik-buildutil.jar junit.jar d8.jar smali.jar) \
-    $(call intermediates-dir-for,JAVA_LIBRARIES,cts-vmtests-dot,HOST,COMMON)/classes.jar
-
-vmtests_generated_resources_jar := \
-    $(call intermediates-dir-for,JAVA_LIBRARIES,vmtests-generated-resources,HOST)/javalib.jar
-vmtests_mains_generated_jar := \
-    $(call intermediates-dir-for,JAVA_LIBRARIES,vmtests-mains,,COMMON)/javalib.jar
-
-$(LOCAL_BUILT_MODULE): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
-$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_CLASSES := $(call intermediates-dir-for,JAVA_LIBRARIES,cts-tf-dalvik-buildutil,HOST)/classes
-$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES := $(intermediates)/tests
-$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_DEXCORE_JAR := $(intermediates)/tests/dot/junit/dexcore.jar
-$(LOCAL_BUILT_MODULE): PRIVATE_CLASS_PATH := $(call normalize-path-list, $(vmteststf_dep_jars))
-$(LOCAL_BUILT_MODULE): PRIVATE_VMTESTS_GENERATED_RESOURCES := $(vmtests_generated_resources_jar)
-$(LOCAL_BUILT_MODULE): PRIVATE_VMTESTS_MAINS_GENERATED := $(vmtests_mains_generated_jar)
-$(LOCAL_BUILT_MODULE) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed.jar $(DX) $(vmtests_generated_resources_jar) $(vmtests_mains_generated_jar)
-	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
-	$(hide) mkdir -p $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
-	# generated and compile the host side junit tests
-	@echo "Write generated Main_*.java"
-	$(hide) $(JAVA) \
-	    -cp $(PRIVATE_CLASS_PATH) util.build.BuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
-		$(PRIVATE_INTERMEDIATES_CLASSES)
-	@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
-	$(hide) $(JAR) -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar \
-		$(addprefix -C $(PRIVATE_INTERMEDIATES_CLASSES) , dot/junit/DxUtil.class dot/junit/DxAbstractMain.class dot/junit/AssertionFailedException.class)
-	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp
-	$(hide) $(DX_COMMAND) --output $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp \
-		$(if $(NO_OPTIMIZE_DX), --debug) $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar
-	$(hide) cd $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp && zip -q -r $(abspath $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)) .
-	$(hide) cp $(PRIVATE_VMTESTS_GENERATED_RESOURCES) $@
-	$(hide) cp $(PRIVATE_VMTESTS_MAINS_GENERATED) $(dir $@)/tests/mains.jar
-	$(hide) cd $(dir $@) && zip -q -r $(notdir $@) tests
-
-# Clean up temp vars
-intermediates :=
-vmteststf_dep_jars :=
-vmtests_generated_resources_jar :=
-vmtests_mains_generated_jar :=
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/vm-tests-tf/AndroidTest.xml b/tools/vm-tests-tf/AndroidTest.xml
index 4006b65..4ca3b57 100644
--- a/tools/vm-tests-tf/AndroidTest.xml
+++ b/tools/vm-tests-tf/AndroidTest.xml
@@ -22,7 +22,7 @@
     <option name="config-descriptor:metadata" key="component" value="art" />
     <target_preparer class="android.core.vm.targetprep.VmTestPreparer" />
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
-        <option name="jar" value="android.core.vm-tests-tf.jar" />
+        <option name="jar" value="vm-tests-tf.jar" />
         <option name="runtime-hint" value="51m" />
     </test>
 </configuration>
diff --git a/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
index 0b069b5..2e0f068 100644
--- a/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/build/src/util/build/BuildDalvikSuite.java
@@ -76,8 +76,8 @@
     }
 
     private static void printUsage() {
-        System.out.println("usage: java-src-folder output-folder classpath " +
-                           "generated-main-files compiled_output");
+        System.out.println("usage: $(JAVA) -cp $(CLASSPATH) util.build.BuildDalvikSuite" +
+                " JAVASRC_FOLDER OUTPUT_FOLDER COMPILED_CLASSES_FOLDER");
     }
 
     class MyTestHandler implements TestHandler {
diff --git a/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java b/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java
index 6a17e91..dd23d79 100644
--- a/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java
+++ b/tools/vm-tests-tf/targetprep/src/android/core/vm/targetprep/VmTestPreparer.java
@@ -39,7 +39,7 @@
 @OptionClass(alias="vm-test-preparer")
 public class VmTestPreparer implements ITargetCleaner {
 
-    private static final String JAR_FILE = "android.core.vm-tests-tf.jar";
+    private static final String JAR_FILE = "vm-tests-tf.jar";
     private static final String TEMP_DIR = "/data/local/tmp";
     private static final String VM_TEMP_DIR = TEMP_DIR +"/vm-tests";
 
@@ -50,10 +50,11 @@
     public void setUp(ITestDevice device, IBuildInfo buildInfo)
             throws TargetSetupError, BuildError, DeviceNotAvailableException {
         CompatibilityBuildHelper helper = new CompatibilityBuildHelper(buildInfo);
-        if (!installVmPrereqs(device, helper)) {
-            throw new RuntimeException(String.format(
-                    "Failed to install vm-tests prereqs on device %s",
-                    device.getSerialNumber()));
+        try {
+            installVmPrereqs(device, helper);
+        } catch (Exception ex) {
+            throw new RuntimeException("Failed to install vm-tests prereqs on device "
+                    + device.getSerialNumber(), ex);
         }
     }
 
@@ -71,10 +72,10 @@
      *
      * @param device the {@link ITestDevice}
      * @param ctsBuild the {@link CompatibilityBuildHelper}
-     * @throws DeviceNotAvailableException
-     * @return true if test jar files are extracted and pushed to device successfully
+     * @throws DeviceNotAvailableException if device is unavailable
+     * @throws RuntimeException if there is another failure
      */
-    private boolean installVmPrereqs(ITestDevice device, CompatibilityBuildHelper ctsBuild)
+    private void installVmPrereqs(ITestDevice device, CompatibilityBuildHelper ctsBuild)
             throws DeviceNotAvailableException {
         cleanupDeviceFiles(device);
         // Creates temp directory recursively. We also need to create the dalvik-cache directory
@@ -84,14 +85,13 @@
         try {
             File jarFile = ctsBuild.getTestFile(JAR_FILE);
             if (!jarFile.exists()) {
-                CLog.e("Missing jar file %s", jarFile.getPath());
-                return false;
+                throw new RuntimeException("Missing jar file " + jarFile.getPath());
             }
 
             String jarOnDevice = VM_TEMP_DIR + "/" + JAR_FILE;
             if (!device.pushFile(jarFile, jarOnDevice)) {
-                CLog.e("Failed to push vm test jar");
-                return false;
+                throw new RuntimeException("Failed to push vm test jar " + jarFile + " to "
+                        + jarOnDevice);
             }
 
             // TODO: Only extract tests directory, avoid rm.
@@ -99,17 +99,17 @@
                     + " && rm -rf " + VM_TEMP_DIR + "/dot*"
                     + " && mv " + VM_TEMP_DIR + "/tests/* " + VM_TEMP_DIR + "/"
                     + " && echo Success";
+
             CommandResult result = device.executeShellV2Command(cmd);
+
             if (result.getStatus() != CommandStatus.SUCCESS) {
-                CLog.e("Failed to extract and prepare vm tests jar");
-                return false;
+                throw new RuntimeException("Failed to extract and prepare vm tests jar: [" + cmd
+                        + "] with stderr: " + result.getStderr());
             }
         } catch (IOException e) {
-            CLog.e("Failed to extract jar file %s and sync it to device %s.",
-                    JAR_FILE, device.getSerialNumber());
-            return false;
+            throw new RuntimeException("Failed to extract jar file " + JAR_FILE
+                    + " and sync it to device.", e);
         }
-        return true;
     }
 
     /**