Merge "Keep a single/shared RRO APEX" into main am: fc518eddd6 am: 8784a7c84f am: 8af9fe9438

Original change: https://android-review.googlesource.com/c/device/google/cuttlefish/+/2864413

Change-Id: I116a457000eba889b0ebc14bdb8f81da69e4f0a2
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/TEST_MAPPING b/TEST_MAPPING
index dc28463..345e46e 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -31,6 +31,15 @@
     },
     {
       "name": "CtsScopedStorageDeviceOnlyTest"
+    },
+    {
+      "name": "CtsScopedStorageBypassDatabaseOperationsTest"
+    },
+    {
+      "name": "CtsScopedStorageGeneralTest"
+    },
+    {
+      "name": "CtsScopedStorageRedactUriTest"
     }
   ],
   "auto-presubmit": [
diff --git a/apex/com.google.cf.wifi/Android.bp b/apex/com.google.cf.wifi/Android.bp
index 6d63886..cd6d7a6 100644
--- a/apex/com.google.cf.wifi/Android.bp
+++ b/apex/com.google.cf.wifi/Android.bp
@@ -42,7 +42,7 @@
     soc_specific: true,
     binaries: [
         "rename_netiface",
-        "wpa_supplicant_cf",
+        "//external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant:wpa_supplicant",
         "setup_wifi",
         "//device/generic/goldfish:mac80211_create_radios",
         "hostapd_cf",
diff --git a/apex/com.google.cf.wifi/com.google.cf.wifi.rc b/apex/com.google.cf.wifi/com.google.cf.wifi.rc
index 1465d13..c0fff55 100644
--- a/apex/com.google.cf.wifi/com.google.cf.wifi.rc
+++ b/apex/com.google.cf.wifi/com.google.cf.wifi.rc
@@ -15,7 +15,7 @@
     oneshot
     disabled    # Started on post-fs-data
 
-service wpa_supplicant /apex/com.android.wifi.hal/bin/hw/wpa_supplicant_cf \
+service wpa_supplicant /apex/com.android.wifi.hal/bin/hw/wpa_supplicant \
         -O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1p2p_device=1 \
         -m/apex/com.android.wifi.hal/etc/wifi/p2p_supplicant.conf \
         -g@android:wpa_wlan0 -dd
diff --git a/apex/com.google.cf.wifi/file_contexts b/apex/com.google.cf.wifi/file_contexts
index 8c9bf89..bb96251 100644
--- a/apex/com.google.cf.wifi/file_contexts
+++ b/apex/com.google.cf.wifi/file_contexts
@@ -2,7 +2,7 @@
 /bin/rename_netiface         u:object_r:rename_netiface_exec:s0
 /bin/setup_wifi              u:object_r:setup_wifi_exec:s0
 /bin/init\.wifi            u:object_r:init_wifi_sh_exec:s0
-/bin/hw/wpa_supplicant_cf    u:object_r:hal_wifi_supplicant_default_exec:s0
+/bin/hw/wpa_supplicant    u:object_r:hal_wifi_supplicant_default_exec:s0
 /bin/hw/hostapd_cf           u:object_r:hal_wifi_hostapd_default_exec:s0
 /bin/mac80211_create_radios  u:object_r:mac80211_create_radios_exec:s0
 /etc/permissions(/.*)?       u:object_r:vendor_configs_file:s0
diff --git a/guest/hals/camera/Android.bp b/guest/hals/camera/Android.bp
index ce4c46c..c6c8732 100644
--- a/guest/hals/camera/Android.bp
+++ b/guest/hals/camera/Android.bp
@@ -77,6 +77,7 @@
         "libhidlbase",
         "liblog",
         "libutils",
+        "libui",
         "libvsock_utils",
         "libcuttlefish_fs",
         "libjsoncpp",
diff --git a/guest/hals/camera/cached_stream_buffer.cpp b/guest/hals/camera/cached_stream_buffer.cpp
index ff692c7..7e99581 100644
--- a/guest/hals/camera/cached_stream_buffer.cpp
+++ b/guest/hals/camera/cached_stream_buffer.cpp
@@ -96,8 +96,23 @@
       acquire_fence_ = -1;
     }
   }
-  IMapper::Rect region{0, 0, width, height};
-  return g_importer.lockYCbCr(buffer_, GRALLOC_USAGE_SW_WRITE_OFTEN, region);
+  android::Rect region{0, 0, width, height};
+  android_ycbcr result =
+      g_importer.lockYCbCr(buffer_, GRALLOC_USAGE_SW_WRITE_OFTEN, region);
+  if (result.ystride > UINT32_MAX || result.cstride > UINT32_MAX ||
+      result.chroma_step > UINT32_MAX) {
+    ALOGE(
+        "%s: lockYCbCr failed. Unexpected values! ystride: %zu cstride: %zu "
+        "chroma_step: %zu",
+        __FUNCTION__, result.ystride, result.cstride, result.chroma_step);
+    return {};
+  }
+  return {.y = result.y,
+          .cb = result.cb,
+          .cr = result.cr,
+          .yStride = static_cast<uint32_t>(result.ystride),
+          .cStride = static_cast<uint32_t>(result.cstride),
+          .chromaStep = static_cast<uint32_t>(result.chroma_step)};
 }
 
 void* CachedStreamBuffer::acquireAsBlob(int32_t size, int timeout_ms) {
diff --git a/guest/hals/camera/cached_stream_buffer.h b/guest/hals/camera/cached_stream_buffer.h
index 09a4047..19d738d 100644
--- a/guest/hals/camera/cached_stream_buffer.h
+++ b/guest/hals/camera/cached_stream_buffer.h
@@ -15,12 +15,16 @@
  */
 #pragma once
 #include <android/hardware/camera/device/3.4/ICameraDeviceSession.h>
+#include <android/hardware/graphics/mapper/2.0/IMapper.h>
+#include <android/hardware/graphics/mapper/3.0/IMapper.h>
+#include <android/hardware/graphics/mapper/4.0/IMapper.h>
 #include "HandleImporter.h"
 
 namespace android::hardware::camera::device::V3_4::implementation {
 
 using ::android::hardware::camera::common::V1_0::helper::HandleImporter;
 using ::android::hardware::camera::device::V3_2::StreamBuffer;
+using ::android::hardware::graphics::mapper::V2_0::YCbCrLayout;
 
 // Small wrapper for allocating/freeing native handles
 class ReleaseFence {
diff --git a/guest/hals/ril/reference-libril/Android.bp b/guest/hals/ril/reference-libril/Android.bp
index de07522..09acbd4 100644
--- a/guest/hals/ril/reference-libril/Android.bp
+++ b/guest/hals/ril/reference-libril/Android.bp
@@ -43,16 +43,16 @@
     ],
     shared_libs: [
         "android.hardware.radio-library.compat",
-        "android.hardware.radio.config-V2-ndk",
-        "android.hardware.radio.data-V2-ndk",
-        "android.hardware.radio.ims-V1-ndk",
-        "android.hardware.radio.ims.media-V1-ndk",
-        "android.hardware.radio.messaging-V2-ndk",
-        "android.hardware.radio.modem-V2-ndk",
-        "android.hardware.radio.network-V2-ndk",
+        "android.hardware.radio.config-V3-ndk",
+        "android.hardware.radio.data-V3-ndk",
+        "android.hardware.radio.ims-V2-ndk",
+        "android.hardware.radio.ims.media-V2-ndk",
+        "android.hardware.radio.messaging-V3-ndk",
+        "android.hardware.radio.modem-V3-ndk",
+        "android.hardware.radio.network-V3-ndk",
         "android.hardware.radio.sap-V1-ndk",
-        "android.hardware.radio.sim-V2-ndk",
-        "android.hardware.radio.voice-V2-ndk",
+        "android.hardware.radio.sim-V3-ndk",
+        "android.hardware.radio.voice-V3-ndk",
         "[email protected]",
         "[email protected]",
         "[email protected]",
diff --git a/guest/hals/ril/reference-libril/RefRadioNetwork.cpp b/guest/hals/ril/reference-libril/RefRadioNetwork.cpp
index 407efaa..941cd24 100644
--- a/guest/hals/ril/reference-libril/RefRadioNetwork.cpp
+++ b/guest/hals/ril/reference-libril/RefRadioNetwork.cpp
@@ -89,4 +89,28 @@
     respond()->isNullCipherAndIntegrityEnabledResponse(responseInfo(serial), true);
     return ok();
 }
+
+ScopedAStatus RefRadioNetwork::setCellularIdentifierTransparencyEnabled(int32_t serial, bool enabled) {
+    mIsCellularIdentifierTransparencyEnabled = enabled;
+    respond()->setCellularIdentifierTransparencyEnabledResponse(responseInfo(serial));
+    return ok();
+}
+
+ScopedAStatus RefRadioNetwork::isCellularIdentifierTransparencyEnabled(int32_t serial) {
+    respond()->isCellularIdentifierTransparencyEnabledResponse(
+            responseInfo(serial), mIsCellularIdentifierTransparencyEnabled);
+    return ok();
+}
+
+ScopedAStatus RefRadioNetwork::setSecurityAlgorithmsUpdatedEnabled(int32_t serial, bool enabled) {
+    mIsCipheringTransparencyEnabled = enabled;
+    respond()->setSecurityAlgorithmsUpdatedEnabledResponse(responseInfo(serial));
+    return ok();
+}
+
+ScopedAStatus RefRadioNetwork::isSecurityAlgorithmsUpdatedEnabled(int32_t serial) {
+    respond()->isSecurityAlgorithmsUpdatedEnabledResponse(responseInfo(serial),
+                                                          mIsCipheringTransparencyEnabled);
+    return ok();
+}
 }  // namespace cf::ril
diff --git a/guest/hals/ril/reference-libril/RefRadioNetwork.h b/guest/hals/ril/reference-libril/RefRadioNetwork.h
index c99bf18..caf4e5e 100644
--- a/guest/hals/ril/reference-libril/RefRadioNetwork.h
+++ b/guest/hals/ril/reference-libril/RefRadioNetwork.h
@@ -22,6 +22,9 @@
 class RefRadioNetwork : public android::hardware::radio::compat::RadioNetwork {
     ::aidl::android::hardware::radio::network::UsageSetting mUsageSetting =
             ::aidl::android::hardware::radio::network::UsageSetting::VOICE_CENTRIC;
+    // As per the specs, the default is true.
+    bool mIsCellularIdentifierTransparencyEnabled = true;
+    bool mIsCipheringTransparencyEnabled = true;
 
   public:
     using android::hardware::radio::compat::RadioNetwork::RadioNetwork;
@@ -49,7 +52,16 @@
     ::ndk::ScopedAStatus setN1ModeEnabled(int32_t serial, bool enable) override;
 
     ::ndk::ScopedAStatus setNullCipherAndIntegrityEnabled(int32_t serial, bool enabled) override;
+
     ::ndk::ScopedAStatus isNullCipherAndIntegrityEnabled(int32_t serial) override;
+
+    ::ndk::ScopedAStatus setCellularIdentifierTransparencyEnabled(int32_t serial, bool enabled) override;
+
+    ::ndk::ScopedAStatus isCellularIdentifierTransparencyEnabled(int32_t serial) override;
+
+    ::ndk::ScopedAStatus setSecurityAlgorithmsUpdatedEnabled(int32_t serial, bool enabled) override;
+
+    ::ndk::ScopedAStatus isSecurityAlgorithmsUpdatedEnabled(int32_t serial) override;
 };
 
 }  // namespace cf::ril
diff --git a/guest/hals/ril/reference-libril/[email protected] b/guest/hals/ril/reference-libril/[email protected]
index 0ffa0d7..a581292 100644
--- a/guest/hals/ril/reference-libril/[email protected]
+++ b/guest/hals/ril/reference-libril/[email protected]
@@ -1,40 +1,42 @@
 <manifest version="1.0" type="device">
     <hal format="aidl">
         <name>android.hardware.radio.config</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioConfig/default</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.data</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioData/slot1</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.ims</name>
+        <version>2</version>
         <fqname>IRadioIms/slot1</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.ims.media</name>
+        <version>2</version>
         <fqname>IImsMedia/default</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.messaging</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioMessaging/slot1</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.modem</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioModem/slot1</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.network</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioNetwork/slot1</fqname>
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.sim</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioSim/slot1</fqname>
     </hal>
     <hal format="aidl">
@@ -43,7 +45,7 @@
     </hal>
     <hal format="aidl">
         <name>android.hardware.radio.voice</name>
-        <version>2</version>
+        <version>3</version>
         <fqname>IRadioVoice/slot1</fqname>
     </hal>
 </manifest>
diff --git a/guest/services/cf_satellite_service/src/com/google/android/telephony/satellite/CFSatelliteService.java b/guest/services/cf_satellite_service/src/com/google/android/telephony/satellite/CFSatelliteService.java
index db9cce1..1473835 100644
--- a/guest/services/cf_satellite_service/src/com/google/android/telephony/satellite/CFSatelliteService.java
+++ b/guest/services/cf_satellite_service/src/com/google/android/telephony/satellite/CFSatelliteService.java
@@ -21,27 +21,25 @@
 import android.content.Intent;
 import android.os.Binder;
 import android.os.IBinder;
+import android.telephony.IBooleanConsumer;
+import android.telephony.IIntegerConsumer;
 import android.telephony.satellite.stub.ISatelliteCapabilitiesConsumer;
 import android.telephony.satellite.stub.ISatelliteListener;
 import android.telephony.satellite.stub.NTRadioTechnology;
 import android.telephony.satellite.stub.PointingInfo;
 import android.telephony.satellite.stub.SatelliteCapabilities;
 import android.telephony.satellite.stub.SatelliteDatagram;
-import android.telephony.satellite.stub.SatelliteError;
+import android.telephony.satellite.stub.SatelliteResult;
 import android.telephony.satellite.stub.SatelliteImplBase;
 import android.telephony.satellite.stub.SatelliteModemState;
 import android.telephony.satellite.stub.SatelliteService;
 
-import com.android.internal.telephony.IBooleanConsumer;
-import com.android.internal.telephony.IIntegerConsumer;
 import com.android.internal.util.FunctionalUtils;
 import com.android.telephony.Rlog;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executor;
 
@@ -58,7 +56,7 @@
     /** SatelliteCapabilities constant indicating the maximum number of characters per datagram. */
     private static final int MAX_BYTES_PER_DATAGRAM = 339;
 
-    @NonNull private final Map<IBinder, ISatelliteListener> mListeners = new HashMap<>();
+    @NonNull private final Set<ISatelliteListener> mListeners = new HashSet<>();
 
     private boolean mIsCommunicationAllowedInLocation;
     private boolean mIsEnabled;
@@ -112,7 +110,7 @@
     @Override
     public void setSatelliteListener(@NonNull ISatelliteListener listener) {
         logd("setSatelliteListener");
-        mListeners.put(listener.asBinder(), listener);
+        mListeners.add(listener);
     }
 
     @Override
@@ -127,7 +125,7 @@
         } else {
             updateSatelliteModemState(SatelliteModemState.SATELLITE_MODEM_STATE_IDLE);
         }
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
@@ -144,13 +142,13 @@
     private void enableSatellite(@NonNull IIntegerConsumer errorCallback) {
         mIsEnabled = true;
         updateSatelliteModemState(SatelliteModemState.SATELLITE_MODEM_STATE_IDLE);
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     private void disableSatellite(@NonNull IIntegerConsumer errorCallback) {
         mIsEnabled = false;
         updateSatelliteModemState(SatelliteModemState.SATELLITE_MODEM_STATE_OFF);
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
@@ -184,20 +182,20 @@
         if (!verifySatelliteModemState(errorCallback)) {
             return;
         }
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
     public void stopSendingSatellitePointingInfo(@NonNull IIntegerConsumer errorCallback) {
         logd("stopSendingSatellitePointingInfo");
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
     public void provisionSatelliteService(@NonNull String token, @NonNull byte[] provisionData,
             @NonNull IIntegerConsumer errorCallback) {
         logd("provisionSatelliteService");
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
         updateSatelliteProvisionState(true);
     }
 
@@ -205,7 +203,7 @@
     public void deprovisionSatelliteService(@NonNull String token,
             @NonNull IIntegerConsumer errorCallback) {
         logd("deprovisionSatelliteService");
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
         updateSatelliteProvisionState(false);
     }
 
@@ -219,14 +217,14 @@
     @Override
     public void pollPendingSatelliteDatagrams(@NonNull IIntegerConsumer errorCallback) {
         logd("pollPendingSatelliteDatagrams");
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
     public void sendSatelliteDatagram(@NonNull SatelliteDatagram datagram, boolean isEmergency,
             @NonNull IIntegerConsumer errorCallback) {
         logd("sendSatelliteDatagram");
-        runWithExecutor(() -> errorCallback.accept(SatelliteError.ERROR_NONE));
+        runWithExecutor(() -> errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS));
     }
 
     @Override
@@ -263,15 +261,18 @@
      */
     private boolean verifySatelliteModemState(@NonNull IIntegerConsumer errorCallback) {
         if (!mIsSupported) {
-            runWithExecutor(() -> errorCallback.accept(SatelliteError.REQUEST_NOT_SUPPORTED));
+            runWithExecutor(() -> errorCallback.accept(
+                SatelliteResult.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED));
             return false;
         }
         if (!mIsProvisioned) {
-            runWithExecutor(() -> errorCallback.accept(SatelliteError.SERVICE_NOT_PROVISIONED));
+            runWithExecutor(() -> errorCallback.accept(
+                SatelliteResult.SATELLITE_RESULT_SERVICE_NOT_PROVISIONED));
             return false;
         }
         if (!mIsEnabled) {
-            runWithExecutor(() -> errorCallback.accept(SatelliteError.INVALID_MODEM_STATE));
+            runWithExecutor(() -> errorCallback.accept(
+                SatelliteResult.SATELLITE_RESULT_INVALID_MODEM_STATE));
             return false;
         }
         return true;
@@ -286,8 +287,7 @@
         if (modemState == mModemState) {
             return;
         }
-        logd("updateSatelliteModemState: mListeners.size=" + mListeners.size());
-        mListeners.values().forEach(listener -> runWithExecutor(() ->
+        mListeners.forEach(listener -> runWithExecutor(() ->
                 listener.onSatelliteModemStateChanged(modemState)));
         mModemState = modemState;
     }
@@ -302,9 +302,8 @@
         if (isProvisioned == mIsProvisioned) {
             return;
         }
-        logd("updateSatelliteProvisionState: mListeners.size=" + mListeners.size());
         mIsProvisioned = isProvisioned;
-        mListeners.values().forEach(listener -> runWithExecutor(() ->
+        mListeners.forEach(listener -> runWithExecutor(() ->
                 listener.onSatelliteProvisionStateChanged(mIsProvisioned)));
     }
 
diff --git a/host/commands/cvd_load_tester/end_to_end_test/multi/demo.json b/host/commands/cvd_load_tester/end_to_end_test/multi/demo.json
new file mode 100644
index 0000000..00af4bd
--- /dev/null
+++ b/host/commands/cvd_load_tester/end_to_end_test/multi/demo.json
@@ -0,0 +1,27 @@
+{
+    "instances" :
+    [
+        {
+            "@import" : "phone",
+            "vm": {
+                "memory_mb": 8192,
+                "setupwizard_mode": "OPTIONAL",
+                "cpus": 4
+            },
+            "disk": {
+                "default_build": "git_master/cf_x86_64_phone-userdebug"
+            }
+        },
+        {
+            "@import" : "wearable",
+            "vm": {
+                "memory_mb": 8192,
+                "setupwizard_mode": "REQUIRED",
+                "cpus": 4
+            },
+            "disk": {
+                "default_build": "git_master/cf_gwear_x86-userdebug"
+            }
+        }
+    ]
+}
diff --git a/shared/api_level.h b/shared/api_level.h
index 36b3a87..06cf49c 100644
--- a/shared/api_level.h
+++ b/shared/api_level.h
@@ -15,4 +15,4 @@
  */
 #pragma once
 
-#define PRODUCT_SHIPPING_API_LEVEL 34
+#define PRODUCT_SHIPPING_API_LEVEL 35
diff --git a/shared/auto/car_audio_configuration.xml b/shared/auto/car_audio_configuration.xml
index 482726e..7b2cf68 100644
--- a/shared/auto/car_audio_configuration.xml
+++ b/shared/auto/car_audio_configuration.xml
@@ -17,8 +17,9 @@
 <!--
   Defines the audio configuration in a car, including
     - Audio zones
-    - Context to audio bus mappings
-    - Volume groups
+    - Zone configurations (in each audio zone)
+    - Volume groups (in each zone configuration)
+    - Context to audio bus mappings (in each volume group)
   in the car environment.
 -->
 <carAudioConfiguration version="3">
diff --git a/shared/auto/device_vendor.mk b/shared/auto/device_vendor.mk
index 08712a4..b0f76b7 100644
--- a/shared/auto/device_vendor.mk
+++ b/shared/auto/device_vendor.mk
@@ -73,13 +73,13 @@
 
 # vehicle HAL
 ifeq ($(LOCAL_VHAL_PRODUCT_PACKAGE),)
-    LOCAL_VHAL_PRODUCT_PACKAGE := android.hardware.automotive.vehicle@V1-emulator-service
+    LOCAL_VHAL_PRODUCT_PACKAGE := android.hardware.automotive.vehicle@V3-emulator-service
     BOARD_SEPOLICY_DIRS += device/google/cuttlefish/shared/auto/sepolicy/vhal
 endif
 PRODUCT_PACKAGES += $(LOCAL_VHAL_PRODUCT_PACKAGE)
 
 # Remote access HAL
-PRODUCT_PACKAGES += android.hardware.automotive.remoteaccess@V1-default-service
+PRODUCT_PACKAGES += android.hardware.automotive.remoteaccess@V2-default-service
 
 # Broadcast Radio
 PRODUCT_PACKAGES += android.hardware.broadcastradio-service.default
@@ -97,6 +97,13 @@
 # CAN bus HAL
 PRODUCT_PACKAGES += android.hardware.automotive.can-service
 
+# MACSEC HAL
+PRODUCT_PACKAGES += android.hardware.macsec-service
+PRODUCT_PACKAGES += wpa_supplicant_macsec
+PRODUCT_COPY_FILES += \
+    $(LOCAL_PATH)/macsec/wpa_supplicant_macsec.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wpa_supplicant_macsec.conf \
+    $(LOCAL_PATH)/macsec/init.wpa_supplicant_macsec.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.wpa_supplicant_macsec.rc
+
 # Occupant Awareness HAL
 PRODUCT_PACKAGES += [email protected]
 include packages/services/Car/car_product/occupant_awareness/OccupantAwareness.mk
@@ -136,4 +143,7 @@
 PRODUCT_PACKAGES += CarServiceOverlayCuttleFish
 GOOGLE_CAR_SERVICE_OVERLAY += CarServiceOverlayCuttleFishGoogle
 
+PRODUCT_PACKAGES += ConnectivityOverlayCuttleFish
+GOOGLE_CAR_SERVICE_OVERLAY += ConnectivityOverlayCuttleFishGoogle
+
 TARGET_BOARD_INFO_FILE ?= device/google/cuttlefish/shared/auto/android-info.txt
diff --git a/shared/auto/macsec/init.wpa_supplicant_macsec.rc b/shared/auto/macsec/init.wpa_supplicant_macsec.rc
new file mode 100644
index 0000000..c5b30f6
--- /dev/null
+++ b/shared/auto/macsec/init.wpa_supplicant_macsec.rc
@@ -0,0 +1,22 @@
+# Copyright (C) 2023 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+on late-fs
+    wait /sys/class/net/eth1
+    start wpa_supplicant_macsec
+
+service wpa_supplicant_macsec /vendor/bin/hw/wpa_supplicant_macsec \
+    -i eth1 -Dmacsec_linux -c /vendor/etc/wpa_supplicant_macsec.conf
+    user root
+    oneshot
diff --git a/shared/auto/macsec/wpa_supplicant_macsec.conf b/shared/auto/macsec/wpa_supplicant_macsec.conf
new file mode 100644
index 0000000..2f4cb04
--- /dev/null
+++ b/shared/auto/macsec/wpa_supplicant_macsec.conf
@@ -0,0 +1,15 @@
+eapol_version=3
+ap_scan=0
+fast_reauth=1
+# Example configuration for MACsec with preshared key
+# mka_cak is not actual key but index for HAL
+network={
+        key_mgmt=NONE
+        eapol_flags=0
+        macsec_policy=1
+        macsec_replay_protect=1
+        macsec_replay_window=0
+        mka_cak=00000000000000000000000000000001
+        mka_ckn=31323334
+        mka_priority=128
+}
diff --git a/shared/auto/rro_overlay/CarServiceOverlay/res/values/config.xml b/shared/auto/rro_overlay/CarServiceOverlay/res/values/config.xml
index e889df3..fb11fa8 100644
--- a/shared/auto/rro_overlay/CarServiceOverlay/res/values/config.xml
+++ b/shared/auto/rro_overlay/CarServiceOverlay/res/values/config.xml
@@ -62,15 +62,15 @@
 
         Some examples are:
         <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=DPAD_KEYS|
-            NAVIGATE_KEYS|ROTARY_NAVIGATION</item>
+            NAVIGATE_KEYS|ROTARY_NAVIGATION|TOUCH_SCREEN</item>
         <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,
             inputTypes=DPAD_KEYS</item>
         <item>displayPort=2,displayType=MAIN,occupantZoneId=1,
-            inputTypes=NAVIGATE_KEYS</item>
+            inputTypes=TOUCH_SCREEN</item>
         <item>displayPort=3,displayType=MAIN,occupantZoneId=2,
-            inputTypes=NAVIGATE_KEYS</item>
+            inputTypes=TOUCH_SCREEN</item>
         <item>displayUniqueId=virtual:com.example:MainD,displayType=MAIN,occupantZoneId=3,
-            inputTypes=NAVIGATE_KEYS</item>
+            inputTypes=TOUCH_SCREEN</item>
 
         displayPort: Unique port id for the display.
         displayType: Display type for the display. Use * part from
diff --git a/shared/auto/rro_overlay/ConnectivityOverlay/Android.bp b/shared/auto/rro_overlay/ConnectivityOverlay/Android.bp
new file mode 100644
index 0000000..218d443
--- /dev/null
+++ b/shared/auto/rro_overlay/ConnectivityOverlay/Android.bp
@@ -0,0 +1,35 @@
+// Copyright (C) 2023 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES 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_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+runtime_resource_overlay {
+    name: "ConnectivityOverlayCuttleFish",
+    resource_dirs: ["res"],
+    manifest: "AndroidManifest.xml",
+    sdk_version: "current",
+    product_specific: true
+}
+
+override_runtime_resource_overlay {
+    name: "ConnectivityOverlayCuttleFishGoogle",
+    base: "ConnectivityOverlayCuttleFish",
+    package_name: "com.google.android.connectivity.resources.cuttlefish",
+    target_package_name: "com.google.android.connectivity.resources",
+}
+
diff --git a/shared/auto/rro_overlay/ConnectivityOverlay/AndroidManifest.xml b/shared/auto/rro_overlay/ConnectivityOverlay/AndroidManifest.xml
new file mode 100644
index 0000000..340fbb3
--- /dev/null
+++ b/shared/auto/rro_overlay/ConnectivityOverlay/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.google.android.connectivity.resources.cuttlefish">
+    <application android:hasCode="false"/>
+    <overlay
+             android:targetPackage="com.android.connectivity.resources"
+             android:targetName="ServiceConnectivityResourcesConfig"
+             android:priority="0"
+             android:isStatic="true" />
+</manifest>
diff --git a/shared/auto/rro_overlay/ConnectivityOverlay/res/values/config.xml b/shared/auto/rro_overlay/ConnectivityOverlay/res/values/config.xml
new file mode 100644
index 0000000..7033e83
--- /dev/null
+++ b/shared/auto/rro_overlay/ConnectivityOverlay/res/values/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2023, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- Resources to configure the connectivity module based on each OEM's preference. -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Whether the internal vehicle network should remain active even when no
+         apps requested it. -->
+    <bool name="config_vehicleInternalNetworkAlwaysRequested">true</bool>
+    <string-array translatable="false" name="config_ethernet_interfaces">
+        <!-- Not metered, trusted, not vpn, vehicle, not vcn managed, restricted -->
+        <item>macsec0;11,14,15,27,28;</item>
+        <item>eth1;11,14,15,27,28;</item>
+    </string-array>
+    <string translatable="false" name="config_ethernet_iface_regex">(eth|macsec)\\d+</string>
+</resources>
diff --git a/shared/auto_md/overlay/frameworks/base/core/res/res/values/config.xml b/shared/auto_md/overlay/frameworks/base/core/res/res/values/config.xml
index 2ed6f0d..f12cba5 100644
--- a/shared/auto_md/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/shared/auto_md/overlay/frameworks/base/core/res/res/values/config.xml
@@ -60,8 +60,4 @@
          Should be false for most devices, except automotive vehicle with passenger displays. -->
     <!-- The config is enabled for the development purpose only. -->
     <bool name="config_multiuserVisibleBackgroundUsers">true</bool>
-
-    <!-- Enable multi-user IME sessions -->
-    <string translatable="false" name="config_deviceSpecificInputMethodManagerService">com.android.server.inputmethod.InputMethodManagerServiceProxy$Lifecycle</string>
-
 </resources>
diff --git a/shared/biometrics_face/device_vendor.mk b/shared/biometrics_face/device_vendor.mk
index 45eb7c4..de76343 100644
--- a/shared/biometrics_face/device_vendor.mk
+++ b/shared/biometrics_face/device_vendor.mk
@@ -15,4 +15,4 @@
 #
 
 PRODUCT_PACKAGES += \
-    com.android.hardware.biometrics.face
+    com.android.hardware.biometrics.face.virtual
diff --git a/shared/biometrics_fingerprint/device_vendor.mk b/shared/biometrics_fingerprint/device_vendor.mk
new file mode 100644
index 0000000..24bef1e
--- /dev/null
+++ b/shared/biometrics_fingerprint/device_vendor.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2023 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+ifneq ($(LOCAL_PREFER_VENDOR_APEX),true)
+PRODUCT_COPY_FILES += \
+    frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+endif
+
+PRODUCT_PACKAGES += \
+    com.android.hardware.biometrics.fingerprint.virtual
diff --git a/shared/camera/config/external.mk b/shared/camera/config/external.mk
new file mode 100644
index 0000000..c988699
--- /dev/null
+++ b/shared/camera/config/external.mk
@@ -0,0 +1,27 @@
+#
+# Copyright (C) 2023 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Load the external feature permissions.
+PRODUCT_COPY_FILES += \
+    frameworks/native/data/etc/android.hardware.camera.external.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.external.xml
+
+# Inform the camera HAL that we only want an external camera loaded.
+PRODUCT_VENDOR_PROPERTIES += \
+    ro.vendor.camera.config=external
+
+# Load the non-APEX external camera config. The APEX loads all the configs by default, which the HAl picks from.
+PRODUCT_COPY_FILES += \
+	hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_external.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_external.json
diff --git a/shared/camera/config/standard.mk b/shared/camera/config/standard.mk
new file mode 100644
index 0000000..ff6c3f3
--- /dev/null
+++ b/shared/camera/config/standard.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2023 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Fills in the features that the full camera array needs.
+PRODUCT_COPY_FILES += \
+    frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
+    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
+    frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
+    frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \
+    frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml \
+
+# Camera support library; this isn't supported by the external camera config.
+PRODUCT_VENDOR_PROPERTIES += \
+    ro.camerax.extensions.enabled=true
+
+# Loads the non-APEX config files. The APEX loads all the configs by default, which the HAl picks from.
+PRODUCT_COPY_FILES += \
+	hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_back.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_back.json \
+	hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_front.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_front.json \
+	hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_depth.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_depth.json
diff --git a/shared/camera/device_vendor.mk b/shared/camera/device_vendor.mk
index 600c705..599c32f 100644
--- a/shared/camera/device_vendor.mk
+++ b/shared/camera/device_vendor.mk
@@ -14,14 +14,20 @@
 # limitations under the License.
 #
 
-PRODUCT_VENDOR_PROPERTIES += \
-    ro.camerax.extensions.enabled=true
-
 # Enable Camera Extension sample
 ifeq ($(TARGET_USE_CAMERA_ADVANCED_EXTENSION_SAMPLE),true)
 PRODUCT_PACKAGES += \
     androidx.camera.extensions.impl.advanced advancedSample_camera_extensions.xml \
     libencoderjpeg_jni
+
+PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST += \
+    system/app/EyesFreeVidService/EyesFreeVidService.apk
+
+PRODUCT_PACKAGES += EyesFreeVidService
+
+PRODUCT_VENDOR_PROPERTIES += \
+    ro.vendor.camera.extensions.package=android.camera.extensions.impl.service \
+    ro.vendor.camera.extensions.service=android.camera.extensions.impl.service.EyesFreeVidService
 else
 PRODUCT_PACKAGES += androidx.camera.extensions.impl sample_camera_extensions.xml
 endif
@@ -44,23 +50,6 @@
 $(call soong_config_set,lyric,tuning_product,cuttlefish)
 $(call soong_config_set,google3a_config,target_device,cuttlefish)
 
-PRODUCT_COPY_FILES += \
-    frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
-    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
-    frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
-    frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \
-    frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml \
-
-ifeq ($(PRODUCT_IS_ATV_CF),true)
-    PRODUCT_COPY_FILES += \
-        hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_front.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_front.json
-else
-    PRODUCT_COPY_FILES += \
-        hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_back.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_back.json \
-        hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_front.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_front.json \
-        hardware/google/camera/devices/EmulatedCamera/hwl/configs/emu_camera_depth.json:$(TARGET_COPY_OUT_VENDOR)/etc/config/emu_camera_depth.json
-endif
-
 ifeq ($(TARGET_USE_VSOCK_CAMERA_HAL_IMPL),true)
 PRODUCT_PACKAGES += \
     [email protected] \
diff --git a/shared/camera/sepolicy/hal_camera_default.te b/shared/camera/sepolicy/hal_camera_default.te
index d123017..8783a44 100644
--- a/shared/camera/sepolicy/hal_camera_default.te
+++ b/shared/camera/sepolicy/hal_camera_default.te
@@ -16,3 +16,7 @@
 
 # For observing apex file changes
 allow hal_camera_default apex_info_file:file r_file_perms;
+
+# Allow vendor files to define their own config.
+set_prop(vendor_init, vendor_camera_config)
+get_prop(domain, vendor_camera_config)
diff --git a/shared/camera/sepolicy/property.te b/shared/camera/sepolicy/property.te
index bb7a5b1..4bb4acc 100644
--- a/shared/camera/sepolicy/property.te
+++ b/shared/camera/sepolicy/property.te
@@ -1 +1,2 @@
 vendor_internal_prop(vendor_camera_prop)
+vendor_restricted_prop(vendor_camera_config)
diff --git a/shared/camera/sepolicy/property_contexts b/shared/camera/sepolicy/property_contexts
index 3d6ebfb..26abad9 100644
--- a/shared/camera/sepolicy/property_contexts
+++ b/shared/camera/sepolicy/property_contexts
@@ -1,2 +1,4 @@
 persist.vendor.camera.  u:object_r:vendor_camera_prop:s0
 vendor.camera.          u:object_r:vendor_camera_prop:s0
+
+ro.vendor.camera.config          u:object_r:vendor_camera_config:s0 exact string
diff --git a/shared/device.mk b/shared/device.mk
index c645aee..e73ffe1 100644
--- a/shared/device.mk
+++ b/shared/device.mk
@@ -328,12 +328,6 @@
 DEVICE_PACKAGE_OVERLAYS += $(LOCAL_AUDIO_DEVICE_PACKAGE_OVERLAYS)
 
 #
-# BiometricsFingerprint HAL (AIDL)
-#
-PRODUCT_PACKAGES += \
-    com.android.hardware.biometrics.fingerprint.virtual
-
-#
 # Contexthub HAL
 #
 LOCAL_CONTEXTHUB_PRODUCT_PACKAGE ?= \
diff --git a/shared/go/device_vendor.mk b/shared/go/device_vendor.mk
index 9822fc5..3e5eb8d 100644
--- a/shared/go/device_vendor.mk
+++ b/shared/go/device_vendor.mk
@@ -26,7 +26,6 @@
 $(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
 $(call inherit-product, device/google/cuttlefish/shared/biometrics_face/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/bluetooth/device_vendor.mk)
-$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/gnss/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/identity/device_vendor.mk)
@@ -39,6 +38,10 @@
 $(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/device.mk)
 
+# Loads the camera HAL and which set of cameras is required.
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/config/standard.mk)
+
 PRODUCT_PACKAGES += \
     cuttlefish_phone_overlay_frameworks_base_core \
     cuttlefish_go_phone_overlay_frameworks_base_core \
diff --git a/shared/graphics/device_vendor.mk b/shared/graphics/device_vendor.mk
index 963c047..de64218 100644
--- a/shared/graphics/device_vendor.mk
+++ b/shared/graphics/device_vendor.mk
@@ -71,5 +71,4 @@
 # Gralloc implementation
 PRODUCT_PACKAGES += \
     android.hardware.graphics.allocator-service.minigbm \
-    [email protected] \
     mapper.minigbm
diff --git a/shared/overlays/foldable/core/res/values/config.xml b/shared/overlays/foldable/core/res/values/config.xml
index 6a2fdd5..0ac21a5 100644
--- a/shared/overlays/foldable/core/res/values/config.xml
+++ b/shared/overlays/foldable/core/res/values/config.xml
@@ -76,7 +76,7 @@
   <!-- Radius of the software rounded corners. -->
   <dimen name="rounded_corner_radius">34px</dimen>
   <!-- Whether to show Fold lock behavior setting feature in Settings App -->
-  <bool name="config_fold_lock_behavior">false</bool>
+  <bool name="config_fold_lock_behavior">true</bool>
 
   <!-- List of the labels of requestable device state config values -->
   <string-array name="config_deviceStatesAvailableForAppRequests">
diff --git a/shared/pc/device_vendor.mk b/shared/pc/device_vendor.mk
index 83c082c..8ec1897 100644
--- a/shared/pc/device_vendor.mk
+++ b/shared/pc/device_vendor.mk
@@ -24,7 +24,6 @@
 
 $(call inherit-product, frameworks/native/build/tablet-7in-xhdpi-2048-dalvik-heap.mk)
 $(call inherit-product, device/google/cuttlefish/shared/bluetooth/device_vendor.mk)
-$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/gnss/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/reboot_escrow/device_vendor.mk)
@@ -34,4 +33,8 @@
 $(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/device.mk)
 
+# Loads the camera HAL and which set of cameras is required.
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/config/standard.mk)
+
 DEVICE_PACKAGE_OVERLAYS += device/google/cuttlefish/shared/pc/overlay
diff --git a/shared/phone/device_vendor.mk b/shared/phone/device_vendor.mk
index e22a22f..3c08d38 100644
--- a/shared/phone/device_vendor.mk
+++ b/shared/phone/device_vendor.mk
@@ -25,8 +25,8 @@
 
 $(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
 $(call inherit-product, device/google/cuttlefish/shared/biometrics_face/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/biometrics_fingerprint/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/bluetooth/device_vendor.mk)
-$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/consumerir/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/gnss/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
@@ -40,15 +40,18 @@
 $(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/device.mk)
 
+# Loads the camera HAL and which set of cameras is required.
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/config/standard.mk)
+
 # Support mixing CF system onto previous versions of vendor
-PRODUCT_EXTRA_VNDK_VERSIONS := 30 31 32 33
+PRODUCT_EXTRA_VNDK_VERSIONS := 30 31 32 33 34
 
 TARGET_PRODUCT_PROP := $(LOCAL_PATH)/product.prop
 TARGET_VENDOR_PROP := $(LOCAL_PATH)/vendor.prop
 
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.faketouch.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.faketouch.xml \
-    frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \
 
     ifneq ($(TARGET_DISABLE_BIOMETRICS_FACE),true)
         PRODUCT_COPY_FILES += \
diff --git a/shared/slim/device_vendor.mk b/shared/slim/device_vendor.mk
index e980edf..63005bb 100644
--- a/shared/slim/device_vendor.mk
+++ b/shared/slim/device_vendor.mk
@@ -26,8 +26,8 @@
 
 $(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
 $(call inherit-product, device/google/cuttlefish/shared/biometrics_face/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/biometrics_fingerprint/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/bluetooth/device_vendor.mk)
-$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/consumerir/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/gnss/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
@@ -41,12 +41,15 @@
 $(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/device.mk)
 
+# Loads the camera HAL and which set of cameras is required.
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/config/standard.mk)
+
 PRODUCT_VENDOR_PROPERTIES += \
     debug.hwui.drawing_enabled=0 \
 
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.faketouch.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.faketouch.xml \
-    frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml \
 
 # Runtime Resource Overlays
 PRODUCT_PACKAGES += \
diff --git a/guest/hals/wpa_supplicant/Android.bp b/shared/tablet/Android.bp
similarity index 65%
rename from guest/hals/wpa_supplicant/Android.bp
rename to shared/tablet/Android.bp
index 888b6e0..83ae87d 100644
--- a/guest/hals/wpa_supplicant/Android.bp
+++ b/shared/tablet/Android.bp
@@ -1,4 +1,5 @@
-// Copyright (C) 2021 The Android Open Source Project
+//
+// Copyright (C) 2023 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -13,15 +14,12 @@
 // limitations under the License.
 
 package {
-    default_applicable_licenses: [
-        "external_wpa_supplicant_8_license",
-    ],
+    default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
-cc_binary {
-    name: "wpa_supplicant_cf",
-    defaults: ["wpa_supplicant_defaults"],
-    static_libs: [
-        "lib_driver_cmd_simulated_cf_bp",
-    ],
-}
+prebuilt_etc {
+    name: "tablet_excluded_hardware.prebuilt.xml",
+    src: "tablet_excluded_hardware.xml",
+    relative_install_path: "permissions",
+    soc_specific: true,
+}
\ No newline at end of file
diff --git a/shared/tablet/tablet_excluded_hardware.xml b/shared/tablet/tablet_excluded_hardware.xml
new file mode 100644
index 0000000..901de82
--- /dev/null
+++ b/shared/tablet/tablet_excluded_hardware.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<permissions>
+  <!-- Tablet does not support autofocus -->
+  <unavailable-feature name="android.hardware.camera.autofocus" />
+</permissions>
\ No newline at end of file
diff --git a/shared/tv/device_vendor.mk b/shared/tv/device_vendor.mk
index 49e26ce..77e6a49 100644
--- a/shared/tv/device_vendor.mk
+++ b/shared/tv/device_vendor.mk
@@ -23,9 +23,13 @@
 $(call inherit-product, device/google/cuttlefish/shared/bluetooth/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/graphics/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/swiftshader/device_vendor.mk)
-$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/virgl/device_vendor.mk)
 $(call inherit-product, device/google/cuttlefish/shared/device.mk)
+$(call inherit-product, vendor/google/tv/gcbs/projects/reference-v4/dtvstack.mk)
+
+# Loads the camera HAL and which set of cameras is required.
+$(call inherit-product, device/google/cuttlefish/shared/camera/device_vendor.mk)
+$(call inherit-product, device/google/cuttlefish/shared/camera/config/external.mk)
 
 # Extend cuttlefish common sepolicy with tv-specific functionality
 BOARD_SEPOLICY_DIRS += device/google/cuttlefish/shared/tv/sepolicy/vendor
@@ -58,7 +62,9 @@
      android.hardware.tv.hdmi.earc-service
 
 # Setup HDMI CEC as Playback Device
-PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4
+PRODUCT_PROPERTY_OVERRIDES += \
+    ro.hdmi.device_type=4 \
+    ro.hdmi.cec_device_types=playback_device
 
 # Tuner lazy HAL
 PRODUCT_PACKAGES += android.hardware.tv.tuner-service.example-lazy
diff --git a/shared/tv/tv_excluded_hardware.xml b/shared/tv/tv_excluded_hardware.xml
index 97b232c..64234e3 100644
--- a/shared/tv/tv_excluded_hardware.xml
+++ b/shared/tv/tv_excluded_hardware.xml
@@ -17,13 +17,16 @@
 <!-- Excludes all non-default ATV CF features to comply with CTS -->
 <permissions>
     <!-- ATV CF needs some basic camera features to enable video calling, but can exclude some -->
+    <unavailable-feature name="android.hardware.camera" />
     <unavailable-feature name="android.hardware.camera.ar" />
     <unavailable-feature name="android.hardware.camera.autofocus" />
     <unavailable-feature name="android.hardware.camera.concurrent" />
     <unavailable-feature name="android.hardware.camera.flash" />
+    <unavailable-feature name="android.hardware.camera.front" />
     <unavailable-feature name="android.hardware.camera.level.full" />
     <unavailable-feature name="android.hardware.camera.capability.manual_sensor" />
     <unavailable-feature name="android.hardware.camera.capability.manual_post_processing" />
+    <unavailable-feature name="android.hardware.camera.capability.raw" />
 
     <!-- ATV CF is not designed to have telephony services by default -->
     <unavailable-feature name="android.hardware.telephony" />
diff --git a/shared/wear/aosp_vendor.mk b/shared/wear/aosp_vendor.mk
index ef4cd2e..9ce5d96 100644
--- a/shared/wear/aosp_vendor.mk
+++ b/shared/wear/aosp_vendor.mk
@@ -39,5 +39,3 @@
 endif
 
 TARGET_SYSTEM_PROP += device/google/cuttlefish/shared/wear/wearable-1024.prop
-
-TARGET_VNDK_USE_CORE_VARIANT := true
diff --git a/shared/wear/overlays/core/res/values/config.xml b/shared/wear/overlays/core/res/values/config.xml
index 6e6c1ec..4a20b3a 100644
--- a/shared/wear/overlays/core/res/values/config.xml
+++ b/shared/wear/overlays/core/res/values/config.xml
@@ -40,6 +40,8 @@
   <bool name="config_voice_capable">true</bool>
   <bool name="config_requireCallCapableAccountForHandle">true</bool>
   <bool name="config_enableWallpaperService">true</bool>
+  <!-- Wallpaper will get top app scheduling priority if this is set to true.-->
+  <bool name="config_wallpaperTopApp">true</bool>
   <bool name="config_dreamsSupported">false</bool>
   <!--<bool name="config_suspendWhenScreenOffDueToProximity">true</bool>-->
   <!--<bool name="config_powerDecoupleAutoSuspendModeFromDisplay">true</bool>-->
@@ -91,8 +93,6 @@
   <integer name="config_triplePressOnStemPrimaryBehavior">1</integer>
   <integer name="config_doublePressOnPowerBehavior">3</integer>
   <integer name="config_veryLongPressTimeout">3000</integer>
-  <integer name="config_mashPressOnPowerBehavior">1</integer>
-  <integer name="config_mashPressVibrateTimeOnPowerButton">500</integer>
   <item name="config_wallpaperMinScale" format="float" type="dimen">0</item>
   <item name="config_wallpaperMaxScale" format="float" type="dimen">1</item>
   <bool name="config_alwaysScaleWallpaper">true</bool>
@@ -107,6 +107,10 @@
     <item>0</item>
     <item>0</item>
     <item>0</item>
+    <item>0</item>
+    <item>0</item>
+    <item>0</item>
+    <item>0</item>
     <item>6350</item>
   </integer-array>
   <bool name="config_preventTranslucentTaskTransitUpdateToActivity">true</bool>
@@ -114,6 +118,17 @@
   <bool name="config_telephonySingleSimDefaultSubscription">false</bool>
   <bool name="config_disableTaskSnapshots">true</bool>
 
+  <!-- Restrict Wear to single user -->
+  <integer name="config_multiuserMaximumUsers">1</integer>
+  <bool name="config_windowIsRound">true</bool>
+
   <!-- Package name of the required service extension package. -->
   <string name="config_servicesExtensionPackage" translatable="false">android.ext.services</string>
+
+  <!-- The name of the package that will hold the assistant role by default. -->
+  <string name="config_defaultAssistant" translatable="false">com.google.android.wearable.assistant</string>
+
+  <!-- Colon separated list of package names that should be granted Notification Listener access -->
+  <string name="config_defaultListenerAccessPackages" translatable="false">com.google.android.wearable.media.sessions:com.google.wear.services</string>
+
 </resources>
diff --git a/tests/hal/hal_implementation_test.cpp b/tests/hal/hal_implementation_test.cpp
index cd2fc61..4561b19 100644
--- a/tests/hal/hal_implementation_test.cpp
+++ b/tests/hal/hal_implementation_test.cpp
@@ -98,6 +98,7 @@
     "[email protected]", // converted to AIDL, see b/193240715
     "[email protected]",
     "[email protected]",
+    "[email protected]", // converted to Stable C, see b/205761028
     "[email protected]", // converted to AIDL, see b/177470478
     "[email protected]", // converted to AIDL, see b/177269435
     "[email protected]", // converted to AIDL, see b/205761620
@@ -166,6 +167,7 @@
      */
     "android.automotive.watchdog",
     "android.frameworks.automotive.display",
+    "android.frameworks.automotive.powerpolicy",
     "android.frameworks.automotive.powerpolicy.internal",
     "android.frameworks.automotive.telemetry",
     "android.hardware.automotive.audiocontrol",
@@ -174,6 +176,8 @@
     "android.hardware.automotive.occupant_awareness",
     "android.hardware.automotive.remoteaccess",
     "android.hardware.automotive.vehicle",
+    "android.hardware.automotive.ivn",
+    "android.hardware.macsec",
 };
 
 static const std::set<std::string> kTvOnlyAidl = {
@@ -194,6 +198,9 @@
     "android.hardware.radio.messaging", "android.hardware.radio.modem",
     "android.hardware.radio.network",   "android.hardware.radio.sap",
     "android.hardware.radio.sim",       "android.hardware.radio.voice",
+    "android.hardware.radio.ims",       "android.hardware.radio.ims.media",
+    "android.hardware.radio.satellite",
+
 };
 
 /*
@@ -217,6 +224,7 @@
     "android.media.audio.common.types",
     "android.hardware.radio",
     "android.hardware.uwb.fira_android",
+    "android.hardware.wifi.common",
     "android.hardware.keymaster",
     "android.hardware.automotive.vehicle.property",
     // not on Cuttlefish since it's needed only on systems using HIDL audio HAL
@@ -258,9 +266,7 @@
 
     {"android.automotive.computepipe.registry.", 2, 273549907},
     {"android.automotive.computepipe.runner.", 2, 273549907},
-    {"android.frameworks.automotive.powerpolicy.", 2, 274160980},
     {"android.hardware.automotive.evs.", 2, 274162534},
-    {"android.hardware.automotive.ivn.", 1, 274139217},
 };
 
 // AOSP packages which are never considered
diff --git a/vsoc_x86/BoardConfig.mk b/vsoc_x86/BoardConfig.mk
index f57c379..61abe4f 100644
--- a/vsoc_x86/BoardConfig.mk
+++ b/vsoc_x86/BoardConfig.mk
@@ -47,3 +47,4 @@
 -include device/google/cuttlefish/shared/telephony/BoardConfig.mk
 -include device/google/cuttlefish/shared/vibrator/BoardConfig.mk
 -include device/google/cuttlefish/shared/virgl/BoardConfig.mk
+-include vendor/google/tv/gcbs/projects/reference-v4/dtvBoardConfig.mk