Merge "Vendor API level 202504 is now frozen" into main
diff --git a/audio/aidl/Android.bp b/audio/aidl/Android.bp
index ff16029..cec1276 100644
--- a/audio/aidl/Android.bp
+++ b/audio/aidl/Android.bp
@@ -60,7 +60,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "31",
         },
diff --git a/audio/common/5.0/Android.bp b/audio/common/5.0/Android.bp
index 02f66a3..d9c4f58 100644
--- a/audio/common/5.0/Android.bp
+++ b/audio/common/5.0/Android.bp
@@ -23,6 +23,6 @@
     gen_java_constants: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
 }
diff --git a/automotive/audiocontrol/1.0/vts/functional/Android.bp b/automotive/audiocontrol/1.0/vts/functional/Android.bp
index fe5be81..9dcb600 100644
--- a/automotive/audiocontrol/1.0/vts/functional/Android.bp
+++ b/automotive/audiocontrol/1.0/vts/functional/Android.bp
@@ -26,6 +26,7 @@
 
 cc_test {
     name: "VtsHalAudioControlV1_0TargetTest",
+    team: "trendy_team_aaos_audio_triage",
     srcs: [
         "VtsHalAudioControlV1_0TargetTest.cpp",
     ],
diff --git a/automotive/audiocontrol/2.0/vts/functional/Android.bp b/automotive/audiocontrol/2.0/vts/functional/Android.bp
index 597aaa3..7499bc4 100644
--- a/automotive/audiocontrol/2.0/vts/functional/Android.bp
+++ b/automotive/audiocontrol/2.0/vts/functional/Android.bp
@@ -26,6 +26,7 @@
 
 cc_test {
     name: "VtsHalAudioControlV2_0TargetTest",
+    team: "trendy_team_aaos_audio_triage",
     defaults: ["VtsHalTargetTestDefaults"],
     srcs: ["VtsHalAudioControlV2_0TargetTest.cpp"],
     static_libs: [
diff --git a/automotive/audiocontrol/aidl/default/converter/test/Android.bp b/automotive/audiocontrol/aidl/default/converter/test/Android.bp
index 70d4a20..fb2d52c 100644
--- a/automotive/audiocontrol/aidl/default/converter/test/Android.bp
+++ b/automotive/audiocontrol/aidl/default/converter/test/Android.bp
@@ -33,6 +33,7 @@
 
 cc_test {
     name: "AudioControlConverterUnitTest",
+    team: "trendy_team_aaos_audio_triage",
     vendor: true,
     require_root: true,
     srcs: ["*.cpp"],
diff --git a/automotive/audiocontrol/aidl/vts/Android.bp b/automotive/audiocontrol/aidl/vts/Android.bp
index 57c6ae4..d7e5927 100644
--- a/automotive/audiocontrol/aidl/vts/Android.bp
+++ b/automotive/audiocontrol/aidl/vts/Android.bp
@@ -43,6 +43,7 @@
 
 cc_test {
     name: "VtsAidlHalAudioControlTest",
+    team: "trendy_team_aaos_audio_triage",
     defaults: [
         "latest_android_hardware_audio_common_cpp_static",
         "latest_android_hardware_automotive_audiocontrol_cpp_static",
diff --git a/automotive/remoteaccess/hal/default/test/Android.bp b/automotive/remoteaccess/hal/default/test/Android.bp
index 378a330..6eaad8b 100644
--- a/automotive/remoteaccess/hal/default/test/Android.bp
+++ b/automotive/remoteaccess/hal/default/test/Android.bp
@@ -19,6 +19,7 @@
 
 cc_test {
     name: "RemoteAccessServiceUnitTest",
+    team: "trendy_team_aaos_power_triage",
     vendor: true,
     srcs: ["*.cpp"],
     whole_static_libs: [
diff --git a/automotive/remoteaccess/test_grpc_server/impl/Android.bp b/automotive/remoteaccess/test_grpc_server/impl/Android.bp
index 8d8d72a..6a31900 100644
--- a/automotive/remoteaccess/test_grpc_server/impl/Android.bp
+++ b/automotive/remoteaccess/test_grpc_server/impl/Android.bp
@@ -65,6 +65,7 @@
 
 cc_test_host {
     name: "TestWakeupClientServerHostUnitTest",
+    team: "trendy_team_aaos_power_triage",
     srcs: [
         "test/*.cpp",
         "src/TestWakeupClientServiceImpl.cpp",
diff --git a/automotive/remoteaccess/vts/Android.bp b/automotive/remoteaccess/vts/Android.bp
index 043cafa..823c410 100644
--- a/automotive/remoteaccess/vts/Android.bp
+++ b/automotive/remoteaccess/vts/Android.bp
@@ -26,6 +26,7 @@
 
 cc_test {
     name: "VtsHalAutomotiveRemoteAccess_TargetTest",
+    team: "trendy_team_aaos_power_triage",
     srcs: [
         "src/*.cpp",
     ],
diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp
index 76d44f8..05f2294 100644
--- a/automotive/vehicle/2.0/default/Android.bp
+++ b/automotive/vehicle/2.0/default/Android.bp
@@ -163,6 +163,7 @@
 
 cc_test {
     name: "android.hardware.automotive.vehicle@2.0-manager-unit-tests",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["vhal_v2_0_target_defaults"],
     whole_static_libs: ["android.hardware.automotive.vehicle@2.0-manager-lib"],
@@ -197,6 +198,7 @@
 
 cc_test {
     name: "android.hardware.automotive.vehicle@2.0-default-impl-unit-tests",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["vhal_v2_0_target_defaults"],
     srcs: [
@@ -231,6 +233,7 @@
 
 cc_test {
     name: "android.hardware.automotive.vehicle@2.0-default-config-test",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["vhal_v2_0_target_defaults"],
     srcs: [
diff --git a/automotive/vehicle/2.0/utils/Android.bp b/automotive/vehicle/2.0/utils/Android.bp
index 802b4b3..ccc376b 100644
--- a/automotive/vehicle/2.0/utils/Android.bp
+++ b/automotive/vehicle/2.0/utils/Android.bp
@@ -38,6 +38,7 @@
 
 cc_test {
     name: "android.hardware.automotive.vehicle@2.0-utils-unit-tests",
+    team: "trendy_team_aaos_carframework_triage",
     defaults: ["vhal_v2_0_defaults"],
     vendor: true,
     tidy_timeout_srcs: [
diff --git a/automotive/vehicle/aidl/aidl_test/Android.bp b/automotive/vehicle/aidl/aidl_test/Android.bp
index 8edd636..a87af02 100644
--- a/automotive/vehicle/aidl/aidl_test/Android.bp
+++ b/automotive/vehicle/aidl/aidl_test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "VehicleHalAidlHidlCompatibilityTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: ["AidlHidlCompatibilityTest.cpp"],
     shared_libs: [
         "libbinder_ndk",
@@ -39,6 +40,7 @@
 
 cc_test {
     name: "VehiclePropertyAnnotationCppTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: ["VehiclePropertyAnnotationCppTest.cpp"],
     header_libs: ["IVehicleGeneratedHeaders-V4"],
     defaults: ["VehicleHalInterfaceDefaults"],
@@ -47,6 +49,7 @@
 
 android_test {
     name: "VehiclePropertyAnnotationJavaTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: [
         "VehiclePropertyAnnotationJavaTest.java",
         ":IVehicleGeneratedJavaFiles-V4",
diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
index 1720628..9ca4366 100644
--- a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
+++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl
@@ -29,142 +29,156 @@
     int areaId;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional minimum int32 value at boot time.
+     *
+     * Assume unspecified if both {@code minInt32Value} and
+     * {@code maxInt32Value} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minInt32Value} and {@code maxInt32Value} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code INT32} type property. Ignored for other types.
      *
-     * The optional minimum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the min supported value
-     * ({@code MinMaxSupportedValueResult.minSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minInt32Value} and {@code maxInt32Value} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMinSupportedValue} must be
+     * {@code true}.
      */
     int minInt32Value;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional maximum int32 value at boot time.
+     *
+     * Assume unspecified if both {@code minInt32Value} and
+     * {@code maxInt32Value} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minInt32Value} and {@code maxInt32Value} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code INT32} type property. Ignored for other types.
      *
-     * The optional maximum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the max supported value
-     * ({@code MinMaxSupportedValueResult.maxSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minInt32Value} and {@code maxInt32Value} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMaxSupportedValue} must be
+     * {@code true}.
      */
     int maxInt32Value;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional minimum int64 value at boot time.
+     *
+     * Assume unspecified if both {@code minInt64Value} and
+     * {@code maxInt64Value} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minInt64Value} and {@code maxInt64Value} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code INT64} type property. Ignored for other types.
      *
-     * The optional minimum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the min supported value
-     * ({@code MinMaxSupportedValueResult.minSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minInt64Value} and {@code maxInt64Value} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMinSupportedValue} must be
+     * {@code true}.
      */
     long minInt64Value;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional maximum int64 value at boot time.
+     *
+     * Assume unspecified if both {@code minInt64Value} and
+     * {@code maxInt64Value} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minInt64Value} and {@code maxInt64Value} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code INT64} type property. Ignored for other types.
      *
-     * The optional maximum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the max supported value
-     * ({@code MinMaxSupportedValueResult.maxSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minInt64Value} and {@code maxInt64Value} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMaxSupportedValue} must be
+     * {@code true}.
      */
     long maxInt64Value;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional minimum float value at boot time.
+     *
+     * Assume unspecified if both {@code minFloatValue} and
+     * {@code maxFloatValue} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minFloatValue} and {@code maxFloatValue} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code FLOAT} type property. Ignored for other types.
      *
-     * The optional minimum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the min supported value
-     * ({@code MinMaxSupportedValueResult.minSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minFloatValue} and {@code maxFloatValue} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMinSupportedValue} must be
+     * {@code true}.
      */
     float minFloatValue;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * The optional maximum float value at boot time.
+     *
+     * Assume unspecified if both {@code minFloatValue} and
+     * {@code maxFloatValue} is 0. If either one is not 0, then we assume min
+     * and max both take effect. If no minimum or maximum value is available at
+     * boot time, both {@code minFloatValue} and {@code maxFloatValue} must be
+     * set to 0.
+     *
+     * Note that this property only represents the minimum value at boot time
+     * and may not represent the current actual minimum value.
      *
      * Only applicable for {@code FLOAT} type property. Ignored for other types.
      *
-     * The optional maximum value at boot time.
+     * For certain properties, this field must be specified, see
+     * {@code VehicleProperty} documentation.
      *
-     * For backward compatibility,
-     * if {@code HasSupportedValueInfo.hasMinSupportedValue} is {@code true},
-     * and {@code HasSupportedValueInfo.hasMaxSupportedValue} is {@code true},
-     * this must be equal to the max supported value
-     * ({@code MinMaxSupportedValueResult.maxSupportedValue}) at boot time.
-     *
-     * If no minimum or maximum value is available at boot time, both
-     * {@code minFloatValue} and {@code maxFloatValue} must be set to 0.
-     *
-     * If either one is not 0, then we assume min and max both take effect.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * specified, {@code HasSupportedValueInfo.hasMinSupportedValue} must be
+     * {@code true}.
      */
     float maxFloatValue;
 
     /**
-     * client should use {@code getMinMaxSupportedValue} instead.
+     * Optional supported subset of supported enum values at boot time.
      *
      * Only applicable for property with {@code @data_enum} annotation. Ignored
      * for other properties.
      *
-     * Optional supported subset of supported values at boot time.
-     *
      * If the property has a @data_enum and supportedEnumValues is {@code null},
      * then it is assumed all @data_enum values are supported unless specified
      * through another mechanism.
      *
-     * For backward compatibility, if
-     * {@code HasSupportedValueInfo.hasSupportedValuesList} is {@code true}
-     * and this property has {@code data_enum} annotation,
-     * this must be set to the same as
-     * {@code SupportedValuesListResult.supportedValuesList} at boot time.
+     * If {@code HasSupportedValueInfo} is not {@code null} and this field is
+     * not {@code null}, {@code HasSupportedValueInfo.hasSupportedValuesList}
+     * must be {@code true}.
      */
     @nullable long[] supportedEnumValues;
 
@@ -237,7 +251,19 @@
      * {@code getSupportedValuesLists}, {@code subscribeSupportedValueChange},
      * {@code unsubscribeSupportedValueChange}.
      *
-     * If this is {@code null} for legacy properties, the APIs mentioned before are not supported.
+     * If this is not {@code null}. The VHAL implementation must implement
+     * {@code getMinMaxSupportedValue}, {@code getSupportedValuesLists},
+     * {@code subscribeSupportedValueChange} for the [propId, areaId].
+     *
+     * This should be non-null if the VHAL implementation wants to expose
+     * min/max supported value or supported values list that may change dynamically. For example,
+     * if the max HVAC fan speed may change due to HVAC power settings.
+     *
+     * This should not be non-null if the VHAL implementation wants to expose supported
+     * values list for property ID that is not an enum type (hence do not support
+     * {@code VehicleAreaConfig#supportedEnumValues}).
+     *
+     * If this is {@code null}, the APIs mentioned before are not supported.
      * Client must fallback to use static supported value information in {@code VehicleAreaConfig}.
      *
      * For VHAL implementation < V4, this is always {@code null}.
diff --git a/automotive/vehicle/aidl/impl/3/default_config/JsonConfigLoader/test/Android.bp b/automotive/vehicle/aidl/impl/3/default_config/JsonConfigLoader/test/Android.bp
index 1ed4df7..0d5b6dd 100644
--- a/automotive/vehicle/aidl/impl/3/default_config/JsonConfigLoader/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/default_config/JsonConfigLoader/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "JsonConfigLoaderUnitTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
@@ -35,6 +36,7 @@
 
 cc_test {
     name: "JsonConfigLoaderUnitTestEnableTestProperties-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
diff --git a/automotive/vehicle/aidl/impl/3/default_config/test/Android.bp b/automotive/vehicle/aidl/impl/3/default_config/test/Android.bp
index d125d43..1b344f9 100644
--- a/automotive/vehicle/aidl/impl/3/default_config/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/default_config/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "VehicleHalDefaultConfigTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["VehicleHalDefaults-V3"],
     srcs: ["*.cpp"],
@@ -42,6 +43,7 @@
 
 cc_test {
     name: "VehicleHalDefaultConfigTestEnableTestProperties-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["VehicleHalDefaults-V3"],
     srcs: ["*.cpp"],
diff --git a/automotive/vehicle/aidl/impl/3/fake_impl/GeneratorHub/test/Android.bp b/automotive/vehicle/aidl/impl/3/fake_impl/GeneratorHub/test/Android.bp
index 623417b..399d688 100644
--- a/automotive/vehicle/aidl/impl/3/fake_impl/GeneratorHub/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/fake_impl/GeneratorHub/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeVehicleHalValueGeneratorsTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults-V3"],
diff --git a/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/Android.bp b/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/Android.bp
index e7e5ba7..2239b24 100644
--- a/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/fake_impl/hardware/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeVehicleHardwareTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: [
         "*.cpp",
diff --git a/automotive/vehicle/aidl/impl/3/fake_impl/obd2frame/test/Android.bp b/automotive/vehicle/aidl/impl/3/fake_impl/obd2frame/test/Android.bp
index 8b30477..e1548ed 100644
--- a/automotive/vehicle/aidl/impl/3/fake_impl/obd2frame/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/fake_impl/obd2frame/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeObd2FrameTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults-V3"],
diff --git a/automotive/vehicle/aidl/impl/3/fake_impl/userhal/test/Android.bp b/automotive/vehicle/aidl/impl/3/fake_impl/userhal/test/Android.bp
index 55178dc..050078f 100644
--- a/automotive/vehicle/aidl/impl/3/fake_impl/userhal/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/fake_impl/userhal/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeUserHalTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults-V3"],
diff --git a/automotive/vehicle/aidl/impl/3/grpc/test/Android.bp b/automotive/vehicle/aidl/impl/3/grpc/test/Android.bp
index 1ab946b..df44cab 100644
--- a/automotive/vehicle/aidl/impl/3/grpc/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/grpc/test/Android.bp
@@ -19,6 +19,7 @@
 
 cc_test {
     name: "GRPCVehicleHardwareUnitTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["GRPCVehicleHardwareUnitTest.cpp"],
     whole_static_libs: [
@@ -48,6 +49,7 @@
 
 cc_test {
     name: "GRPCVehicleProxyServerUnitTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["GRPCVehicleProxyServerUnitTest.cpp"],
     header_libs: [
diff --git a/automotive/vehicle/aidl/impl/3/grpc/utils/proto_message_converter/Android.bp b/automotive/vehicle/aidl/impl/3/grpc/utils/proto_message_converter/Android.bp
index 5ae94b5..63d27b0 100644
--- a/automotive/vehicle/aidl/impl/3/grpc/utils/proto_message_converter/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/grpc/utils/proto_message_converter/Android.bp
@@ -44,6 +44,7 @@
 
 cc_test_host {
     name: "VehicleHalProtoMessageConverterTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: [
         "test/*.cpp",
     ],
diff --git a/automotive/vehicle/aidl/impl/3/utils/common/test/Android.bp b/automotive/vehicle/aidl/impl/3/utils/common/test/Android.bp
index 0450e99..2613d68 100644
--- a/automotive/vehicle/aidl/impl/3/utils/common/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/utils/common/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "VehicleHalVehicleUtilsTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: ["*.cpp"],
     vendor: true,
     static_libs: [
diff --git a/automotive/vehicle/aidl/impl/3/vhal/test/Android.bp b/automotive/vehicle/aidl/impl/3/vhal/test/Android.bp
index e86bc81..8df544f 100644
--- a/automotive/vehicle/aidl/impl/3/vhal/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/3/vhal/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "DefaultVehicleHalTest-V3",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
diff --git a/automotive/vehicle/aidl/impl/current/default_config/JsonConfigLoader/test/Android.bp b/automotive/vehicle/aidl/impl/current/default_config/JsonConfigLoader/test/Android.bp
index 90ea027..658b1e1 100644
--- a/automotive/vehicle/aidl/impl/current/default_config/JsonConfigLoader/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/default_config/JsonConfigLoader/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "JsonConfigLoaderUnitTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
@@ -35,6 +36,7 @@
 
 cc_test {
     name: "JsonConfigLoaderUnitTestEnableTestProperties",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
diff --git a/automotive/vehicle/aidl/impl/current/default_config/test/Android.bp b/automotive/vehicle/aidl/impl/current/default_config/test/Android.bp
index a88913e..f31ccbd 100644
--- a/automotive/vehicle/aidl/impl/current/default_config/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/default_config/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "VehicleHalDefaultConfigTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["VehicleHalDefaults"],
     srcs: ["*.cpp"],
@@ -42,6 +43,7 @@
 
 cc_test {
     name: "VehicleHalDefaultConfigTestEnableTestProperties",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     defaults: ["VehicleHalDefaults"],
     srcs: ["*.cpp"],
diff --git a/automotive/vehicle/aidl/impl/current/fake_impl/GeneratorHub/test/Android.bp b/automotive/vehicle/aidl/impl/current/fake_impl/GeneratorHub/test/Android.bp
index 0d814ea..7772d04 100644
--- a/automotive/vehicle/aidl/impl/current/fake_impl/GeneratorHub/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/fake_impl/GeneratorHub/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeVehicleHalValueGeneratorsTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults"],
diff --git a/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/Android.bp b/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/Android.bp
index 62c1147..cd635f4 100644
--- a/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/fake_impl/hardware/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeVehicleHardwareTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: [
         "*.cpp",
diff --git a/automotive/vehicle/aidl/impl/current/fake_impl/obd2frame/test/Android.bp b/automotive/vehicle/aidl/impl/current/fake_impl/obd2frame/test/Android.bp
index 7c7c0ab..d3ebe3c 100644
--- a/automotive/vehicle/aidl/impl/current/fake_impl/obd2frame/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/fake_impl/obd2frame/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeObd2FrameTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults"],
diff --git a/automotive/vehicle/aidl/impl/current/fake_impl/userhal/test/Android.bp b/automotive/vehicle/aidl/impl/current/fake_impl/userhal/test/Android.bp
index 30411f2..5448d33 100644
--- a/automotive/vehicle/aidl/impl/current/fake_impl/userhal/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/fake_impl/userhal/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "FakeUserHalTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     defaults: ["VehicleHalDefaults"],
diff --git a/automotive/vehicle/aidl/impl/current/grpc/test/Android.bp b/automotive/vehicle/aidl/impl/current/grpc/test/Android.bp
index b3c6089..d3e61fe 100644
--- a/automotive/vehicle/aidl/impl/current/grpc/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/grpc/test/Android.bp
@@ -19,6 +19,7 @@
 
 cc_test {
     name: "GRPCVehicleHardwareUnitTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["GRPCVehicleHardwareUnitTest.cpp"],
     whole_static_libs: [
@@ -48,6 +49,7 @@
 
 cc_test {
     name: "GRPCVehicleProxyServerUnitTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["GRPCVehicleProxyServerUnitTest.cpp"],
     header_libs: [
diff --git a/automotive/vehicle/aidl/impl/current/grpc/utils/proto_message_converter/Android.bp b/automotive/vehicle/aidl/impl/current/grpc/utils/proto_message_converter/Android.bp
index 94c09aa..cf41843 100644
--- a/automotive/vehicle/aidl/impl/current/grpc/utils/proto_message_converter/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/grpc/utils/proto_message_converter/Android.bp
@@ -44,6 +44,7 @@
 
 cc_test_host {
     name: "VehicleHalProtoMessageConverterTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: [
         "test/*.cpp",
     ],
diff --git a/automotive/vehicle/aidl/impl/current/utils/common/test/Android.bp b/automotive/vehicle/aidl/impl/current/utils/common/test/Android.bp
index 69ec7a2..bb654d7 100644
--- a/automotive/vehicle/aidl/impl/current/utils/common/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/utils/common/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "VehicleHalVehicleUtilsTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: ["*.cpp"],
     vendor: true,
     static_libs: [
diff --git a/automotive/vehicle/aidl/impl/current/vhal/test/Android.bp b/automotive/vehicle/aidl/impl/current/vhal/test/Android.bp
index d6c2f8e..eaaea1d 100644
--- a/automotive/vehicle/aidl/impl/current/vhal/test/Android.bp
+++ b/automotive/vehicle/aidl/impl/current/vhal/test/Android.bp
@@ -21,6 +21,7 @@
 
 cc_test {
     name: "DefaultVehicleHalTest",
+    team: "trendy_team_aaos_carframework_triage",
     vendor: true,
     srcs: ["*.cpp"],
     static_libs: [
diff --git a/automotive/vehicle/vts/Android.bp b/automotive/vehicle/vts/Android.bp
index d55dc33..219119d 100644
--- a/automotive/vehicle/vts/Android.bp
+++ b/automotive/vehicle/vts/Android.bp
@@ -26,6 +26,7 @@
 
 cc_test {
     name: "VtsHalAutomotiveVehicle_TargetTest",
+    team: "trendy_team_aaos_carframework_triage",
     srcs: [
         "src/*.cpp",
     ],
diff --git a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
index 5af84ed..d9a60a5 100644
--- a/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
+++ b/biometrics/fingerprint/aidl/android/hardware/biometrics/fingerprint/virtualhal/IVirtualHal.aidl
@@ -311,7 +311,7 @@
     void setSensorStrength(in SensorStrength strength);
     void setMaxEnrollmentPerUser(in int max);
     void setSensorLocation(in SensorLocation loc);
-    void setNavigationGuesture(in boolean v);
+    void setNavigationGesture(in boolean v);
     void setDetectInteraction(in boolean v);
     void setDisplayTouch(in boolean v);
     void setControlIllumination(in boolean v);
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
index 7a43d7b..175e310 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp
@@ -414,41 +414,60 @@
     return ndk::ScopedAStatus::ok();
 }
 
-bool FakeFingerprintEngine::getSensorLocationConfig(SensorLocation& out) {
-    auto loc = Fingerprint::cfg().get<std::string>("sensor_location");
+bool FakeFingerprintEngine::getSensorLocationConfig(std::vector<SensorLocation>& out) {
+    auto locStr = Fingerprint::cfg().get<std::string>("sensor_location");
     auto isValidStr = false;
-    auto dim = Util::split(loc, ":");
 
-    if (dim.size() < 3 or dim.size() > 4) {
-        if (!loc.empty()) LOG(WARNING) << "Invalid sensor location input (x:y:radius):" + loc;
-        return false;
-    } else {
-        int32_t x, y, r;
-        std::string d = "";
-        if (dim.size() >= 3) {
-            isValidStr = ParseInt(dim[0], &x) && ParseInt(dim[1], &y) && ParseInt(dim[2], &r);
+    // sensor_location format: x:y:r:d,x:y:r:d,...
+    //   x: x location in pixel, y: y location in pixel, r: radus in pixel, d:display in string
+    auto locations = Util::split(locStr, ",");
+    for (int i = 0; i < locations.size(); i++) {
+        auto loc = locations[i];
+
+        // expect loc in the format: x:y:r  or x:y:d:r
+        auto dim = Util::split(loc, ":");
+
+        if (dim.size() < 3) {
+            if (!loc.empty()) LOG(WARNING) << "Invalid sensor location input (x:y:radius):" + loc;
+            out.clear();
+            return false;
+        } else {
+            int32_t x, y, r;
+            std::string d = "";
+            if (dim.size() >= 3) {
+                isValidStr = ParseInt(dim[0], &x) && ParseInt(dim[1], &y) && ParseInt(dim[2], &r);
+            }
+            if (dim.size() >= 4) {
+                for (int i = 3; i < dim.size(); i++) {
+                    if (i > 3) d += ':';
+                    d += dim[i];
+                }
+            }
+            if (isValidStr) {
+                out.push_back(SensorLocation{.sensorLocationX = x,
+                                             .sensorLocationY = y,
+                                             .sensorRadius = r,
+                                             .display = d});
+            }
         }
-        if (dim.size() >= 4) {
-            d = dim[3];
+    }
+
+    LOG(INFO) << "getSensorLocationConfig: isValidStr=" << isValidStr << " locStr=" << locStr;
+    if (isValidStr) {
+        for (auto loc : out) {
+            LOG(INFO) << loc.toString();
         }
-        if (isValidStr)
-            out = {.sensorLocationX = x, .sensorLocationY = y, .sensorRadius = r, .display = d};
-
-        return isValidStr;
-    }
-}
-SensorLocation FakeFingerprintEngine::getSensorLocation() {
-    SensorLocation location;
-
-    if (getSensorLocationConfig(location)) {
-        return location;
     } else {
-        return defaultSensorLocation();
+        out.clear();
     }
+
+    return isValidStr;
 }
 
-SensorLocation FakeFingerprintEngine::defaultSensorLocation() {
-    return SensorLocation();
+void FakeFingerprintEngine::getSensorLocation(std::vector<SensorLocation>& location) {
+    if (!getSensorLocationConfig(location)) {
+        getDefaultSensorLocation(location);
+    }
 }
 
 std::pair<AcquiredInfo, int32_t> FakeFingerprintEngine::convertAcquiredInfo(int32_t code) {
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
index acb792d..e823d75 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineSide.cpp
@@ -26,12 +26,17 @@
 using namespace ::android::fingerprint::virt;
 
 namespace aidl::android::hardware::biometrics::fingerprint {
+SensorLocation FakeFingerprintEngineSide::defaultLocation[] = {
+        // default to CF display
+        {.sensorLocationX = 0, 200, 90, "local:4619827353912518656"}};
 
 FakeFingerprintEngineSide::FakeFingerprintEngineSide() : FakeFingerprintEngine() {}
 
-SensorLocation FakeFingerprintEngineSide::defaultSensorLocation() {
-    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
-                          .sensorLocationY = defaultSensorLocationY,
-                          .sensorRadius = defaultSensorRadius};
+void FakeFingerprintEngineSide::getDefaultSensorLocation(
+        std::vector<SensorLocation>& sensorLocation) {
+    for (int i = 0; i < (sizeof(defaultLocation) / sizeof(defaultLocation[0])); i++) {
+        sensorLocation.push_back(defaultLocation[i]);
+    }
 }
+
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
index 496b5e3..f2d5687 100644
--- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
+++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngineUdfps.cpp
@@ -34,10 +34,14 @@
 FakeFingerprintEngineUdfps::FakeFingerprintEngineUdfps()
     : FakeFingerprintEngine(), mPointerDownTime(0), mUiReadyTime(0) {}
 
-SensorLocation FakeFingerprintEngineUdfps::defaultSensorLocation() {
-    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
-                          .sensorLocationY = defaultSensorLocationY,
-                          .sensorRadius = defaultSensorRadius};
+void FakeFingerprintEngineUdfps::getDefaultSensorLocation(
+        std::vector<SensorLocation>& sensorLocation) {
+    sensorLocation.clear();
+    sensorLocation.push_back(SensorLocation{
+            .sensorLocationX = defaultSensorLocationX,
+            .sensorLocationY = defaultSensorLocationY,
+            .sensorRadius = defaultSensorRadius,
+    });
 }
 
 ndk::ScopedAStatus FakeFingerprintEngineUdfps::onPointerDownImpl(int32_t /*pointerId*/,
diff --git a/biometrics/fingerprint/aidl/default/Fingerprint.cpp b/biometrics/fingerprint/aidl/default/Fingerprint.cpp
index 143e231..6d39e12 100644
--- a/biometrics/fingerprint/aidl/default/Fingerprint.cpp
+++ b/biometrics/fingerprint/aidl/default/Fingerprint.cpp
@@ -74,7 +74,7 @@
     auto sensorId = Fingerprint::cfg().get<std::int32_t>("sensor_id");
     auto sensorStrength = Fingerprint::cfg().get<std::int32_t>("sensor_strength");
     auto maxEnrollments = Fingerprint::cfg().get<std::int32_t>("max_enrollments");
-    auto navigationGuesture = Fingerprint::cfg().get<bool>("navigation_guesture");
+    auto navigationGesture = Fingerprint::cfg().get<bool>("navigation_gesture");
     auto detectInteraction = Fingerprint::cfg().get<bool>("detect_interaction");
     auto displayTouch = Fingerprint::cfg().get<bool>("display_touch");
     auto controlIllumination = Fingerprint::cfg().get<bool>("control_illumination");
@@ -82,19 +82,15 @@
     common::CommonProps commonProps = {sensorId, (common::SensorStrength)sensorStrength,
                                        maxEnrollments, componentInfo};
 
-    SensorLocation sensorLocation = mEngine->getSensorLocation();
+    std::vector<SensorLocation> sensorLocation;
+    mEngine->getSensorLocation(sensorLocation);
+    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType);
+    for (auto location : sensorLocation) {
+        LOG(INFO) << "sensor location:  " << location.toString();
+    }
 
-    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType)
-              << " location:" << sensorLocation.toString();
-
-    *out = {{commonProps,
-             mSensorType,
-             {sensorLocation},
-             navigationGuesture,
-             detectInteraction,
-             displayTouch,
-             controlIllumination,
-             std::nullopt}};
+    *out = {{commonProps, mSensorType, sensorLocation, navigationGesture, detectInteraction,
+             displayTouch, controlIllumination, std::nullopt}};
     return ndk::ScopedAStatus::ok();
 }
 
@@ -204,7 +200,7 @@
     RESET_CONFIG_O(sensor_id);
     RESET_CONFIG_O(sensor_strength);
     RESET_CONFIG_O(max_enrollments);
-    RESET_CONFIG_O(navigation_guesture);
+    RESET_CONFIG_O(navigation_gesture);
     RESET_CONFIG_O(detect_interaction);
     RESET_CONFIG_O(display_touch);
     RESET_CONFIG_O(control_illumination);
diff --git a/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp b/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
index 82c5403..2a87a55 100644
--- a/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
+++ b/biometrics/fingerprint/aidl/default/FingerprintConfig.cpp
@@ -56,7 +56,7 @@
 CREATE_GETTER_SETTER_WRAPPER(operation_detect_interaction_duration, OptInt32)
 CREATE_GETTER_SETTER_WRAPPER(operation_detect_interaction_acquired, OptString)
 CREATE_GETTER_SETTER_WRAPPER(max_enrollments, OptBool)
-CREATE_GETTER_SETTER_WRAPPER(navigation_guesture, OptBool)
+CREATE_GETTER_SETTER_WRAPPER(navigation_gesture, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(detect_interaction, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(display_touch, OptBool)
 CREATE_GETTER_SETTER_WRAPPER(control_illumination, OptBool)
@@ -90,7 +90,7 @@
         {NGS(operation_detect_interaction_duration), &Config::parseInt32, "10"},
         {NGS(operation_detect_interaction_acquired), &Config::parseString, "1"},
         {NGS(max_enrollments), &Config::parseInt32, "5"},
-        {NGS(navigation_guesture), &Config::parseBool, "false"},
+        {NGS(navigation_gesture), &Config::parseBool, "false"},
         {NGS(detect_interaction), &Config::parseBool, "false"},
         {NGS(display_touch), &Config::parseBool, "true"},
         {NGS(control_illumination), &Config::parseBool, "false"},
diff --git a/biometrics/fingerprint/aidl/default/VirtualHal.cpp b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
index d161765..7e0d40b 100644
--- a/biometrics/fingerprint/aidl/default/VirtualHal.cpp
+++ b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
@@ -266,9 +266,9 @@
     return ndk::ScopedAStatus::ok();
 }
 
-::ndk::ScopedAStatus VirtualHal::setNavigationGuesture(bool in_v) {
+::ndk::ScopedAStatus VirtualHal::setNavigationGesture(bool in_v) {
     Fingerprint::cfg().sourcedFromAidl();
-    Fingerprint::cfg().set<bool>("navigation_guesture", in_v);
+    Fingerprint::cfg().set<bool>("navigation_gesture", in_v);
     return ndk::ScopedAStatus::ok();
 }
 
@@ -338,4 +338,13 @@
     *pFp = mFp;
     return ndk::ScopedAStatus::ok();
 }
+
+binder_status_t VirtualHal::dump(int fd, const char** args, uint32_t nargs) {
+    return mFp->dump(fd, args, nargs);
+}
+
+binder_status_t VirtualHal::handleShellCommand(int in, int out, int err, const char** args,
+                                               uint32_t numArgs) {
+    return mFp->handleShellCommand(in, out, err, args, numArgs);
+}
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt b/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
index ad6f9e0..0d31768 100644
--- a/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
+++ b/biometrics/fingerprint/aidl/default/api/android.hardware.biometrics.fingerprint.VirtualProps-current.txt
@@ -75,9 +75,9 @@
     prop_name: "persist.vendor.fingerprint.virtual.max_enrollments"
   }
   prop {
-    api_name: "navigation_guesture"
+    api_name: "navigation_gesture"
     access: ReadWrite
-    prop_name: "persist.vendor.fingerprint.virtual.navigation_guesture"
+    prop_name: "persist.vendor.fingerprint.virtual.navigation_gesture"
   }
   prop {
     api_name: "next_enrollment"
diff --git a/biometrics/fingerprint/aidl/default/fingerprint.sysprop b/biometrics/fingerprint/aidl/default/fingerprint.sysprop
index 1d64c48..7582329 100644
--- a/biometrics/fingerprint/aidl/default/fingerprint.sysprop
+++ b/biometrics/fingerprint/aidl/default/fingerprint.sysprop
@@ -149,7 +149,8 @@
 }
 
 # sensor location
-#    <x>:<y>:<radius> in pixel
+#    <display1>[,display2] ...
+#       display format: <x>:<y>:<radius>[:displayString]
 prop {
     prop_name: "persist.vendor.fingerprint.virtual.sensor_location"
     type: String
@@ -218,13 +219,13 @@
     api_name: "max_enrollments"
 }
 
-# whether support navigation guestures (default: false)
+# whether support navigation gestures (default: false)
 prop {
-    prop_name: "persist.vendor.fingerprint.virtual.navigation_guesture"
+    prop_name: "persist.vendor.fingerprint.virtual.navigation_gesture"
     type: Boolean
     scope: Public
     access: ReadWrite
-    api_name: "navigation_guesture"
+    api_name: "navigation_gesture"
 }
 
 # whether support detect interaction (default: false)
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
index 362d0df..bb8fd40 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h
@@ -53,7 +53,7 @@
     void getAuthenticatorIdImpl(ISessionCallback* cb);
     void invalidateAuthenticatorIdImpl(ISessionCallback* cb);
     void resetLockoutImpl(ISessionCallback* cb, const keymaster::HardwareAuthToken& /*hat*/);
-    bool getSensorLocationConfig(SensorLocation& out);
+    bool getSensorLocationConfig(std::vector<SensorLocation>& out);
 
     virtual ndk::ScopedAStatus onPointerDownImpl(int32_t pointerId, int32_t x, int32_t y,
                                                  float minor, float major);
@@ -62,9 +62,9 @@
 
     virtual ndk::ScopedAStatus onUiReadyImpl();
 
-    virtual SensorLocation getSensorLocation();
+    virtual void getSensorLocation(std::vector<SensorLocation>& loc);
 
-    virtual SensorLocation defaultSensorLocation();
+    virtual void getDefaultSensorLocation(std::vector<SensorLocation>&) {}
 
     virtual void fingerDownAction();
 
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
index 14d5399..12091ee 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineRear.h
@@ -23,6 +23,8 @@
 
 // A fake engine that is backed by system properties instead of hardware.
 class FakeFingerprintEngineRear : public FakeFingerprintEngine {
+    static SensorLocation defaultSensorLocation[];
+
   public:
     FakeFingerprintEngineRear() : FakeFingerprintEngine() {}
     ~FakeFingerprintEngineRear() {}
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
index 67a3ebc..aa09327 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineSide.h
@@ -24,14 +24,12 @@
 // A fake engine that is backed by system properties instead of hardware.
 class FakeFingerprintEngineSide : public FakeFingerprintEngine {
   public:
-    static constexpr int32_t defaultSensorLocationX = 0;
-    static constexpr int32_t defaultSensorLocationY = 600;
-    static constexpr int32_t defaultSensorRadius = 150;
+    static SensorLocation defaultLocation[];
+
+    void getDefaultSensorLocation(std::vector<SensorLocation>& sensorLocation) override;
 
     FakeFingerprintEngineSide();
     ~FakeFingerprintEngineSide() {}
-
-    virtual SensorLocation defaultSensorLocation() override;
 };
 
 }  // namespace aidl::android::hardware::biometrics::fingerprint
diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
index 2270eca..75f1971 100644
--- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
+++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngineUdfps.h
@@ -40,7 +40,7 @@
 
     ndk::ScopedAStatus onUiReadyImpl() override;
 
-    SensorLocation defaultSensorLocation() override;
+    void getDefaultSensorLocation(std::vector<SensorLocation>& sensorLocation) override;
 
     void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
                        int64_t operationId, const keymaster::HardwareAuthToken& hat);
diff --git a/biometrics/fingerprint/aidl/default/include/VirtualHal.h b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
index 5488383..dd77888 100644
--- a/biometrics/fingerprint/aidl/default/include/VirtualHal.h
+++ b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
@@ -63,13 +63,16 @@
     ::ndk::ScopedAStatus setSensorLocation(
             const ::aidl::android::hardware::biometrics::fingerprint::SensorLocation& in_loc)
             override;
-    ::ndk::ScopedAStatus setNavigationGuesture(bool in_v) override;
+    ::ndk::ScopedAStatus setNavigationGesture(bool in_v) override;
     ::ndk::ScopedAStatus setDetectInteraction(bool in_v) override;
     ::ndk::ScopedAStatus setDisplayTouch(bool in_v) override;
     ::ndk::ScopedAStatus setControlIllumination(bool in_v) override;
     ::ndk::ScopedAStatus getFingerprintHal(
             std::shared_ptr<::aidl::android::hardware::biometrics::fingerprint::IFingerprint>*
                     _aidl_return);
+    binder_status_t dump(int fd, const char** args, uint32_t nargs);
+    binder_status_t handleShellCommand(int in, int out, int err, const char** args,
+                                       uint32_t numArgs);
 
   private:
     OptIntVec intVec2OptIntVec(const std::vector<int32_t>& intVec);
diff --git a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
index eb45f98..ea0824d 100644
--- a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineUdfpsTest.cpp
@@ -112,30 +112,52 @@
             sc.sensorRadius == FakeFingerprintEngineUdfps::defaultSensorRadius && sc.display == "");
 }
 
-TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOk) {
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkSimple) {
     auto loc = "100:200:30";
     Fingerprint::cfg().set<std::string>("sensor_location", loc);
-    SensorLocation sc = mEngine.getSensorLocation();
-    ASSERT_TRUE(sc.sensorLocationX == 100);
-    ASSERT_TRUE(sc.sensorLocationY == 200);
-    ASSERT_TRUE(sc.sensorRadius == 30);
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+}
 
-    loc = "100:200:30:screen1";
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkWithOneDisplay) {
+    auto loc = "100:200:30:screen1";
     Fingerprint::cfg().set<std::string>("sensor_location", loc);
-    sc = mEngine.getSensorLocation();
-    ASSERT_TRUE(sc.sensorLocationX == 100);
-    ASSERT_TRUE(sc.sensorLocationY == 200);
-    ASSERT_TRUE(sc.sensorRadius == 30);
-    ASSERT_TRUE(sc.display == "screen1");
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+    ASSERT_TRUE(sc[0].display == "screen1");
+}
+
+TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationOkWithMultipleDisplays) {
+    auto loc = "100:200:30:screen1,200:400:60:screen2";
+    Fingerprint::cfg().set<std::string>("sensor_location", loc);
+    std::vector<SensorLocation> sc;
+    mEngine.getSensorLocation(sc);
+    ASSERT_TRUE(sc.size() == 2);
+    ASSERT_TRUE(sc[0].sensorLocationX == 100);
+    ASSERT_TRUE(sc[0].sensorLocationY == 200);
+    ASSERT_TRUE(sc[0].sensorRadius == 30);
+    ASSERT_TRUE(sc[0].display == "screen1");
+    ASSERT_TRUE(sc[1].sensorLocationX == 200);
+    ASSERT_TRUE(sc[1].sensorLocationY == 400);
+    ASSERT_TRUE(sc[1].sensorRadius == 60);
+    ASSERT_TRUE(sc[1].display == "screen2");
 }
 
 TEST_F(FakeFingerprintEngineUdfpsTest, getSensorLocationBad) {
-    const std::vector<std::string> badStr{"", "100", "10:20", "10,20,5", "a:b:c"};
-    SensorLocation sc;
+    const std::vector<std::string> badStr{
+            "", "100", "10:20", "10,20,5", "a:b:c", "10:20:30:d1,40", "10:20:30:d1,40:50"};
+    std::vector<SensorLocation> sc;
     for (const auto& s : badStr) {
         Fingerprint::cfg().set<std::string>("sensor_location", s);
-        sc = mEngine.getSensorLocation();
-        ASSERT_TRUE(isDefaultLocation(sc));
+        sc.clear();
+        mEngine.getSensorLocation(sc);
+        ASSERT_TRUE(isDefaultLocation(sc[0]));
     }
 }
 
diff --git a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
index 25abffe..dd6534c 100644
--- a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
@@ -242,7 +242,7 @@
     mVhal->setLockoutEnable(false);
     mVhal->setSensorId(5);
     mVhal->setMaxEnrollmentPerUser(6);
-    mVhal->setNavigationGuesture(false);
+    mVhal->setNavigationGesture(false);
     mVhal->setDetectInteraction(false);
     mVhal->setDisplayTouch(false);
     mVhal->setControlIllumination(false);
diff --git a/bluetooth/1.0/Android.bp b/bluetooth/1.0/Android.bp
index bd1ca69..3ffc203 100644
--- a/bluetooth/1.0/Android.bp
+++ b/bluetooth/1.0/Android.bp
@@ -23,6 +23,6 @@
     gen_java: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
 }
diff --git a/bluetooth/1.1/Android.bp b/bluetooth/1.1/Android.bp
index f8a05f1..9c65b62 100644
--- a/bluetooth/1.1/Android.bp
+++ b/bluetooth/1.1/Android.bp
@@ -23,6 +23,6 @@
     gen_java: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
 }
diff --git a/bluetooth/aidl/Android.bp b/bluetooth/aidl/Android.bp
index 721be73..0daecf7 100644
--- a/bluetooth/aidl/Android.bp
+++ b/bluetooth/aidl/Android.bp
@@ -32,7 +32,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "33",
         },
diff --git a/bluetooth/audio/2.0/Android.bp b/bluetooth/audio/2.0/Android.bp
index 725ec11..61f9a35 100644
--- a/bluetooth/audio/2.0/Android.bp
+++ b/bluetooth/audio/2.0/Android.bp
@@ -26,6 +26,6 @@
     gen_java: false,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
 }
diff --git a/bluetooth/audio/2.1/Android.bp b/bluetooth/audio/2.1/Android.bp
index 4ca0bef..4d01a00 100644
--- a/bluetooth/audio/2.1/Android.bp
+++ b/bluetooth/audio/2.1/Android.bp
@@ -25,7 +25,7 @@
     ],
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
     gen_java: false,
 }
diff --git a/bluetooth/audio/aidl/Android.bp b/bluetooth/audio/aidl/Android.bp
index 356398d..3a0d0d6 100644
--- a/bluetooth/audio/aidl/Android.bp
+++ b/bluetooth/audio/aidl/Android.bp
@@ -48,7 +48,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "31",
         },
diff --git a/bluetooth/ranging/aidl/Android.bp b/bluetooth/ranging/aidl/Android.bp
index 4a60f87..0b1ab7c 100644
--- a/bluetooth/ranging/aidl/Android.bp
+++ b/bluetooth/ranging/aidl/Android.bp
@@ -31,7 +31,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "33",
         },
diff --git a/bluetooth/socket/aidl/Android.bp b/bluetooth/socket/aidl/Android.bp
index 21856d0..8b412b2 100644
--- a/bluetooth/socket/aidl/Android.bp
+++ b/bluetooth/socket/aidl/Android.bp
@@ -37,7 +37,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "33",
         },
diff --git a/compatibility_matrices/bump.py b/compatibility_matrices/bump.py
index bcb0fa6..63aa386 100755
--- a/compatibility_matrices/bump.py
+++ b/compatibility_matrices/bump.py
@@ -110,14 +110,11 @@
             "kernel_configs", "-a", " ".join(next_kernel_configs), android_bp
         ])
 
-        # update the SYSTEM_MATRIX_DEPS variable and the phony module's
-        # product_variables entry.
+        # Replace the phony module's product_variables entry to add the new FCM
+        # to the development targets (trunk* configs).
         lines = []
         with open(android_bp) as f:
             for line in f:
-              if f"    \"{self.device_module_name}\",\n" in line:
-                  lines.append(f"    \"{self.current_module_name}\",\n")
-
               if f"                \"{self.current_module_name}\",\n" in line:
                   lines.append(f"                \"{self.next_module_name}\",\n")
               else:
diff --git a/compatibility_matrices/finalize.py b/compatibility_matrices/finalize.py
new file mode 100755
index 0000000..ae048ea
--- /dev/null
+++ b/compatibility_matrices/finalize.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2025 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+"""
+Finalizes the current compatibility matrix and allows `next` targets to
+use the new FCM.
+"""
+
+import argparse
+import os
+import pathlib
+import re
+import subprocess
+import textwrap
+
+
+def check_call(*args, **kwargs):
+    print(args)
+    subprocess.check_call(*args, **kwargs)
+
+def check_output(*args, **kwargs):
+    print(args)
+    return subprocess.check_output(*args, **kwargs)
+
+class Bump(object):
+
+    def __init__(self, cmdline_args):
+        self.top = pathlib.Path(os.environ["ANDROID_BUILD_TOP"])
+        self.interfaces_dir = self.top / "hardware/interfaces"
+
+        self.current_level = cmdline_args.current_level
+        self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
+        self.device_module_name = "framework_compatibility_matrix.device.xml"
+
+    def run(self):
+        self.edit_android_bp()
+
+    def edit_android_bp(self):
+        android_bp = self.interfaces_dir / "compatibility_matrices/Android.bp"
+
+        # update the SYSTEM_MATRIX_DEPS variable to unconditionally include the
+        # latests FCM. This adds the file to `next` configs so releasing devices
+        # can use the latest interfaces.
+        lines = []
+        with open(android_bp) as f:
+            for line in f:
+              if f"    \"{self.device_module_name}\",\n" in line:
+                  lines.append(f"    \"{self.current_module_name}\",\n")
+
+              lines.append(line)
+
+        with open(android_bp, "w") as f:
+            f.write("".join(lines))
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument("current_level",
+                        type=str,
+                        help="VINTF level of the current version (e.g. 202404)")
+    cmdline_args = parser.parse_args()
+
+    Bump(cmdline_args).run()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/contexthub/aidl/Android.bp b/contexthub/aidl/Android.bp
index d49607d..df6e063 100644
--- a/contexthub/aidl/Android.bp
+++ b/contexthub/aidl/Android.bp
@@ -35,7 +35,7 @@
         ndk: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             min_sdk_version: "33",
             apps_enabled: true,
diff --git a/graphics/bufferqueue/1.0/Android.bp b/graphics/bufferqueue/1.0/Android.bp
index c7c6453..87c3892 100644
--- a/graphics/bufferqueue/1.0/Android.bp
+++ b/graphics/bufferqueue/1.0/Android.bp
@@ -25,7 +25,7 @@
     gen_java: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.media",
         "com.android.media.swcodec",
     ],
diff --git a/graphics/bufferqueue/2.0/Android.bp b/graphics/bufferqueue/2.0/Android.bp
index e9f75c1..54f68c6 100644
--- a/graphics/bufferqueue/2.0/Android.bp
+++ b/graphics/bufferqueue/2.0/Android.bp
@@ -27,7 +27,7 @@
     gen_java: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.media",
         "com.android.media.swcodec",
     ],
diff --git a/graphics/common/1.0/Android.bp b/graphics/common/1.0/Android.bp
index b876bf3..1683c22 100644
--- a/graphics/common/1.0/Android.bp
+++ b/graphics/common/1.0/Android.bp
@@ -20,7 +20,7 @@
     gen_java_constants: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.media.swcodec",
         "test_com.android.media.swcodec",
     ],
diff --git a/graphics/common/1.1/Android.bp b/graphics/common/1.1/Android.bp
index ff6c9b7..81df887 100644
--- a/graphics/common/1.1/Android.bp
+++ b/graphics/common/1.1/Android.bp
@@ -23,7 +23,7 @@
     gen_java_constants: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.media.swcodec",
         "test_com.android.media.swcodec",
     ],
diff --git a/graphics/common/1.2/Android.bp b/graphics/common/1.2/Android.bp
index b4663e5..e1f4fe0 100644
--- a/graphics/common/1.2/Android.bp
+++ b/graphics/common/1.2/Android.bp
@@ -24,7 +24,7 @@
     gen_java_constants: true,
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
         "com.android.media.swcodec",
         "test_com.android.media.swcodec",
     ],
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/vts/VtsComposerClient.cpp
index 9b6a005..f09482c 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.cpp
+++ b/graphics/composer/aidl/vts/VtsComposerClient.cpp
@@ -696,4 +696,10 @@
     return {mComposerClient->getMaxLayerPictureProfiles(display, &outMaxProfiles), outMaxProfiles};
 }
 
+std::pair<ScopedAStatus, std::vector<Luts>> VtsComposerClient::getLuts(
+        int64_t display, const std::vector<Buffer>& buffers) {
+    std::vector<Luts> outLuts;
+    return {mComposerClient->getLuts(display, buffers, &outLuts), std::move(outLuts)};
+}
+
 }  // namespace aidl::android::hardware::graphics::composer3::vts
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.h b/graphics/composer/aidl/vts/VtsComposerClient.h
index 53f5fae..f0dbe57 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.h
+++ b/graphics/composer/aidl/vts/VtsComposerClient.h
@@ -200,6 +200,9 @@
 
     std::pair<ScopedAStatus, int32_t> getMaxLayerPictureProfiles(int64_t display);
 
+    std::pair<ScopedAStatus, std::vector<Luts>> getLuts(int64_t display,
+                                                        const std::vector<Buffer>& buffers);
+
     static constexpr int32_t kMaxFrameIntervalNs = 50000000;  // 20fps
     static constexpr int32_t kNoFrameIntervalNs = 0;
 
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
index c1900d7..6b43cc8 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -3356,6 +3356,30 @@
     }
 }
 
+// @NonApiTest = check the status if calling getLuts
+TEST_P(GraphicsComposerAidlCommandV4Test, GetLuts) {
+    for (auto& display : mDisplays) {
+        int64_t displayId = display.getDisplayId();
+        auto& writer = getWriter(displayId);
+        const auto layer = createOnScreenLayer(display);
+        const auto buffer = allocate(::android::PIXEL_FORMAT_RGBA_8888);
+        ASSERT_NE(nullptr, buffer->handle);
+        writer.setLayerBuffer(displayId, layer, /*slot*/ 0, buffer->handle,
+                              /*acquireFence*/ -1);
+        Buffer aidlbuffer;
+        aidlbuffer.handle = ::android::dupToAidl(buffer->handle);
+        std::vector<Buffer> buffers;
+        buffers.push_back(std::move(aidlbuffer));
+        const auto& [status, _] = mComposerClient->getLuts(displayId, buffers);
+        if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
+            status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
+            GTEST_SKIP() << "getLuts is not supported";
+            return;
+        }
+        ASSERT_TRUE(status.isOk());
+    }
+}
+
 TEST_P(GraphicsComposerAidlCommandV4Test, SetUnsupportedLayerLuts) {
     auto& writer = getWriter(getPrimaryDisplayId());
     const auto& [layerStatus, layer] =
diff --git a/radio/1.0/Android.bp b/radio/1.0/Android.bp
index e49a50d..09cf9aa 100644
--- a/radio/1.0/Android.bp
+++ b/radio/1.0/Android.bp
@@ -25,7 +25,7 @@
     ],
     apex_available: [
         "//apex_available:platform",
-        "com.android.btservices",
+        "com.android.bt",
     ],
     gen_java: true,
 }
diff --git a/radio/aidl/Android.bp b/radio/aidl/Android.bp
index a9ca3fa..a79c807 100644
--- a/radio/aidl/Android.bp
+++ b/radio/aidl/Android.bp
@@ -251,7 +251,7 @@
         java: {
             apex_available: [
                 "//apex_available:platform",
-                "com.android.btservices",
+                "com.android.bt",
             ],
             sdk_version: "module_current",
             min_sdk_version: "Tiramisu",
diff --git a/security/keymint/aidl/default/hal/lib.rs b/security/keymint/aidl/default/hal/lib.rs
index fad807f..196cf17 100644
--- a/security/keymint/aidl/default/hal/lib.rs
+++ b/security/keymint/aidl/default/hal/lib.rs
@@ -20,6 +20,19 @@
 use kmr_hal::env::get_property;
 use log::error;
 
+/// Retrieve the most significant attestation property for `name`.
+fn attestation_property(name: &str) -> Vec<u8> {
+    let prop_val = get_property(&format!("ro.product.vendor.{}", name)).unwrap_or_default();
+    if !prop_val.is_empty() {
+        prop_val
+    } else {
+        get_property(&format!("ro.product.{}", name))
+            .unwrap_or_else(|prop_name| format!("{} unavailable", prop_name))
+    }
+    .as_bytes()
+    .to_vec()
+}
+
 /// Populate attestation ID information based on properties (where available).
 /// Retrieving the serial number requires SELinux permission.
 pub fn attestation_id_info() -> kmr_wire::AttestationIdInfo {
@@ -30,12 +43,12 @@
             .to_vec()
     };
     kmr_wire::AttestationIdInfo {
-        brand: prop("ro.product.brand"),
-        device: prop("ro.product.device"),
-        product: prop("ro.product.name"),
+        brand: attestation_property("brand"),
+        device: attestation_property("device"),
+        product: attestation_property("name"),
         serial: prop("ro.serialno"),
-        manufacturer: prop("ro.product.manufacturer"),
-        model: prop("ro.product.model"),
+        manufacturer: attestation_property("manufacturer"),
+        model: attestation_property("model"),
         // Currently modem_simulator always returns one fixed value. See `handleGetIMEI` in
         // device/google/cuttlefish/host/commands/modem_simulator/misc_service.cpp for more details.
         // TODO(b/263188546): Use device-specific IMEI values when available.
diff --git a/virtualization/capabilities_service/README.md b/virtualization/capabilities_service/README.md
new file mode 100644
index 0000000..7dc141e
--- /dev/null
+++ b/virtualization/capabilities_service/README.md
@@ -0,0 +1,9 @@
+The IVmCapabilitiesService HAL is used in a flow to grant a pVM a capability to
+issue vendor-specific SMCs. For more information see: TODO(ioffe): link the docs
+
+Here is a brief overview of the subdirectories structure:
+
+* default/ - a reference implementation of the HAL that partners can integrate
+    in their products.
+* noop/ - a no-op implementation is used in cuttlefish for mixed build testing.
+* vts/ - VTS tests for this HAL.
diff --git a/virtualization/capabilities_service/noop/Android.bp b/virtualization/capabilities_service/noop/Android.bp
new file mode 100644
index 0000000..37dc1a7
--- /dev/null
+++ b/virtualization/capabilities_service/noop/Android.bp
@@ -0,0 +1,34 @@
+package {
+    default_team: "trendy_team_virtualization",
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_binary {
+    name: "android.hardware.virtualization.capabilities.capabilities_service-noop",
+    relative_install_path: "hw",
+    vendor: true,
+    installable: true,
+    prefer_rlib: true,
+    rustlibs: [
+        "android.hardware.virtualization.capabilities.capabilities_service-V1-rust",
+        "libanyhow",
+        "libandroid_logger",
+        "libbinder_rs",
+        "liblog_rust",
+    ],
+    srcs: [
+        "src/main.rs",
+    ],
+    init_rc: [
+        "android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.rc",
+    ],
+    vintf_fragment_modules: [
+        "android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml",
+    ],
+}
+
+vintf_fragment {
+    name: "android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml",
+    src: "android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml",
+    vendor: true,
+}
diff --git a/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.rc b/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.rc
new file mode 100644
index 0000000..58c554a
--- /dev/null
+++ b/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.rc
@@ -0,0 +1,6 @@
+service vendor.vm_capabilities_service /vendor/bin/hw/android.hardware.virtualization.capabilities.capabilities_service-noop
+  interface aidl android.hardware.virtualization.capabilities.IVmCapabilitiesService/noop
+  class hal
+  disabled
+  user nobody
+  group nobody
diff --git a/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml b/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml
new file mode 100644
index 0000000..8ecb9e5
--- /dev/null
+++ b/virtualization/capabilities_service/noop/android.hardware.virtualization.capabilities.no_op_vm_capabilities_service.xml
@@ -0,0 +1,10 @@
+<manifest version="1.0" type="device">
+    <hal format="aidl">
+        <name>android.hardware.virtualization.capabilities</name>
+        <version>1</version>
+        <interface>
+            <name>IVmCapabilitiesService</name>
+            <instance>noop</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/virtualization/capabilities_service/noop/src/aidl.rs b/virtualization/capabilities_service/noop/src/aidl.rs
new file mode 100644
index 0000000..8d85e49
--- /dev/null
+++ b/virtualization/capabilities_service/noop/src/aidl.rs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//! No-op implementation of the IVmCapabilitiesService AIDL interface.
+
+use android_hardware_virtualization_capabilities_capabilities_service::aidl::android::hardware::virtualization::capabilities::IVmCapabilitiesService::IVmCapabilitiesService;
+use binder::{Interface, ParcelFileDescriptor};
+use log::info;
+
+/// No-op implementation of IVmCapabilitiesService
+pub struct NoOpVmCapabilitiesService {}
+
+impl NoOpVmCapabilitiesService {
+    pub fn init() -> NoOpVmCapabilitiesService {
+        let service = NoOpVmCapabilitiesService {};
+        service
+    }
+}
+
+impl Interface for NoOpVmCapabilitiesService {}
+
+impl IVmCapabilitiesService for NoOpVmCapabilitiesService {
+
+    fn grantAccessToVendorTeeServices(&self,
+        vm_fd: &ParcelFileDescriptor, tee_services: &[String]) -> binder::Result<()> {
+        info!("received {vm_fd:?} {tee_services:?}");
+        Ok(())
+    }
+}
diff --git a/virtualization/capabilities_service/noop/src/main.rs b/virtualization/capabilities_service/noop/src/main.rs
new file mode 100644
index 0000000..9440996
--- /dev/null
+++ b/virtualization/capabilities_service/noop/src/main.rs
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//! No-op implementation of the IVmCapabilitiesService.
+
+mod aidl;
+
+use crate::aidl::NoOpVmCapabilitiesService;
+use anyhow::{bail, Context, Result};
+use log::{error, info, LevelFilter};
+use binder::{register_lazy_service, BinderFeatures, ProcessState};
+use android_hardware_virtualization_capabilities_capabilities_service::aidl::android::hardware::virtualization::capabilities::IVmCapabilitiesService::BnVmCapabilitiesService;
+
+const SERVICE_NAME: &str = "android.hardware.virtualization.capabilities.IVmCapabilitiesService/noop";
+
+fn try_main() -> Result<()> {
+    // Initialize Android logging.
+    android_logger::init_once(
+        android_logger::Config::default()
+            .with_tag("NoOpIVmCapabilitiesService")
+            .with_max_level(LevelFilter::Info)
+            .with_log_buffer(android_logger::LogId::System),
+    );
+
+    ProcessState::start_thread_pool();
+    let service_impl = NoOpVmCapabilitiesService::init();
+    let service = BnVmCapabilitiesService::new_binder(service_impl, BinderFeatures::default());
+    register_lazy_service(SERVICE_NAME, service.as_binder())
+        .with_context(|| format!("failed to register {SERVICE_NAME}"))?;
+    info!("Registered Binder service, joining threadpool.");
+    ProcessState::join_thread_pool();
+    bail!("thread pool unexpectedly ended");
+}
+
+fn main() {
+    if let Err(e) = try_main() {
+        error!("failed with {e:?}");
+        std::process::exit(1);
+    }
+}
diff --git a/virtualization/capabilities_service/vts/Android.bp b/virtualization/capabilities_service/vts/Android.bp
new file mode 100644
index 0000000..1aa21c9
--- /dev/null
+++ b/virtualization/capabilities_service/vts/Android.bp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package {
+    default_team: "trendy_team_virtualization",
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_test {
+    name: "VtsVmCapabilitiesServiceTest",
+    srcs: ["tests.rs"],
+    defaults: [
+        "rdroidtest.defaults",
+    ],
+    test_suites: [
+        "general-tests",
+        "vts",
+    ],
+    test_config: "AndroidTest.xml",
+    rustlibs: [
+        "android.hardware.virtualization.capabilities.capabilities_service-V1-rust",
+        "libbinder_rs",
+    ],
+    require_root: true,
+}
diff --git a/virtualization/capabilities_service/vts/AndroidTest.xml b/virtualization/capabilities_service/vts/AndroidTest.xml
new file mode 100644
index 0000000..2c3dadb
--- /dev/null
+++ b/virtualization/capabilities_service/vts/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2025 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Config for VmCapabilitiesService VTS tests.">
+  <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+
+  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+    <option name="push-file" key="VtsVmCapabilitiesServiceTest"
+      value="/data/local/tmp/VtsVmCapabilitiesServiceTest" />
+  </target_preparer>
+
+  <test class="com.android.tradefed.testtype.rust.RustBinaryTest" >
+    <option name="test-device-path" value="/data/local/tmp" />
+    <option name="module-name" value="VtsVmCapabilitiesServiceTest" />
+  </test>
+</configuration>
diff --git a/virtualization/capabilities_service/vts/tests.rs b/virtualization/capabilities_service/vts/tests.rs
new file mode 100644
index 0000000..9f0b7fd
--- /dev/null
+++ b/virtualization/capabilities_service/vts/tests.rs
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+use android_hardware_virtualization_capabilities_capabilities_service::aidl::android::hardware::virtualization::capabilities::IVmCapabilitiesService::IVmCapabilitiesService;
+use rdroidtest::rdroidtest;
+use std::fs::File;
+
+const VM_CAPABILITIES_SERVICE: &str =
+    "android.hardware.virtualization.capabilities.IVmCapabilitiesService";
+
+/// Returns all available instances of VmCapabilitiesService.
+/// Note: it actually returns a pair of (<instance_name>, <instance_name)). This is a requirement
+/// of the rdroidtest framework for parameterized tests. See
+/// platform_testing/libraries/rdroidtest/README.md for more information.
+fn get_instances() -> Vec<(String, String)> {
+    binder::get_declared_instances(VM_CAPABILITIES_SERVICE)
+        .unwrap_or_default()
+        .into_iter()
+        .map(|v| (v.clone(), v))
+        .collect()
+}
+
+fn connect(instance: &str) -> binder::Strong<dyn IVmCapabilitiesService> {
+    let name = format!("{VM_CAPABILITIES_SERVICE}/{instance}");
+    binder::wait_for_interface(&name).unwrap()
+}
+
+/// A very basic test that simply connects to the service and send bogus data.
+#[rdroidtest(get_instances())]
+fn connect_to_service(instance: String) {
+    let service = connect(&instance);
+    let dev_null = File::open("/dev/null").expect("failed to open /dev/null");
+    let fd = binder::ParcelFileDescriptor::new(dev_null);
+    // In this test we don't care what service returns.
+    let _ = service.grantAccessToVendorTeeServices(&fd, &[]);
+}
+
+rdroidtest::test_main!();
diff --git a/wifi/aidl/vts/functional/wifi_rtt_controller_aidl_test.cpp b/wifi/aidl/vts/functional/wifi_rtt_controller_aidl_test.cpp
index aca1364..7f5de5c 100644
--- a/wifi/aidl/vts/functional/wifi_rtt_controller_aidl_test.cpp
+++ b/wifi/aidl/vts/functional/wifi_rtt_controller_aidl_test.cpp
@@ -37,6 +37,8 @@
 using aidl::android::hardware::wifi::RttBw;
 using aidl::android::hardware::wifi::RttCapabilities;
 using aidl::android::hardware::wifi::RttConfig;
+using aidl::android::hardware::wifi::RttLciInformation;
+using aidl::android::hardware::wifi::RttLcrInformation;
 using aidl::android::hardware::wifi::RttPeerType;
 using aidl::android::hardware::wifi::RttPreamble;
 using aidl::android::hardware::wifi::RttResponder;
@@ -171,6 +173,7 @@
     RttResponder responder = {};
     EXPECT_TRUE(wifi_rtt_controller_->getResponderInfo(&responder).isOk());
     EXPECT_TRUE(wifi_rtt_controller_->enableResponder(cmdId, channelInfo, 10, responder).isOk());
+    EXPECT_TRUE(wifi_rtt_controller_->disableResponder(cmdId).isOk());
 }
 
 /*
@@ -361,6 +364,31 @@
     sleep(2);
 }
 
+/*
+ * GetBoundIface
+ */
+TEST_P(WifiRttControllerAidlTest, GetBoundIface) {
+    std::shared_ptr<IWifiStaIface> boundIface;
+    EXPECT_TRUE(wifi_rtt_controller_->getBoundIface(&boundIface).isOk());
+    EXPECT_NE(boundIface, nullptr);
+}
+
+/*
+ * Set LCI and LCR
+ */
+TEST_P(WifiRttControllerAidlTest, SetLciAndLcr) {
+    RttCapabilities caps = getCapabilities();
+    if (!caps.responderSupported) {
+        GTEST_SKIP() << "Skipping because responder is not supported";
+    }
+
+    int cmdId = 55;
+    RttLciInformation lci = {};
+    RttLcrInformation lcr = {};
+    EXPECT_TRUE(wifi_rtt_controller_->setLci(cmdId, lci).isOk());
+    EXPECT_TRUE(wifi_rtt_controller_->setLcr(cmdId, lcr).isOk());
+}
+
 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiRttControllerAidlTest);
 INSTANTIATE_TEST_SUITE_P(WifiTest, WifiRttControllerAidlTest,
                          testing::ValuesIn(android::getAidlHalInstanceNames(IWifi::descriptor)),
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
index 257607f..2f27119 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
@@ -48,7 +48,6 @@
 using aidl::android::hardware::wifi::supplicant::QosCharacteristics;
 using aidl::android::hardware::wifi::supplicant::QosPolicyScsData;
 using aidl::android::hardware::wifi::supplicant::QosPolicyScsRequestStatus;
-using aidl::android::hardware::wifi::supplicant::RxFilterType;
 using aidl::android::hardware::wifi::supplicant::SignalPollResult;
 using aidl::android::hardware::wifi::supplicant::UsdBaseConfig;
 using aidl::android::hardware::wifi::supplicant::UsdCapabilities;
@@ -977,17 +976,6 @@
 }
 
 /*
- * Test that we can add, remove, start, and stop an RX filter.
- */
-TEST_P(SupplicantStaIfaceAidlTest, ConfigureRxFilter) {
-    RxFilterType filterType = RxFilterType::V4_MULTICAST;
-    EXPECT_TRUE(sta_iface_->addRxFilter(filterType).isOk());
-    EXPECT_TRUE(sta_iface_->startRxFilter().isOk());
-    EXPECT_TRUE(sta_iface_->stopRxFilter().isOk());
-    EXPECT_TRUE(sta_iface_->removeRxFilter(filterType).isOk());
-}
-
-/*
  * Test that we can start and cancel all WPS methods.
  */
 TEST_P(SupplicantStaIfaceAidlTest, StartAndCancelWps) {