Merge "Merge sc-v2-dev-plus-aosp-without-vendor@8433047" into stage-aosp-master am: 4bf5985951 am: a3cc2e0bbd

Original change: undetermined

Change-Id: I563b91d0b624a6cc8ceded879a17dc7cdb846e0b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
index 5a0f14d..f0a226a 100644
--- a/BoardConfig-common.mk
+++ b/BoardConfig-common.mk
@@ -32,7 +32,9 @@
 TARGET_CPU_VARIANT := cortex-a55
 TARGET_CPU_VARIANT_RUNTIME := cortex-a55
 
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifneq ($(DEVICE_IS_64BIT_ONLY),true)
 TARGET_2ND_ARCH := arm
 TARGET_2ND_ARCH_VARIANT := armv8-a
 TARGET_2ND_CPU_ABI := armeabi-v7a
@@ -80,6 +82,7 @@
 
 AB_OTA_PARTITIONS += \
 	system \
+	system_dlkm \
 	system_ext \
 	product \
 	vbmeta_system
@@ -130,7 +133,7 @@
 #BOARD_USES_EXYNOS_DATASPACE_FEATURE := true
 
 # Enable chain partition for system.
-BOARD_AVB_VBMETA_SYSTEM := system system_ext product
+BOARD_AVB_VBMETA_SYSTEM := system system_dlkm system_ext product
 BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
 BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
@@ -158,6 +161,11 @@
 BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := ext4
 TARGET_COPY_OUT_SYSTEM_EXT := system_ext
 
+# system_dlkm.img
+BOARD_USES_SYSTEM_DLKMIMAGE := true
+BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
+TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
+
 ########################
 # Video Codec
 ########################
@@ -175,6 +183,7 @@
 BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 8527020032
 BOARD_GOOGLE_DYNAMIC_PARTITIONS_PARTITION_LIST := \
     system \
+    system_dlkm \
     system_ext \
     product \
     vendor \
@@ -311,22 +320,6 @@
 # H/W align restriction of MM IPs
 BOARD_EXYNOS_S10B_FORMAT_ALIGN := 64
 
-# WiFi
-BOARD_WLAN_DEVICE := bcmdhd
-BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
-BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
-WPA_SUPPLICANT_VERSION := VER_0_8_X
-BOARD_WPA_SUPPLICANT_DRIVER := NL80211
-BOARD_HOSTAPD_DRIVER := NL80211
-# Wifi interface combination - {1 STA + 1 AP (bridged or single)} or {1 STA + 1 P2P}
-# or {1 STA + 1 NAN} or {2 STA}
-WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{P2P, NAN, AP}, 1}}, {{{STA}, 2}}
-WIFI_FEATURE_WIFI_EXT_HAL := true
-WIFI_FEATURE_IMU_DETECTION := true
-# Avoid Wifi reset on MAC Address change
-WIFI_AVOID_IFACE_RESET_MAC_CHANGE := true
-WIFI_FEATURE_HOSTAPD_11AX := true
-
 # NeuralNetworks
 GPU_SOURCE_PRESENT := $(wildcard vendor/arm/mali/valhall)
 GPU_PREBUILD_PRESENT := $(wildcard vendor/google_devices/gs101/prebuilts/gpu/libs)
@@ -361,11 +354,11 @@
 # Vendor ramdisk image for kernel development
 BOARD_BUILD_VENDOR_RAMDISK_IMAGE := true
 
-BOARD_VENDOR_KERNEL_MODULES_BLOCKLIST_FILE := device/google/gs101/vendor_dlkm.blocklist
-
 KERNEL_MODULE_DIR := $(TARGET_KERNEL_DIR)
 KERNEL_MODULES := $(wildcard $(KERNEL_MODULE_DIR)/*.ko)
 
+BOARD_VENDOR_KERNEL_MODULES_BLOCKLIST_FILE := $(KERNEL_MODULE_DIR)/vendor_dlkm.modules.blocklist
+
 BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(strip $(shell cat $(KERNEL_MODULE_DIR)/vendor_boot.modules.load))
 ifndef BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
 $(error vendor_boot.modules.load not found or empty)
@@ -389,4 +382,7 @@
 # Enable larger logbuf
 BOARD_KERNEL_CMDLINE += log_buf_len=1024K
 
+# Protected VM firmware
+BOARD_PVMFWIMAGE_PARTITION_SIZE := 0x00100000
+
 -include vendor/google_devices/gs101/proprietary/BoardConfigVendor.mk
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 12538be..8639586 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -83,3 +83,9 @@
 $(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.keymaster@4.0-service.trusty.rc)
 $(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.keymaster@4.0-service.trusty.xml)
 $(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/wait_for_strongbox)
+
+# Health HAL to AIDL
+$(call add-clean-step, find $(PRODUCT_OUT)/system -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/vendor -type f -name "*health@*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*health@*" -print0 | xargs -0 rm -f)
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..4d9cf6e
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,2 @@
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
diff --git a/aosp_common.mk b/aosp_common.mk
index 1ad6eb7..5ba9882 100644
--- a/aosp_common.mk
+++ b/aosp_common.mk
@@ -17,11 +17,14 @@
 #
 # All components inherited here go to system image
 #
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
-$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
-else
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
 endif
+
 $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk)
 
 # Enable CSI checking
diff --git a/bluetooth/bluetooth.mk b/bluetooth/bluetooth.mk
new file mode 100644
index 0000000..f203610
--- /dev/null
+++ b/bluetooth/bluetooth.mk
@@ -0,0 +1,4 @@
+PRODUCT_PACKAGES += \
+	android.hardware.bluetooth@1.1-service.bcmbtlinux
+
+BOARD_SEPOLICY_DIRS += device/google/gs101-sepolicy/bluetooth
diff --git a/conf/Android.bp b/conf/Android.bp
index 5e58678..45e6b6f 100644
--- a/conf/Android.bp
+++ b/conf/Android.bp
@@ -24,6 +24,12 @@
 // identical with the exception of the encryption settings, so to keep them in
 // sync the rules below generate them from a template file.
 
+soong_namespace {
+    imports: [
+        "device/google/gs101",
+    ],
+}
+
 package {
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
@@ -33,6 +39,11 @@
     default_applicable_licenses: ["device_google_gs101_license"],
 }
 
+filegroup {
+    name: "gs101_srcs",
+    srcs: ["fstab.gs101.in"],
+}
+
 genrule {
     name: "gen_fstab.gs101",
     srcs: ["fstab.gs101.in"],
diff --git a/conf/fstab.gs101.in b/conf/fstab.gs101.in
index 8b7a7e3..5ad10a3 100644
--- a/conf/fstab.gs101.in
+++ b/conf/fstab.gs101.in
@@ -5,6 +5,7 @@
 #
 #<src>                                                   <mnt_point>                 <type>  <mnt_flags and options>  <fs_mgr_flags>
 system                                                   /system                     ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
+system_dlkm                                              /system_dlkm                ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
 system_ext                                               /system_ext                 ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
 product                                                  /product                    ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
 vendor                                                   /vendor                     ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_vendor,logical,first_stage_mount,readahead_size_kb=128
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
index 19b16e5..d45b31a 100644
--- a/conf/init.gs101.rc
+++ b/conf/init.gs101.rc
@@ -3,17 +3,6 @@
 import init.exynos.sensorhub.rc
 import /vendor/etc/init/hw/init.aoc.rc
 
-service vendor.charger /system/bin/charger
-    class charger
-    seclabel u:r:charger:s0
-    user system
-    group system wakelock input
-    capabilities SYS_BOOT
-    file /dev/kmsg w
-    file /sys/fs/pstore/console-ramoops-0 r
-    file /sys/fs/pstore/console-ramoops r
-    file /proc/last_kmsg r
-
 on early-init
     mount_all /vendor/etc/fstab.persist --early
 
@@ -29,29 +18,75 @@
     write /dev/sys/fs/by-name/userdata/data_io_flag 56
     write /dev/sys/fs/by-name/userdata/node_io_flag 56
 
-    chown system system /sys/kernel/vendor_sched/set_task_group_bg
-    chown system system /sys/kernel/vendor_sched/set_task_group_cam
-    chown system system /sys/kernel/vendor_sched/set_task_group_fg
-    chown system system /sys/kernel/vendor_sched/set_task_group_nnapi
-    chown system system /sys/kernel/vendor_sched/set_task_group_sys
-    chown system system /sys/kernel/vendor_sched/set_task_group_sysbg
-    chown system system /sys/kernel/vendor_sched/set_task_group_ta
-    chown system system /sys/kernel/vendor_sched/set_task_group_rt
-    chown system system /sys/kernel/vendor_sched/set_task_group_sf
-    chown system system /sys/kernel/vendor_sched/set_task_group_dex2oat
-    chown system system /sys/kernel/vendor_sched/clear_group
+    chown system system /proc/vendor_sched/set_task_group_bg
+    chown system system /proc/vendor_sched/set_task_group_cam
+    chown system system /proc/vendor_sched/set_task_group_fg
+    chown system system /proc/vendor_sched/set_task_group_nnapi
+    chown system system /proc/vendor_sched/set_task_group_sys
+    chown system system /proc/vendor_sched/set_task_group_sysbg
+    chown system system /proc/vendor_sched/set_task_group_ta
+    chown system system /proc/vendor_sched/set_task_group_rt
+    chown system system /proc/vendor_sched/set_task_group_sf
+    chown system system /proc/vendor_sched/set_task_group_dex2oat
+    chown system system /proc/vendor_sched/set_task_group_cam_power
+    chown system system /proc/vendor_sched/set_task_group_ota
+    chown system system /proc/vendor_sched/set_proc_group_bg
+    chown system system /proc/vendor_sched/set_proc_group_cam
+    chown system system /proc/vendor_sched/set_proc_group_fg
+    chown system system /proc/vendor_sched/set_proc_group_nnapi
+    chown system system /proc/vendor_sched/set_proc_group_sys
+    chown system system /proc/vendor_sched/set_proc_group_sysbg
+    chown system system /proc/vendor_sched/set_proc_group_ta
+    chown system system /proc/vendor_sched/set_proc_group_rt
+    chown system system /proc/vendor_sched/set_proc_group_sf
+    chown system system /proc/vendor_sched/set_proc_group_dex2oat
+    chown system system /proc/vendor_sched/set_proc_group_cam_power
+    chown system system /proc/vendor_sched/set_proc_group_ota
+    chown system system /proc/vendor_sched/prefer_idle_set
+    chown system system /proc/vendor_sched/prefer_idle_clear
+    chown system system /proc/vendor_sched/pmu_poll_enable
+    chown system system /proc/vendor_sched/pmu_poll_time
+    chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency
+    chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable
+    chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency
+    chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable
+    chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold
+    chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency
+    chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable
 
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_bg
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_cam
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_fg
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_nnapi
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_sys
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_sysbg
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_ta
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_rt
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_sf
-    chmod 0220 /sys/kernel/vendor_sched/set_task_group_dex2oat
-    chmod 0220 /sys/kernel/vendor_sched/clear_group
+    chmod 0220 /proc/vendor_sched/set_task_group_bg
+    chmod 0220 /proc/vendor_sched/set_task_group_cam
+    chmod 0220 /proc/vendor_sched/set_task_group_fg
+    chmod 0220 /proc/vendor_sched/set_task_group_nnapi
+    chmod 0220 /proc/vendor_sched/set_task_group_sys
+    chmod 0220 /proc/vendor_sched/set_task_group_sysbg
+    chmod 0220 /proc/vendor_sched/set_task_group_ta
+    chmod 0220 /proc/vendor_sched/set_task_group_rt
+    chmod 0220 /proc/vendor_sched/set_task_group_sf
+    chmod 0220 /proc/vendor_sched/set_task_group_dex2oat
+    chmod 0220 /proc/vendor_sched/set_task_group_cam_power
+    chmod 0220 /proc/vendor_sched/set_task_group_ota
+    chmod 0220 /proc/vendor_sched/set_proc_group_bg
+    chmod 0220 /proc/vendor_sched/set_proc_group_cam
+    chmod 0220 /proc/vendor_sched/set_proc_group_fg
+    chmod 0220 /proc/vendor_sched/set_proc_group_nnapi
+    chmod 0220 /proc/vendor_sched/set_proc_group_sys
+    chmod 0220 /proc/vendor_sched/set_proc_group_sysbg
+    chmod 0220 /proc/vendor_sched/set_proc_group_ta
+    chmod 0220 /proc/vendor_sched/set_proc_group_rt
+    chmod 0220 /proc/vendor_sched/set_proc_group_sf
+    chmod 0220 /proc/vendor_sched/set_proc_group_dex2oat
+    chmod 0220 /proc/vendor_sched/set_proc_group_cam_power
+    chmod 0220 /proc/vendor_sched/set_proc_group_ota
+    chmod 0220 /proc/vendor_sched/prefer_idle_set
+    chmod 0220 /proc/vendor_sched/prefer_idle_clear
+    chmod 0220 /proc/vendor_sched/pmu_poll_enable
+    chmod 0220 /proc/vendor_sched/pmu_poll_time
 
     wait /dev/block/platform/${ro.boot.boot_devices}
     symlink /dev/block/platform/${ro.boot.boot_devices} /dev/block/bootdevice
@@ -68,10 +103,6 @@
     write /sys/block/zram0/comp_algorithm lz77eh
     write /proc/sys/vm/page-cluster 0
 
-    # Page Pinner dumping at bugreport
-    chown system system /sys/kernel/debug/page_pinner/longterm_pinner
-    chown system system /sys/kernel/debug/page_pinner/alloc_contig_failed
-
     # Some user code relies on ro.boot.hardware.revision
     setprop ro.boot.hardware.revision ${ro.revision}
 
@@ -117,12 +148,12 @@
     mkdir /dev/socket/pdx/system/vr/sensors 0775 system system
 
     # Boot time 183626384
-    write /sys/kernel/vendor_sched/ta_uclamp_min 1024
-    write /sys/kernel/vendor_sched/ta_prefer_idle 1
-    write /sys/kernel/vendor_sched/fg_uclamp_min 1024
-    write /sys/kernel/vendor_sched/fg_prefer_idle 1
-    write /sys/kernel/vendor_sched/sys_uclamp_min 1024
-    write /sys/kernel/vendor_sched/sys_prefer_idle 1
+    write /proc/vendor_sched/ta_uclamp_min 1024
+    write /proc/vendor_sched/ta_prefer_idle 1
+    write /proc/vendor_sched/fg_uclamp_min 1024
+    write /proc/vendor_sched/fg_prefer_idle 1
+    write /proc/vendor_sched/sys_uclamp_min 1024
+    write /proc/vendor_sched/sys_prefer_idle 1
 
     # governor setting
     write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor sched_pixel
@@ -163,8 +194,8 @@
     chown system system /dev/cpuset/camera-daemon-mid-high-group/tasks
     chmod 0664 /dev/cpuset/camera-daemon-mid-high-group/tasks
 
-    write /sys/kernel/vendor_sched/cam_prefer_idle 1
-    write /sys/kernel/vendor_sched/cam_uclamp_min 1
+    write /proc/vendor_sched/cam_prefer_idle 1
+    write /proc/vendor_sched/cam_uclamp_min 1
 
     chown system system /dev/cpuset/cgroup.procs
 
@@ -197,6 +228,9 @@
     chown system system /sys/class/power_supply/maxfg_base/m5_model_state
 
     # Dump eeprom
+    chown system system /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom
+    chown system system /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom
+    chown system system /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom
     chown system system /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom
     chown system system /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom
     chown system system /dev/battery_history
@@ -267,8 +301,8 @@
     start watchdogd
 
     # Add a boost for NNAPI HAL
-    write /sys/kernel/vendor_sched/nnapi_prefer_idle 0
-    write /sys/kernel/vendor_sched/nnapi_uclamp_min 512
+    write /proc/vendor_sched/nnapi_prefer_idle 0
+    write /proc/vendor_sched/nnapi_uclamp_min 512
 
     # Add memlat governor settings
     write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu0_memlat@17000010/polling_interval 10
@@ -393,7 +427,7 @@
 on zygote-start
     # For PixelLogger configuration file.
     chmod 0771 /data/vendor/wifi
-    write /sys/kernel/vendor_sched/sys_uclamp_min 0
+    write /proc/vendor_sched/sys_uclamp_min 0
 
 on post-fs-data
     # Create the directories used by the Wireless subsystem
@@ -545,32 +579,33 @@
     chown system system /sys/devices/platform/exynos-drm/primary-panel/gamma
     chown system system /sys/devices/platform/exynos-drm/primary-panel/min_vrefresh
     chown system system /sys/devices/platform/exynos-drm/primary-panel/idle_delay_ms
+    chown system system /sys/devices/platform/exynos-drm/primary-panel/panel_need_handle_idle_exit
     chown system system /sys/module/drm/parameters/vblankoffdelay
-    chown system system /sys/class/dqe/atc/ambient_light
-    chown system system /sys/class/dqe/atc/st
-    chown system system /sys/class/dqe/atc/en
-    chown system system /sys/class/dqe/atc/lt
-    chown system system /sys/class/dqe/atc/ns
-    chown system system /sys/class/dqe/atc/dither
-    chown system system /sys/class/dqe/atc/pl_w1
-    chown system system /sys/class/dqe/atc/pl_w2
-    chown system system /sys/class/dqe/atc/ctmode
-    chown system system /sys/class/dqe/atc/pp_en
-    chown system system /sys/class/dqe/atc/upgrade_on
-    chown system system /sys/class/dqe/atc/tdr_max
-    chown system system /sys/class/dqe/atc/tdr_min
-    chown system system /sys/class/dqe/atc/back_light
-    chown system system /sys/class/dqe/atc/dstep
-    chown system system /sys/class/dqe/atc/scale_mode
-    chown system system /sys/class/dqe/atc/threshold_1
-    chown system system /sys/class/dqe/atc/threshold_2
-    chown system system /sys/class/dqe/atc/threshold_3
-    chown system system /sys/class/dqe/atc/gain_limit
-    chown system system /sys/class/dqe/atc/lt_calc_ab_shift
+    chown system system /sys/class/dqe0/atc/ambient_light
+    chown system system /sys/class/dqe0/atc/st
+    chown system system /sys/class/dqe0/atc/en
+    chown system system /sys/class/dqe0/atc/lt
+    chown system system /sys/class/dqe0/atc/ns
+    chown system system /sys/class/dqe0/atc/dither
+    chown system system /sys/class/dqe0/atc/pl_w1
+    chown system system /sys/class/dqe0/atc/pl_w2
+    chown system system /sys/class/dqe0/atc/ctmode
+    chown system system /sys/class/dqe0/atc/pp_en
+    chown system system /sys/class/dqe0/atc/upgrade_on
+    chown system system /sys/class/dqe0/atc/tdr_max
+    chown system system /sys/class/dqe0/atc/tdr_min
+    chown system system /sys/class/dqe0/atc/back_light
+    chown system system /sys/class/dqe0/atc/dstep
+    chown system system /sys/class/dqe0/atc/scale_mode
+    chown system system /sys/class/dqe0/atc/threshold_1
+    chown system system /sys/class/dqe0/atc/threshold_2
+    chown system system /sys/class/dqe0/atc/threshold_3
+    chown system system /sys/class/dqe0/atc/gain_limit
+    chown system system /sys/class/dqe0/atc/lt_calc_ab_shift
     chown system system /sys/devices/platform/1c300000.drmdecon/early_wakeup
-    chmod 0220 /sys/devices/platform/1c300000.drmdecon/early_wakeup
+    chmod 0660 /sys/devices/platform/1c300000.drmdecon/early_wakeup
     chown system system /sys/devices/platform/1c302000.drmdecon/early_wakeup
-    chmod 0220 /sys/devices/platform/1c302000.drmdecon/early_wakeup
+    chmod 0660 /sys/devices/platform/1c302000.drmdecon/early_wakeup
 
 # Copy DRM Key
 #    copy /system/app/wv.keys /factory/wv.keys
@@ -596,11 +631,7 @@
     -O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1p2p_device=1 \
     -m/vendor/etc/wifi/p2p_supplicant.conf \
     -g@android:wpa_wlan0 -dd
-    interface android.hardware.wifi.supplicant@1.0::ISupplicant default
-    interface android.hardware.wifi.supplicant@1.1::ISupplicant default
-    interface android.hardware.wifi.supplicant@1.2::ISupplicant default
-    interface android.hardware.wifi.supplicant@1.3::ISupplicant default
-    interface android.hardware.wifi.supplicant@1.4::ISupplicant default
+    interface aidl android.hardware.wifi.supplicant.ISupplicant/default
     socket wpa_wlan0 dgram 660 wifi wifi
     class main
     disabled
@@ -652,6 +683,8 @@
     chown system system /sys/devices/virtual/sec/tsp/cmd
     chown system system /sys/devices/virtual/sec/tsp/cmd_result
     chown system system /sys/devices/virtual/sec/tsp/status
+    chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/force_touch_active
+    chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/nvt_dttw_mode
     # Allow access to touch
     chown system input /dev/touch_offload
     chmod 660 /dev/touch_offload
@@ -692,10 +725,6 @@
     chown system system /dev/sys/fs/by-name/userdata/gc_segment_mode
     chown system system /dev/sys/fs/by-name/userdata/gc_reclaimed_segments
 
-    # Block layer tuning: discard chunk size up to 128MB
-    # Otherwise, contiguous discards can be merged
-    write /sys/block/sda/queue/discard_max_bytes 134217728
-
     # Enable ZRAM on boot_complete
     swapon_all /vendor/etc/fstab.${ro.board.platform}
     write /proc/sys/vm/swappiness 100
@@ -717,26 +746,47 @@
     setprop vendor.powerhal.init 1
 
     # Setup final cpu.uclamp
-    write /sys/kernel/vendor_sched/ta_uclamp_min 1
-    write /sys/kernel/vendor_sched/fg_uclamp_min 0
-    write /sys/kernel/vendor_sched/sys_prefer_idle 0
+    write /proc/vendor_sched/uclamp_threshold 8
+    write /proc/vendor_sched/ta_uclamp_min 1
+    write /proc/vendor_sched/fg_uclamp_min 0
+    write /proc/vendor_sched/sys_prefer_idle 0
     # cfs_rq clamp is using tg->uclamp setting
     # align it with the vendor_group setting
-    write /sys/kernel/vendor_sched/bg_uclamp_max 512
+    write /proc/vendor_sched/bg_uclamp_max 512
     write /dev/cpuctl/background/cpu.uclamp.max 50
-    write /sys/kernel/vendor_sched/bg_group_throttle 512
-    write /sys/kernel/vendor_sched/sysbg_uclamp_max 512
+    write /proc/vendor_sched/bg_group_throttle 512
+    write /proc/vendor_sched/sysbg_uclamp_max 512
     write /dev/cpuctl/system-background/cpu.uclamp.max 50
-    write /sys/kernel/vendor_sched/sysbg_group_throttle 512
-    write /sys/kernel/vendor_sched/dex2oat_uclamp_max 615
+    write /proc/vendor_sched/sysbg_group_throttle 512
+    write /proc/vendor_sched/dex2oat_uclamp_max 615
     write /dev/cpuctl/dex2oat/cpu.uclamp.max 60
-    write /sys/kernel/vendor_sched/dex2oat_group_throttle 615
+    write /proc/vendor_sched/dex2oat_group_throttle 615
+    write /proc/vendor_sched/ota_uclamp_max 410
+    write /proc/vendor_sched/ota_group_throttle 410
+
+    # Set PMU freq limit parameters
+    write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold 2
+    write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold 59
+    write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency 1401000
+    write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold 6
+    write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold 64
+    write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency 1826000
+    write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold 5
+    write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold 69
+    write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency 2507000
+    write /proc/vendor_sched/pmu_poll_time 10
+
+    # Disable PMU freq limit
+    write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable 1
+    write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable 1
+    write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable 1
+    write /proc/vendor_sched/pmu_poll_enable 0
 
     # Setup groups for SF (RT used for SF RE, SF used for SF main)
-    write /sys/kernel/vendor_sched/rt_uclamp_min 125
-    write /sys/kernel/vendor_sched/rt_prefer_idle 1
-    write /sys/kernel/vendor_sched/sf_uclamp_min 30
-    write /sys/kernel/vendor_sched/sf_prefer_idle 1
+    write /proc/vendor_sched/rt_uclamp_min 125
+    write /proc/vendor_sched/rt_prefer_idle 1
+    write /proc/vendor_sched/sf_uclamp_min 30
+    write /proc/vendor_sched/sf_prefer_idle 1
 
     # Setup cpu.shares to throttle background groups (bg ~ 5% sysbg ~ 5% dex2oat ~2.5%)
     write /dev/cpuctl/background/cpu.shares 1024
@@ -757,11 +807,8 @@
     chown root system /sys/devices/platform/19000000.aoc/reset
     chmod 0220 /sys/devices/platform/19000000.aoc/reset
 
-# charger driver exposes now finer grain control, map demo mode to those properties
-# NOTE: demo mode can only be exit wiping data (which reset the persist properties)
-on property:sys.retaildemo.enabled=1
-    setprop persist.vendor.charge.stop.level 35
-    setprop persist.vendor.charge.start.level 30
+    # write serialno to battery path for pairing
+    write /sys/class/power_supply/battery/dev_sn ${ro.boot.serialno}
 
 # Test Harness Mode default battery profile.
 on  property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=0
@@ -843,6 +890,9 @@
 
 # ODPM
 on fs
+    chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-0/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device1/enabled_rails
+    chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-1/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device0/enabled_rails
+
     chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-6/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
     chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-7/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
 
@@ -931,8 +981,8 @@
     mkdir /dev/thermal/tz-by-name 0750 system system
     mkdir /dev/thermal/cdev-by-name 0750 system system
     start vendor.thermal.symlinks
-    write /sys/kernel/vendor_sched/sys_uclamp_min 0
-    write /sys/kernel/vendor_sched/sys_prefer_idle 0
+    write /proc/vendor_sched/sys_uclamp_min 0
+    write /proc/vendor_sched/sys_prefer_idle 0
 
 # Launch thermal hal in off charging mode
 on charger && property:vendor.thermal.link_ready=1
diff --git a/conf/nomodem/Android.bp b/conf/nomodem/Android.bp
new file mode 100644
index 0000000..1b1ae24
--- /dev/null
+++ b/conf/nomodem/Android.bp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// By default this device uses hardware-wrapped keys for storage encryption,
+// which is intended to offer increased security over the traditional method
+// (software keys).  However, hardware-wrapped keys aren't compatible with
+// FIPS-140 certification of the encryption hardware, and hence we have to
+// disable the use of them in FIPS mode.  This requires having two fstab files:
+// one for the default mode, and one for FIPS mode selectable via
+// androidboot.fstab_suffix on the kernel command line.  These fstabs should be
+// identical with the exception of the encryption settings, so to keep them in
+// sync the rules below generate them from a template file.
+
+soong_namespace {
+    imports: [
+        "device/google/gs101",
+        "device/google/gs101/conf",
+    ],
+}
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "device_google_gs101_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+genrule {
+    name: "gen_fstab.gs101",
+    srcs: [
+        "fstab.gs101.in*",
+        ":gs101_srcs",
+        ],
+    out: ["fstab.gs101"],
+    cmd: "sed -e s/@fileencryption@/::inlinecrypt_optimized+wrappedkey_v0/" +
+        " -e s/@metadata_encryption@/:wrappedkey_v0/" +
+        " -e /modem/d " +
+        " -e /efs/d $(in) > $(out)",
+}
+
+genrule {
+    name: "gen_fstab.gs101-fips",
+    srcs: [
+        "fstab.gs101.in*",
+        ":gs101_srcs",
+        ],
+    out: ["fstab.gs101-fips"],
+    cmd: "sed -e s/@fileencryption@/aes-256-xts/" +
+        " -e s/@metadata_encryption@/aes-256-xts/" +
+        " -e /modem/d " +
+        " -e /efs/d $(in) > $(out)",
+}
+
+prebuilt_etc {
+    name: "fstab.gs101",
+    src: ":gen_fstab.gs101",
+    vendor: true,
+    vendor_ramdisk_available: true,
+}
+
+prebuilt_etc {
+    name: "fstab.gs101-fips",
+    src: ":gen_fstab.gs101-fips",
+    vendor: true,
+    vendor_ramdisk_available: true,
+}
\ No newline at end of file
diff --git a/default-permissions.xml b/default-permissions.xml
index 12b4037..cf2e7b7 100644
--- a/default-permissions.xml
+++ b/default-permissions.xml
@@ -47,6 +47,8 @@
         <!-- Location -->
         <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
         <permission name="android.permission.ACCESS_BACKGROUND_LOCATION" fixed="false"/>
+        <!-- Battery Widget -->
+        <permission name="android.permission.BLUETOOTH_CONNECT" fixed="false"/>
     </exception>
 
     <exception package="com.google.android.apps.camera.services">
@@ -79,6 +81,8 @@
         <permission name="android.permission.WRITE_CALL_LOG" fixed="false"/>
         <!-- Used to set up a Wi-Fi P2P network -->
         <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
+        <!-- Notifications -->
+        <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
     </exception>
 
     <exception
@@ -117,6 +121,15 @@
         <!-- Microphone: To hear user's voice commands -->
         <permission name="android.permission.RECORD_AUDIO" fixed="false"/>
     </exception>
-
+    <exception
+        package="com.google.android.deskclock">
+        <!-- Notifications -->
+        <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+    </exception>
+    <exception
+        package="com.google.android.apps.tips">
+        <!-- Notifications -->
+        <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+    </exception>
 </exceptions>
 
diff --git a/device-common.mk b/device-common.mk
index 250de1c..cdafd12 100644
--- a/device-common.mk
+++ b/device-common.mk
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 
+-include vendor/google_devices/gs101/proprietary/telephony/device-vendor.mk
 include device/google/gs101/device.mk
 
 # Telephony
diff --git a/device.mk b/device.mk
index bd9ce56..80603e8 100644
--- a/device.mk
+++ b/device.mk
@@ -14,9 +14,12 @@
 # limitations under the License.
 #
 
-TARGET_BOARD_PLATFORM := gs101
+include device/google/gs-common/device.mk
 
-ifneq (,$(filter %_64,$(TARGET_PRODUCT)))
+TARGET_BOARD_PLATFORM := gs101
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
 LOCAL_64ONLY := _64
 endif
 
@@ -32,6 +35,14 @@
 # Set boot SPL
 BOOT_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
 
+# TODO(b/207450311): Remove this flag once implemented
+USE_PIXEL_GRALLOC := false
+ifeq ($(USE_PIXEL_GRALLOC),true)
+	PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/GrallocHAL
+else
+	PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/gralloc4
+endif
+
 PRODUCT_SOONG_NAMESPACES += \
 	hardware/google/av \
 	hardware/google/gchips \
@@ -40,6 +51,7 @@
 	hardware/google/interfaces \
 	hardware/google/pixel \
 	device/google/gs101 \
+	device/google/gs101/powerstats \
 	vendor/google/whitechapel/tools \
 	vendor/broadcom/bluetooth \
 	vendor/google/camera \
@@ -54,6 +66,10 @@
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
 	ro.oem_unlock_supported=1
 
+# Include vendor telephony soong namespace
+PRODUCT_SOONG_NAMESPACES += \
+	vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)
+
 ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
 #Set IKE logs to verbose for WFC
 PRODUCT_PROPERTY_OVERRIDES += log.tag.IKE=VERBOSE
@@ -87,7 +103,6 @@
 
 # From system.property
 PRODUCT_PROPERTY_OVERRIDES += \
-	dev.usbsetting.embedded=on \
 	ro.telephony.default_network=27 \
 	persist.vendor.ril.use.iccid_to_plmn=1 \
 	persist.vendor.ril.emergencynumber.mode=5
@@ -165,18 +180,21 @@
 TARGET_USES_VULKAN = true
 
 PRODUCT_SOONG_NAMESPACES += \
-	vendor/arm/mali/valhall \
-	vendor/arm/mali/valhall/cl \
-	vendor/arm/mali/valhall/libmali \
-	vendor/arm/mali/valhall/cinstr/production/gpu-hwc-reader
+	vendor/arm/mali/valhall
+
+$(call soong_config_set,pixel_mali,soc,$(TARGET_BOARD_PLATFORM))
 
 include device/google/gs101/neuralnetwork/neuralnetwork.mk
 
 PRODUCT_PACKAGES += \
 	libGLES_mali \
-	vulkan.gs101 \
+	vulkan.mali \
 	libOpenCL \
 	libgpudataproducer
+
+PRODUCT_VENDOR_PROPERTIES += \
+	ro.hardware.vulkan=mali
+
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
 	debug.mali.disable_backend_affinity=true
 
@@ -192,8 +210,8 @@
 	frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
 	frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
 	frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
-	frameworks/native/data/etc/android.software.vulkan.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
-	frameworks/native/data/etc/android.software.opengles.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
+	frameworks/native/data/etc/android.software.vulkan.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
+	frameworks/native/data/etc/android.software.opengles.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
 
 ifeq ($(USE_SWIFTSHADER),true)
 PRODUCT_VENDOR_PROPERTIES += \
@@ -266,6 +284,12 @@
 PRODUCT_COPY_FILES += \
 	device/google/gs101/conf/init.recovery.device.rc:$(TARGET_COPY_OUT_RECOVERY)/root/init.recovery.gs101.rc
 
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf
+else
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf/nomodem
+endif
+
 # Fstab files
 PRODUCT_PACKAGES += \
 	fstab.gs101 \
@@ -294,7 +318,7 @@
 
 # Contexthub HAL
 PRODUCT_PACKAGES += \
-	android.hardware.contexthub@1.2-service.generic
+    android.hardware.contexthub-service.generic
 
 # CHRE tools
 ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
@@ -365,6 +389,15 @@
 	frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml
 
 # Sensors
+ifneq (,$(findstring tangor, $(TARGET_PRODUCT)))
+PRODUCT_COPY_FILES += \
+        frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
+        frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
+        frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
+        frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml\
+        frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
+        frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+else
 PRODUCT_COPY_FILES += \
 	frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
 	frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
@@ -375,19 +408,16 @@
 	frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \
 	frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
 	frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+endif
 
 # Add sensor HAL 2.1 product packages
 PRODUCT_PACKAGES += android.hardware.sensors@2.1-service.multihal
 
-# Debug property for sensor.
-ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
-PRODUCT_PROPERTY_OVERRIDES += \
-	vendor.debug.sensor.hal.event_logger=true
-endif
-
 # USB HAL
 PRODUCT_PACKAGES += \
-	android.hardware.usb@1.3-service.gs101
+	android.hardware.usb-service.gs101
+PRODUCT_PACKAGES += \
+	android.hardware.usb.gadget-service.gs101
 
 # MIDI feature
 PRODUCT_COPY_FILES += \
@@ -474,7 +504,8 @@
 PRODUCT_PACKAGES += \
 	android.hardware.graphics.mapper@4.0-impl \
 	android.hardware.graphics.allocator@4.0-service \
-	android.hardware.graphics.allocator@4.0-impl
+	android.hardware.graphics.allocator@4.0-impl \
+	android.hardware.graphics.allocator-V1-service
 
 PRODUCT_PACKAGES += \
 	android.hardware.memtrack-service.pixel \
@@ -490,8 +521,8 @@
 
 # WideVine modules
 PRODUCT_PACKAGES += \
-	android.hardware.drm@1.4-service.clearkey \
-	android.hardware.drm@1.4-service.widevine \
+	android.hardware.drm-service.clearkey \
+	android.hardware.drm-service.widevine \
 	liboemcrypto \
 
 
@@ -548,7 +579,7 @@
 # Enable project quotas and casefolding for emulated storage without sdcardfs
 $(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)
 
-$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression_with_xor.mk)
 # Enforce generic ramdisk allow list
 $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
 
@@ -573,8 +604,16 @@
 	frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
 	frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml
 
+# (See b/211840489)
+ifneq ($(DISABLE_CAMERA_FS_AF),true)
 PRODUCT_COPY_FILES += \
-	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.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml
+else
+PRODUCT_COPY_FILES += \
+	frameworks/native/data/etc/android.hardware.camera.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.xml
+endif
+
+PRODUCT_COPY_FILES += \
 	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.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
 	frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml\
@@ -762,7 +801,9 @@
 endif
 
 # GPS HAL
+ifeq (,$(filter tangor citron,$(subst _, ,$(TARGET_PRODUCT))))
 include device/google/gs101/gnss/device-gnss.mk
+endif
 
 # Trusty (KM, GK, Storage)
 $(call inherit-product, system/core/trusty/trusty-storage.mk)
@@ -783,10 +824,7 @@
 PRODUCT_PROPERTY_OVERRIDES += \
 	ro.frp.pst=/dev/block/by-name/frp
 
-# Bluetooth HAL
-PRODUCT_PACKAGES += \
-	android.hardware.bluetooth@1.1-service.bcmbtlinux \
-	bt_vendor.conf
+# Bluetooth
 PRODUCT_COPY_FILES += \
 	frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
 	frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml
@@ -816,6 +854,10 @@
 PRODUCT_PRODUCT_PROPERTIES += \
 	persist.sys.fuse.passthrough.enable=true
 
+# Use FUSE BPF
+PRODUCT_PRODUCT_PROPERTIES += \
+	ro.fuse.bpf.enabled=false
+
 # Use /product/etc/fstab.postinstall to mount system_other
 PRODUCT_PRODUCT_PROPERTIES += \
 	ro.postinstall.fstab.prefix=/product
@@ -851,12 +893,11 @@
 	vts.bin
 
 # This will be called only if IMSService is building with source code for dev branches.
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/shannon-ims/device-vendor.mk)
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-ims/device-vendor.mk)
 
 PRODUCT_PACKAGES += ShannonIms
 
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/shannon-iwlan/device-vendor.mk)
-include device/google/gs101/telephony/pktrouter.mk
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-iwlan/device-vendor.mk)
 
 #RCS Test Messaging App
 PRODUCT_PACKAGES_DEBUG += \
@@ -882,13 +923,13 @@
 #$(call inherit-product, vendor/google_devices/gs101/proprietary/device-vendor.mk)
 
 ifneq ($(BOARD_WITHOUT_RADIO),true)
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/common/device-vendor.mk)
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device-vendor.mk)
 endif
 
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
-$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
-else
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
 endif
 #$(call inherit-product, hardware/google_devices/exynos5/exynos5.mk)
 #$(call inherit-product-if-exists, hardware/google_devices/gs101/gs101.mk)
@@ -900,8 +941,7 @@
 
 PRODUCT_COPY_FILES += \
 	device/google/gs101/default-permissions.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/default-permissions/default-permissions.xml \
-	device/google/gs101/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml \
-	frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \
+	device/google/gs101/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml
 
 # modem_svc_sit daemon
 PRODUCT_PACKAGES += modem_svc_sit
@@ -909,6 +949,27 @@
 # modem logging binary/configs
 PRODUCT_PACKAGES += modem_logging_control
 
+# modem logging configs
+PRODUCT_COPY_FILES += \
+	device/google/gs101/radio/config/logging.conf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/logging.conf \
+	device/google/gs101/radio/config/default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.cfg \
+	device/google/gs101/radio/config/default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.nprf \
+	device/google/gs101/radio/config/default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_metrics.xml \
+	device/google/gs101/radio/config/teamfood_default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.cfg \
+	device/google/gs101/radio/config/teamfood_default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.nprf \
+	device/google/gs101/radio/config/teamfood_default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default_metrics.xml \
+	device/google/gs101/radio/config/default_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.cfg \
+	device/google/gs101/radio/config/default_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.nprf \
+	device/google/gs101/radio/config/default_NAS_RRC.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.cfg \
+	device/google/gs101/radio/config/default_NAS_RRC.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.nprf \
+	device/google/gs101/radio/config/default_network.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.cfg \
+	device/google/gs101/radio/config/default_network.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.nprf \
+	device/google/gs101/radio/config/Pixel_Default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.cfg \
+	device/google/gs101/radio/config/Pixel_Default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.nprf \
+	device/google/gs101/radio/config/Pixel_Default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default_metrics.xml \
+	device/google/gs101/radio/config/Pixel_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.cfg \
+	device/google/gs101/radio/config/Pixel_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.nprf
+
 PRODUCT_COPY_FILES += \
 	device/google/gs101/radio/gnss_blanking.csv:$(TARGET_COPY_OUT_VENDOR)/etc/modem/gnss_blanking.csv
 
@@ -923,18 +984,18 @@
 	$(NULL)
 
 PRODUCT_PACKAGES += \
-	android.hardware.health@2.1-impl-gs101 \
-	android.hardware.health@2.1-service
+	android.hardware.health-service.gs101 \
+	android.hardware.health-service.gs101_recovery \
 
 # Audio
 # Audio HAL Server & Default Implementations
 PRODUCT_PACKAGES += \
 	android.hardware.audio.service \
-	android.hardware.audio@7.0-impl \
+	android.hardware.audio@7.1-impl \
 	android.hardware.audio.effect@7.0-impl \
-	android.hardware.bluetooth.audio@2.1-impl \
+	android.hardware.bluetooth.audio-impl \
 	android.hardware.soundtrigger@2.3-impl \
-	vendor.google.whitechapel.audio.audioext@2.0-impl
+	vendor.google.whitechapel.audio.audioext@3.0-impl
 
 #Audio HAL libraries
 PRODUCT_PACKAGES += \
@@ -954,7 +1015,6 @@
 	audio_spk_35l41 \
 	audio.usb.default \
 	audio.usbv2.default \
-	audio.a2dp.default \
 	audio.bluetooth.default \
 	audio.r_submix.default \
 	libamcsextfile \
@@ -985,6 +1045,14 @@
 
 $(call soong_config_set,aoc_audio_board,platform,$(TARGET_BOARD_PLATFORM))
 
+## AoC soong
+PRODUCT_SOONG_NAMESPACES += \
+        vendor/google/whitechapel/aoc
+
+$(call soong_config_set,aoc,target_soc,$(TARGET_BOARD_PLATFORM))
+
+$(call soong_config_set,android_hardware_audio,run_64bit,true)
+
 # Audio properties
 PRODUCT_PROPERTY_OVERRIDES += \
 	ro.config.vc_call_vol_steps=7 \
@@ -1055,8 +1123,13 @@
 	vendor.samsung_slsi.hardware.tetheroffload@1.1-service
 
 # pKVM
+$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
+PRODUCT_BUILD_PVMFW_IMAGE := true
 ifeq ($(TARGET_PKVM_ENABLED),true)
-    $(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
+    PRODUCT_PACKAGES += pkvm_enabler
+else
+    PRODUCT_COPY_FILES += \
+	    device/google/gs101/pkvm/pkvm_experiment.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/pkvm_experiment.rc
 endif
 
 # Enable watchdog timeout loop breaker.
@@ -1088,6 +1161,9 @@
 # Telephony
 include device/google/gs101/telephony/user.mk
 
+# Wifi ext
+include hardware/google/pixel/wifi_ext/device.mk
+
 # Battery Stats Viewer
 PRODUCT_PACKAGES_DEBUG += BatteryStatsViewer
 
diff --git a/device_framework_matrix_product.xml b/device_framework_matrix_product.xml
index ba34409..e65f01c 100644
--- a/device_framework_matrix_product.xml
+++ b/device_framework_matrix_product.xml
@@ -57,7 +57,15 @@
         </interface>
     </hal>
     <hal format="aidl" optional="true">
+      <name>com.google.face.debug</name>
+        <interface>
+            <name>IDebugHost</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="aidl" optional="true">
       <name>com.google.edgetpu</name>
+        <version>2</version>
         <interface>
             <name>IEdgeTpuVendorService</name>
             <instance>default</instance>
@@ -106,7 +114,7 @@
     <hal format="aidl" optional="true">
         <name>hardware.qorvo.uwb</name>
         <interface>
-            <name>IUwb</name>
+            <name>IUwbVendor</name>
             <instance>default</instance>
         </interface>
     </hal>
@@ -120,7 +128,7 @@
     </hal>
     <hal format="hidl" optional="true">
         <name>vendor.google.google_battery</name>
-        <version>1.1</version>
+        <version>1.2</version>
         <interface>
             <name>IGoogleBattery</name>
             <instance>default</instance>
@@ -136,7 +144,7 @@
     </hal>
     <hal format="hidl">
        <name>vendor.google.whitechapel.audio.audioext</name>
-       <version>2.0</version>
+       <version>3.0</version>
        <interface>
            <name>IAudioExt</name>
            <instance>default</instance>
@@ -144,7 +152,7 @@
     </hal>
     <hal format="hidl" optional="true">
         <name>vendor.google.wifi_ext</name>
-        <version>1.2</version>
+        <version>1.3</version>
         <interface>
             <name>IWifiExt</name>
             <instance>default</instance>
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index 813d186..ca391e5 100644
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -214,6 +214,8 @@
     // sessions or starts a new session after the one with performance issues).
     dumpLogs(fd, kCameraLogDir, cameraDestDir, 10, "session-ended-");
     dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "high-drop-rate-");
+    dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "watchdog-");
+    dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "camera-ended-");
 }
 
 timepoint_t startSection(int fd, const std::string &sectionName) {
@@ -249,6 +251,7 @@
 
 DumpstateDevice::DumpstateDevice()
   : mTextSections{
+        { "pre-touch", [this](int fd) { dumpPreTouchSection(fd); } },
         { "wlan", [this](int fd) { dumpWlanSection(fd); } },
         { "soc", [this](int fd) { dumpSocSection(fd); } },
         { "storage", [this](int fd) { dumpStorageSection(fd); } },
@@ -347,6 +350,9 @@
         DumpFileToFd(fd, "maxfg_base", "/dev/logbuffer_maxfg_base_monitor");
         DumpFileToFd(fd, "maxfg_flip", "/dev/logbuffer_maxfg_flip_monitor");
     }
+    if (!stat("/sys/class/power_supply/dock", &buffer)) {
+        DumpFileToFd(fd, "Power supply property dock", "/sys/class/power_supply/dock/uevent");
+    }
 
     if (!stat("/dev/logbuffer_tcpm", &buffer)) {
         DumpFileToFd(fd, "Logbuffer TCPM", "/dev/logbuffer_tcpm");
@@ -377,6 +383,7 @@
     DumpFileToFd(fd, "TTF details", "/sys/class/power_supply/battery/ttf_details");
     DumpFileToFd(fd, "TTF stats", "/sys/class/power_supply/battery/ttf_stats");
     DumpFileToFd(fd, "maxq", "/dev/logbuffer_maxq");
+    DumpFileToFd(fd, "aacr_state", "/sys/class/power_supply/battery/aacr_state");
 
     RunCommandToFd(fd, "TRICKLE-DEFEND Config", {"/vendor/bin/sh", "-c",
                         " cd /sys/devices/platform/google,battery/power_supply/battery/;"
@@ -392,6 +399,7 @@
     if (!PropertiesHelper::IsUserBuild()) {
 
         DumpFileToFd(fd, "DC_registers dump", "/sys/class/power_supply/pca9468-mains/device/registers_dump");
+        DumpFileToFd(fd, "Charging table dump", "/d/google_battery/chg_raw_profile");
 
 
         RunCommandToFd(fd, "fg_model", {"/vendor/bin/sh", "-c",
@@ -420,8 +428,14 @@
     /* EEPROM State */
     if (!stat("/sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom", &buffer)) {
         RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom"});
-    } else {
+    } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom", &buffer)) {
         RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom"});
+    } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom", &buffer)) {
+        RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom"});
+    } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom", &buffer)) {
+        RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom"});
+    } else {
+        RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom"});
     }
 
     DumpFileToFd(fd, "Charger Stats", "/sys/class/power_supply/battery/charge_details");
@@ -487,14 +501,20 @@
                    "for f in /sys/class/thermal/cooling* ; do "
                        "type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \"$type: $temp\" ; "
                        "done"});
+    RunCommandToFd(fd, "Cooling Device User Vote State", {"/vendor/bin/sh", "-c",
+                   "for f in /sys/class/thermal/cooling* ; do "
+                   "if [ ! -f $f/user_vote ]; then continue; fi; "
+                   "type=`cat $f/type` ; temp=`cat $f/user_vote` ; echo \"$type: $temp\" ; "
+                   "done"});
     RunCommandToFd(fd, "Cooling Device Time in State", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
                    "do type=`cat $f/type` ; temp=`cat $f/stats/time_in_state_ms` ; echo \"$type:\n$temp\" ; done"});
     RunCommandToFd(fd, "Cooling Device Trans Table", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
                    "do type=`cat $f/type` ; temp=`cat $f/stats/trans_table` ; echo \"$type:\n$temp\" ; done"});
     RunCommandToFd(fd, "Cooling Device State2Power Table", {"/vendor/bin/sh", "-c",
                    "for f in /sys/class/thermal/cooling* ; do "
-                       "type=`cat $f/type` ; state2power_table=`cat $f/state2power_table` ; echo \"$type: $state2power_table\" ; "
-                       "done"});
+                   "if [ ! -f $f/state2power_table ]; then continue; fi; "
+                   "type=`cat $f/type` ; state2power_table=`cat $f/state2power_table` ; echo \"$type: $state2power_table\" ; "
+                   "done"});
     DumpFileToFd(fd, "TMU state:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_state");
     DumpFileToFd(fd, "TMU current temperature:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_current_temp");
     DumpFileToFd(fd, "TMU_TOP rise thresholds:", "/sys/module/gs101_thermal/parameters/tmu_top_reg_dump_rise_thres");
@@ -504,6 +524,42 @@
 }
 
 // Dump items related to touch
+void DumpstateDevice::dumpPreTouchSection(int fd) {
+    const char nvt_spi_path[] = "/sys/class/spi_master/spi11/spi11.0/input/nvt_touch";
+    char cmd[256];
+
+    /* NVT touch */
+    if (!access(nvt_spi_path, R_OK)) {
+        snprintf(cmd, sizeof(cmd),
+                 "echo %s > %s/%s",
+                 "0x21",
+                 nvt_spi_path,
+                 "force_touch_active");
+        RunCommandToFd(fd, "Force Touch Active(Enable)", {"/vendor/bin/sh", "-c", cmd});
+
+        snprintf(cmd, sizeof(cmd), "/proc/nvt_fw_version");
+        if (!access(cmd, R_OK))
+            DumpFileToFd(fd, "FW version", cmd);
+
+#if 0	/* b/193467774: remove this temporarily */
+        snprintf(cmd, sizeof(cmd), "/proc/nvt_diff");
+        if (!access(cmd, R_OK))
+            DumpFileToFd(fd, "Diff", cmd);
+
+        snprintf(cmd, sizeof(cmd), "%s/nvt_fw_history", nvt_spi_path);
+        if (!access(nvt_spi_path, R_OK))
+            DumpFileToFd(fd, "FW History", cmd);
+#endif
+
+        snprintf(cmd, sizeof(cmd),
+                 "echo %s > %s/%s",
+                 "0x20",
+                 nvt_spi_path,
+                 "force_touch_active");
+        RunCommandToFd(fd, "Force Touch Active(Disable)", {"/vendor/bin/sh", "-c", cmd});
+    }
+}
+
 void DumpstateDevice::dumpTouchSection(int fd) {
     const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
                                       "/proc/fts/driver_test",
@@ -918,6 +974,21 @@
     DumpFileToFd(fd, "AoC hotword wake", "/sys/devices/platform/19000000.aoc/control/hotword_wakeup");
     DumpFileToFd(fd, "AoC memory exception wake", "/sys/devices/platform/19000000.aoc/control/memory_exception");
     DumpFileToFd(fd, "AoC memory votes", "/sys/devices/platform/19000000.aoc/control/memory_votes");
+    RunCommandToFd(fd, "AoC Heap Stats (A32)",
+      {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 1' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+      CommandOptions::WithTimeout(1).Build());
+    RunCommandToFd(fd, "AoC Heap Stats (F1)",
+      {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 2' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+      CommandOptions::WithTimeout(1).Build());
+    RunCommandToFd(fd, "AoC Heap Stats (HF0)",
+      {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 3' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+      CommandOptions::WithTimeout(1).Build());
+    RunCommandToFd(fd, "AoC Heap Stats (HF1)",
+      {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 4' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+      CommandOptions::WithTimeout(1).Build());
+    RunCommandToFd(fd, "AoC MIF Stats",
+      {"/vendor/bin/sh", "-c", "echo 'mif details' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+      CommandOptions::WithTimeout(1).Build());
 }
 
 // Dump items related to sensors usf.
@@ -982,6 +1053,7 @@
 void DumpstateDevice::dumpGscSection(int fd) {
     RunCommandToFd(fd, "Citadel VERSION", {"vendor/bin/hw/citadel_updater", "-lv"});
     RunCommandToFd(fd, "Citadel STATS", {"vendor/bin/hw/citadel_updater", "--stats"});
+    RunCommandToFd(fd, "GSC DEBUG DUMP", {"vendor/bin/hw/citadel_updater", "-D"});
 }
 
 // Dump essential camera debugging logs
diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h
index 74d0ce1..5cc3249 100644
--- a/dumpstate/DumpstateDevice.h
+++ b/dumpstate/DumpstateDevice.h
@@ -64,6 +64,7 @@
     void dumpWlanSection(int fd);
     void dumpPowerSection(int fd);
     void dumpThermalSection(int fd);
+    void dumpPreTouchSection(int fd);
     void dumpTouchSection(int fd);
     void dumpSocSection(int fd);
     void dumpCpuSection(int fd);
diff --git a/edgetpu/OWNERS b/edgetpu/OWNERS
new file mode 100644
index 0000000..9eb92a9
--- /dev/null
+++ b/edgetpu/OWNERS
@@ -0,0 +1,6 @@
+# Devs who work on EdgeTPU on Android.
+hsuy@google.com
+yuchicheng@google.com
+iayara@google.com
+qinyiyan@google.com
+macwang@google.com
\ No newline at end of file
diff --git a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
index 2a1193e..1880f60 100644
--- a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
+++ b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
@@ -21,3 +21,6 @@
 
 # Enable Suez
 $(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
+
+# Must add below method to each project's device.mk to show sensorLocation
+#$(call soong_config_set,fp_hal_feature,pixel_product, project_XX)
diff --git a/gnss/47765/config/gps.xml b/gnss/47765/config/gps.xml
index 0cb80ed..9c49907 100644
--- a/gnss/47765/config/gps.xml
+++ b/gnss/47765/config/gps.xml
@@ -21,6 +21,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -54,6 +55,8 @@
        AssertEnabled="true"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
   />
 
   <gll
diff --git a/gnss/47765/config/gps.xml.oriole b/gnss/47765/config/gps.xml.oriole
index 0fec87d..f34f73c 100644
--- a/gnss/47765/config/gps.xml.oriole
+++ b/gnss/47765/config/gps.xml.oriole
@@ -21,6 +21,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -54,9 +55,13 @@
        AssertEnabled="true"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
+       PpsDevice="/sys/class/pps/pps0/assert_elapsed"
   />
 
   <gll
+       PpsEnable="true"
        LogPriMask="LOG_INFO"
        LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
        FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps.xml.raven b/gnss/47765/config/gps.xml.raven
index 25ea859..f06958b 100644
--- a/gnss/47765/config/gps.xml.raven
+++ b/gnss/47765/config/gps.xml.raven
@@ -21,6 +21,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -54,9 +55,13 @@
        AssertEnabled="true"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
+       PpsDevice="/sys/class/pps/pps0/assert_elapsed"
   />
 
   <gll
+       PpsEnable="true"
        LogPriMask="LOG_INFO"
        LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
        FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps_user.xml b/gnss/47765/config/gps_user.xml
index f435fd7..9e1a246 100644
--- a/gnss/47765/config/gps_user.xml
+++ b/gnss/47765/config/gps_user.xml
@@ -20,6 +20,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -53,6 +54,8 @@
        AssertEnabled="false"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
   />
 
   <gll
diff --git a/gnss/47765/config/gps_user.xml.oriole b/gnss/47765/config/gps_user.xml.oriole
index f701c00..3ec656c 100644
--- a/gnss/47765/config/gps_user.xml.oriole
+++ b/gnss/47765/config/gps_user.xml.oriole
@@ -20,6 +20,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -53,9 +54,13 @@
        AssertEnabled="false"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
+       PpsDevice="/sys/class/pps/pps0/assert_elapsed"
   />
 
   <gll
+       PpsEnable="true"
        LogPriMask="LOG_INFO"
        LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
        FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps_user.xml.raven b/gnss/47765/config/gps_user.xml.raven
index e5800db..98cf347 100644
--- a/gnss/47765/config/gps_user.xml.raven
+++ b/gnss/47765/config/gps_user.xml.raven
@@ -20,6 +20,7 @@
        SuplSslMethod="SSLv23_NO_TLSv1_2"
        SuplEnable="true"
        SuplUseApn="true"
+       SuplUseFwCellInfo="false"
        SuplTlsCertDirPath="/etc/security/cacerts"
        SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
        SuplUT1Seconds="20"
@@ -53,9 +54,13 @@
        AssertEnabled="false"
        CpLppeCancelDbhOnAgnssProvideLoc="true"
        CpLppeUseAgnssLocForEmptyDbh="true"
+       ReAidingOnHotStart="false"
+       ReAidingIntervalSec="1200"
+       PpsDevice="/sys/class/pps/pps0/assert_elapsed"
   />
 
   <gll
+       PpsEnable="true"
        LogPriMask="LOG_INFO"
        LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
        FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/lhd.conf b/gnss/47765/config/lhd.conf
index efde25b..c000d58 100644
--- a/gnss/47765/config/lhd.conf
+++ b/gnss/47765/config/lhd.conf
@@ -31,3 +31,4 @@
 
 SkipSensorWakeLock=true
 LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/gnss/47765/config/lhd_user.conf b/gnss/47765/config/lhd_user.conf
index 0216ace..682d03a 100644
--- a/gnss/47765/config/lhd_user.conf
+++ b/gnss/47765/config/lhd_user.conf
@@ -29,3 +29,4 @@
 
 SkipSensorWakeLock=true
 LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/health/Android.bp b/health/Android.bp
index 41a0e12..2bac61b 100644
--- a/health/Android.bp
+++ b/health/Android.bp
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package {
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
@@ -24,36 +23,39 @@
         "//device/google/gs101:device_google_gs101_license",
     ],
 }
-
-cc_library_shared {
-    name: "android.hardware.health@2.1-impl-gs101",
-    stem: "android.hardware.health@2.0-impl-2.1-gs101",
-
-    proprietary: true,
+cc_defaults {
+    name: "android.hardware.health-service.gs101-defaults",
+    defaults: [
+        "libhealth_aidl_impl_user",
+        "libhealth_aidl_charger_defaults",
+    ],
     relative_install_path: "hw",
+    vintf_fragments: ["android.hardware.health-service.gs101.xml"],
     srcs: [
         "Health.cpp",
     ],
-
     cflags: [
         "-Wall",
         "-Werror",
     ],
-
     static_libs: [
-        "android.hardware.health@1.0-convert",
-        "libbatterymonitor",
-        "libhealth2impl",
-        "libhealthloop",
+        "libhealth_aidl_impl",
     ],
-
+}
+cc_binary {
+    name: "android.hardware.health-service.gs101",
+    defaults: ["android.hardware.health-service.gs101-defaults"],
+    proprietary: true,
+    init_rc: ["android.hardware.health-service.gs101.rc"],
+    overrides: ["charger"],
     shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhidlbase",
         "libpixelhealth",
-        "libutils",
-        "android.hardware.health@2.0",
-        "android.hardware.health@2.1",
     ],
 }
+cc_binary {
+    name: "android.hardware.health-service.gs101_recovery",
+    defaults: ["android.hardware.health-service.gs101-defaults"],
+    recovery: true,
+    init_rc: ["android.hardware.health-service.gs101_recovery.rc"],
+    overrides: ["charger.recovery"],
+}
diff --git a/health/Health.cpp b/health/Health.cpp
index fe8ad84..a50cc8b 100644
--- a/health/Health.cpp
+++ b/health/Health.cpp
@@ -19,17 +19,20 @@
 #include <android-base/file.h>
 #include <android-base/parseint.h>
 #include <android-base/strings.h>
-#include <android/hardware/health/2.0/types.h>
-#include <health2impl/Health.h>
+#include <android/hardware/health/translate-ndk.h>
+#include <health-impl/Health.h>
 #include <health/utils.h>
-#include <hal_conversion.h>
 
+// Recovery doesn't have libpixelhealth and charger mode
+#ifndef __ANDROID_RECOVERY__
+#include <health-impl/ChargerUtils.h>
 #include <pixelhealth/BatteryDefender.h>
 #include <pixelhealth/BatteryMetricsLogger.h>
 #include <pixelhealth/BatteryThermalControl.h>
 #include <pixelhealth/ChargerDetect.h>
 #include <pixelhealth/DeviceHealth.h>
 #include <pixelhealth/LowBatteryShutdownMetrics.h>
+#endif // !__ANDROID_RECOVERY__
 
 #include <chrono>
 #include <fstream>
@@ -41,15 +44,15 @@
 
 using namespace std::literals;
 
-using android::hardware::health::V1_0::hal_conversion::convertFromHealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-using android::hardware::health::V2_0::DiskStats;
-using android::hardware::health::V2_0::StorageAttribute;
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::Result;
-using ::android::hardware::health::V2_1::IHealth;
+using aidl::android::hardware::health::DiskStats;
+using aidl::android::hardware::health::HalHealthLoop;
+using aidl::android::hardware::health::HealthInfo;
+using aidl::android::hardware::health::StorageInfo;
 using android::hardware::health::InitHealthdConfig;
 
+#ifndef __ANDROID_RECOVERY__
+using aidl::android::hardware::health::charger::ChargerCallback;
+using aidl::android::hardware::health::charger::ChargerModeMain;
 using hardware::google::pixel::health::BatteryDefender;
 using hardware::google::pixel::health::BatteryMetricsLogger;
 using hardware::google::pixel::health::BatteryThermalControl;
@@ -72,6 +75,7 @@
 static BatteryMetricsLogger battMetricsLogger(kBatteryResistance, kBatteryOCV);
 static LowBatteryShutdownMetrics shutdownMetrics(kVoltageAvg);
 static DeviceHealth deviceHealth;
+#endif // !__ANDROID_RECOVERY__
 
 #define UFS_DIR "/dev/sys/block/bootdevice"
 constexpr char kUfsHealthEol[]{UFS_DIR "/health_descriptor/eol_info"};
@@ -79,7 +83,6 @@
 constexpr char kUfsHealthLifetimeB[]{UFS_DIR "/health_descriptor/life_time_estimation_b"};
 constexpr char kUfsVersion[]{UFS_DIR "/device_descriptor/specification_version"};
 constexpr char kDiskStatsFile[]{"/sys/block/sda/stat"};
-constexpr char kUFSName[]{"UFS0"};
 
 static std::string ufs_version;
 static uint16_t eol;
@@ -88,8 +91,10 @@
 static std::chrono::system_clock::time_point ufs_last_query_time;
 constexpr auto kUfsQueryIntervalHours = std::chrono::hours{24};
 
+#ifndef __ANDROID_RECOVERY__
 static bool needs_wlc_updates = false;
 constexpr char kWlcCapacity[]{WLC_DIR "/capacity"};
+#endif // !__ANDROID_RECOVERY__
 
 std::ifstream assert_open(const std::string &path) {
   std::ifstream stream(path);
@@ -118,12 +123,10 @@
   info->version = ufs_version;
 }
 
-void fill_ufs_storage_attribute(StorageAttribute *attr) {
-  attr->isInternal = true;
-  attr->isBootDevice = true;
-  attr->name = kUFSName;
-}
-
+#ifdef __ANDROID_RECOVERY__
+void private_healthd_board_init(struct healthd_config *) {}
+int private_healthd_board_battery_update(HealthInfo *) { return 0; }
+#else // !__ANDROID__RECOVERY__
 static bool FileExists(const std::string &filename) {
   struct stat buffer;
 
@@ -140,26 +143,26 @@
   }
 }
 
-int private_healthd_board_battery_update(struct android::BatteryProperties *props) {
-  deviceHealth.update(props);
-  battThermalControl.updateThermalState(props);
-  battMetricsLogger.logBatteryProperties(props);
-  shutdownMetrics.logShutdownVoltage(props);
+int private_healthd_board_battery_update(HealthInfo *health_info) {
+  deviceHealth.update(health_info);
+  battThermalControl.updateThermalState(*health_info);
+  battMetricsLogger.logBatteryProperties(*health_info);
+  shutdownMetrics.logShutdownVoltage(*health_info);
   // Allow BatteryDefender to override online properties
-  ChargerDetect::onlineUpdate(props);
-  battDefender.update(props);
+  ChargerDetect::onlineUpdate(health_info);
+  battDefender.update(health_info);
 
   if (needs_wlc_updates &&
-      !android::base::WriteStringToFile(std::to_string(props->batteryLevel), kWlcCapacity))
+      !android::base::WriteStringToFile(std::to_string(health_info->batteryLevel), kWlcCapacity))
       LOG(INFO) << "Unable to write battery level to wireless capacity";
 
   return 0;
 }
+#endif // __ANDROID_RECOVERY__
 
-void private_get_storage_info(std::vector<StorageInfo> &vec_storage_info) {
-  vec_storage_info.resize(1);
-  StorageInfo *storage_info = &vec_storage_info[0];
-  fill_ufs_storage_attribute(&storage_info->attr);
+void private_get_storage_info(std::vector<StorageInfo> *vec_storage_info) {
+  vec_storage_info->resize(1);
+  StorageInfo *storage_info = &vec_storage_info->at(0);
 
   read_ufs_version(storage_info);
 
@@ -180,10 +183,9 @@
   return;
 }
 
-void private_get_disk_stats(std::vector<DiskStats> &vec_stats) {
-  vec_stats.resize(1);
-  DiskStats *stats = &vec_stats[0];
-  fill_ufs_storage_attribute(&stats->attr);
+void private_get_disk_stats(std::vector<DiskStats> *vec_stats) {
+  vec_stats->resize(1);
+  DiskStats *stats = &vec_stats->at(0);
 
   auto stream = assert_open(kDiskStatsFile);
   // Regular diskstats entries
@@ -195,18 +197,14 @@
 }
 }  // anonymous namespace
 
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_1 {
-namespace implementation {
+namespace aidl::android::hardware::health::implementation {
 class HealthImpl : public Health {
  public:
-  HealthImpl(std::unique_ptr<healthd_config>&& config)
-    : Health(std::move(config)) {}
+  HealthImpl(std::string_view instance_name, std::unique_ptr<healthd_config>&& config)
+    : Health(std::move(instance_name), std::move(config)) {}
 
-  Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
-  Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
+    ndk::ScopedAStatus getDiskStats(std::vector<DiskStats>* out) override;
+    ndk::ScopedAStatus getStorageInfo(std::vector<StorageInfo>* out) override;
 
  protected:
   void UpdateHealthInfo(HealthInfo* health_info) override;
@@ -214,53 +212,57 @@
 };
 
 void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) {
-  struct BatteryProperties props;
-  convertFromHealthInfo(health_info->legacy.legacy, &props);
-  private_healthd_board_battery_update(&props);
-  convertToHealthInfo(&props, health_info->legacy.legacy);
+  private_healthd_board_battery_update(health_info);
 }
 
-Return<void> HealthImpl::getStorageInfo(getStorageInfo_cb _hidl_cb)
+ndk::ScopedAStatus HealthImpl::getStorageInfo(std::vector<StorageInfo>* out)
 {
-  std::vector<struct StorageInfo> info;
-  private_get_storage_info(info);
-  hidl_vec<struct StorageInfo> info_vec(info);
-  if (!info.size()) {
-      _hidl_cb(Result::NOT_SUPPORTED, info_vec);
-  } else {
-      _hidl_cb(Result::SUCCESS, info_vec);
+  private_get_storage_info(out);
+  if (out->empty()) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
   }
-  return Void();
+  return ndk::ScopedAStatus::ok();
 }
 
-Return<void> HealthImpl::getDiskStats(getDiskStats_cb _hidl_cb)
+ndk::ScopedAStatus HealthImpl::getDiskStats(std::vector<DiskStats>* out)
 {
-  std::vector<struct DiskStats> stats;
-  private_get_disk_stats(stats);
-  hidl_vec<struct DiskStats> stats_vec(stats);
-  if (!stats.size()) {
-      _hidl_cb(Result::NOT_SUPPORTED, stats_vec);
-  } else {
-      _hidl_cb(Result::SUCCESS, stats_vec);
+  private_get_disk_stats(out);
+  if (out->empty()) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
   }
-  return Void();
+  return ndk::ScopedAStatus::ok();
 }
 
-}  // namespace implementation
-}  // namespace V2_1
-}  // namespace health
-}  // namespace hardware
-}  // namespace android
+}  // namespace aidl::android::hardware::health::implementation
 
-extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) {
-  using ::android::hardware::health::V2_1::implementation::HealthImpl;
-  if (instance != "default"sv) {
-      return nullptr;
-  }
+int main(int argc, char **argv) {
+  using ::aidl::android::hardware::health::implementation::HealthImpl;
+
+  // Use kernel logging in recovery
+#ifdef __ANDROID_RECOVERY__
+  android::base::InitLogging(argv, android::base::KernelLogger);
+#endif
+
   auto config = std::make_unique<healthd_config>();
   InitHealthdConfig(config.get());
 
   private_healthd_board_init(config.get());
 
-  return new HealthImpl(std::move(config));
+  auto binder =
+      ndk::SharedRefBase::make<HealthImpl>("default"sv, std::move(config));
+
+  if (argc >= 2 && argv[1] == "--charger"sv) {
+    // In regular mode, start charger UI.
+#ifndef __ANDROID_RECOVERY__
+    LOG(INFO) << "Starting charger mode with UI.";
+    return ChargerModeMain(binder, std::make_shared<ChargerCallback>(binder));
+#endif
+    // In recovery, ignore --charger arg.
+    LOG(INFO) << "Starting charger mode without UI.";
+  } else {
+    LOG(INFO) << "Starting health HAL.";
+  }
+
+  auto hal_health_loop = std::make_shared<HalHealthLoop>(binder, binder);
+  return hal_health_loop->StartLoop();
 }
diff --git a/health/android.hardware.health-service.gs101.rc b/health/android.hardware.health-service.gs101.rc
new file mode 100644
index 0000000..0c31362
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.rc
@@ -0,0 +1,16 @@
+service vendor.health-gs101 /vendor/bin/hw/android.hardware.health-service.gs101
+    class hal
+    user system
+    group system
+    capabilities WAKE_ALARM BLOCK_SUSPEND
+    file /dev/kmsg w
+service vendor.charger /vendor/bin/hw/android.hardware.health-service.gs101 --charger
+    class charger
+    seclabel u:r:charger_vendor:s0
+    user system
+    group system wakelock input
+    capabilities SYS_BOOT
+    file /dev/kmsg w
+    file /sys/fs/pstore/console-ramoops-0 r
+    file /sys/fs/pstore/console-ramoops r
+    file /proc/last_kmsg r
diff --git a/health/android.hardware.health-service.gs101.xml b/health/android.hardware.health-service.gs101.xml
new file mode 100644
index 0000000..98026cb
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+    <hal format="aidl">
+        <name>android.hardware.health</name>
+        <version>1</version>
+        <fqname>IHealth/default</fqname>
+    </hal>
+</manifest>
diff --git a/health/android.hardware.health-service.gs101_recovery.rc b/health/android.hardware.health-service.gs101_recovery.rc
new file mode 100644
index 0000000..d1e3504
--- /dev/null
+++ b/health/android.hardware.health-service.gs101_recovery.rc
@@ -0,0 +1,7 @@
+service vendor.health-gs101 /system/bin/hw/android.hardware.health-service.gs101_recovery
+    class hal
+    seclabel u:r:hal_health_default:s0
+    user system
+    group system
+    capabilities WAKE_ALARM BLOCK_SUSPEND
+    file /dev/kmsg w
diff --git a/manifest-gralloc3.xml b/manifest-gralloc3.xml
deleted file mode 100644
index ca284df..0000000
--- a/manifest-gralloc3.xml
+++ /dev/null
@@ -1,231 +0,0 @@
-<manifest version="1.0" type="device" target-level="5">
-   <hal format="hidl">
-        <name>android.hardware.audio</name>
-        <transport>hwbinder</transport>
-        <version>7.0</version>
-        <interface>
-            <name>IDevicesFactory</name>
-            <instance>default</instance>
-        </interface>
-   </hal>
-   <hal format="hidl">
-        <name>android.hardware.audio.effect</name>
-        <transport>hwbinder</transport>
-        <version>7.0</version>
-        <interface>
-            <name>IEffectsFactory</name>
-            <instance>default</instance>
-        </interface>
-   </hal>
-   <hal format="hidl">
-        <name>android.hardware.soundtrigger</name>
-        <transport>hwbinder</transport>
-        <version>2.3</version>
-        <interface>
-            <name>ISoundTriggerHw</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.media.omx</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IOmx</name>
-            <instance>default</instance>
-        </interface>
-        <interface>
-            <name>IOmxStore</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.allocator</name>
-		<transport>hwbinder</transport>
-		<version>2.0</version>
-		<interface>
-			<name>IAllocator</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.mapper</name>
-		<transport arch="32+64">passthrough</transport>
-		<version>2.0</version>
-		<interface>
-			<name>IMapper</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.composer</name>
-		<transport>hwbinder</transport>
-		<version>2.4</version>
-		<interface>
-			<name>IComposer</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-    <hal format="hidl">
-        <name>android.hardware.memtrack</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IMemtrack</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-	<hal format="hidl">
-		<name>android.hardware.renderscript</name>
-		<transport arch="32+64">passthrough</transport>
-		<version>1.0</version>
-		<interface>
-			<name>IDevice</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-    <hal format="hidl">
-        <name>android.hardware.drm</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ICryptoFactory</name>
-            <instance>default</instance>
-        </interface>
-        <interface>
-            <name>IDrmFactory</name>
-            <instance>default</instance>
-        </interface>
-	<fqname>@1.3::ICryptoFactory/clearkey</fqname>
-        <fqname>@1.3::IDrmFactory/clearkey</fqname>
-        <fqname>@1.3::ICryptoFactory/widevine</fqname>
-        <fqname>@1.3::IDrmFactory/widevine</fqname>
-    </hal>
-    <hal format = "hidl">
-        <name>android.hardware.dumpstate</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IDumpstateDevice</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.bluetooth</name>
-        <transport>hwbinder</transport>
-        <version>1.1</version>
-        <interface>
-            <name>IBluetoothHci</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.bluetooth.audio</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IBluetoothAudioProvidersFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.boot</name>
-        <transport>hwbinder</transport>
-        <fqname>@1.2::IBootControl/default</fqname>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.sensors</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISensors</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.neuralnetworks</name>
-        <transport>hwbinder</transport>
-        <version>1.2</version>
-        <interface>
-            <name>IDevice</name>
-            <instance>armnn</instance>
-        </interface>
-        <fqname>@1.2::IDevice/armnn</fqname>
-    </hal>
-    <hal format="hidl">
-       <name>android.hardware.neuralnetworks</name>
-       <transport>hwbinder</transport>
-       <fqname>@1.3::IDevice/google-edgetpu</fqname>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.health</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IHealth</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="aidl">
-        <name>com.google.input</name>
-        <interface>
-            <name>ITouchContextService</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>hardware.google.bluetooth.bt_channel_avoidance</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IBTChannelAvoidance</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>hardware.google.bluetooth.sar</name>
-        <transport>hwbinder</transport>
-        <version>1.1</version>
-        <interface>
-            <name>IBluetoothSar</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>hardware.google.bluetooth.ccc</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IBluetoothCcc</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-      <name>vendor.google.google_battery</name>
-      <transport>hwbinder</transport>
-      <version>1.1</version>
-      <interface>
-        <name>IGoogleBattery</name>
-        <instance>default</instance>
-      </interface>
-    </hal>
-    <hal format="hidl">
-       <name>vendor.google.whitechapel.audio.audioext</name>
-       <transport>hwbinder</transport>
-       <version>2.0</version>
-       <interface>
-           <name>IAudioExt</name>
-           <instance>default</instance>
-       </interface>
-    </hal>
-    <hal format="hidl">
-       <name>vendor.google.audiometricext</name>
-       <transport>hwbinder</transport>
-       <version>1.0</version>
-       <interface>
-           <name>IAudioMetricExt</name>
-           <instance>default</instance>
-       </interface>
-    </hal>
-    <kernel target-level="6"/>
-</manifest>
diff --git a/manifest.xml b/manifest.xml
index 7b78da9..f213f00 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -2,7 +2,7 @@
    <hal format="hidl">
         <name>android.hardware.audio</name>
         <transport>hwbinder</transport>
-        <version>7.0</version>
+        <version>7.1</version>
         <interface>
             <name>IDevicesFactory</name>
             <instance>default</instance>
@@ -85,15 +85,6 @@
         </interface>
     </hal>
     <hal format="hidl">
-        <name>android.hardware.bluetooth.audio</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IBluetoothAudioProvidersFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
         <name>android.hardware.boot</name>
         <transport>hwbinder</transport>
         <fqname>@1.2::IBootControl/default</fqname>
@@ -108,15 +99,6 @@
         </interface>
         <fqname>@1.3::IDevice/google-armnn</fqname>
     </hal>
-    <hal format="hidl">
-        <name>android.hardware.health</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IHealth</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
     <hal format="aidl">
         <name>com.google.input</name>
         <interface>
@@ -154,7 +136,7 @@
     <hal format="hidl">
       <name>vendor.google.google_battery</name>
       <transport>hwbinder</transport>
-      <version>1.1</version>
+      <version>1.2</version>
       <interface>
         <name>IGoogleBattery</name>
         <instance>default</instance>
@@ -163,7 +145,7 @@
     <hal format="hidl">
        <name>vendor.google.whitechapel.audio.audioext</name>
        <transport>hwbinder</transport>
-       <version>2.0</version>
+       <version>3.0</version>
        <interface>
            <name>IAudioExt</name>
            <instance>default</instance>
diff --git a/manifest_64-gralloc3.xml b/manifest_64-gralloc3.xml
deleted file mode 100644
index 9dc7924..0000000
--- a/manifest_64-gralloc3.xml
+++ /dev/null
@@ -1,220 +0,0 @@
-<manifest version="1.0" type="device" target-level="5">
-   <hal format="hidl">
-        <name>android.hardware.audio</name>
-        <transport>hwbinder</transport>
-        <version>7.0</version>
-        <interface>
-            <name>IDevicesFactory</name>
-            <instance>default</instance>
-        </interface>
-   </hal>
-   <hal format="hidl">
-        <name>android.hardware.audio.effect</name>
-        <transport>hwbinder</transport>
-        <version>7.0</version>
-        <interface>
-            <name>IEffectsFactory</name>
-            <instance>default</instance>
-        </interface>
-   </hal>
-   <hal format="hidl">
-        <name>android.hardware.soundtrigger</name>
-        <transport>hwbinder</transport>
-        <version>2.3</version>
-        <interface>
-            <name>ISoundTriggerHw</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.allocator</name>
-		<transport>hwbinder</transport>
-		<version>2.0</version>
-		<interface>
-			<name>IAllocator</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.mapper</name>
-		<transport arch="32+64">passthrough</transport>
-		<version>2.1</version>
-		<interface>
-			<name>IMapper</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-	<hal format="hidl">
-		<name>android.hardware.graphics.composer</name>
-		<transport>hwbinder</transport>
-		<version>2.4</version>
-		<interface>
-			<name>IComposer</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-    <hal format="hidl">
-        <name>android.hardware.memtrack</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IMemtrack</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-	<hal format="hidl">
-		<name>android.hardware.renderscript</name>
-		<transport arch="32+64">passthrough</transport>
-		<version>1.0</version>
-		<interface>
-			<name>IDevice</name>
-			<instance>default</instance>
-		</interface>
-	</hal>
-    <hal format="hidl">
-        <name>android.hardware.drm</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ICryptoFactory</name>
-            <instance>default</instance>
-        </interface>
-        <interface>
-            <name>IDrmFactory</name>
-            <instance>default</instance>
-        </interface>
-	<fqname>@1.3::ICryptoFactory/clearkey</fqname>
-        <fqname>@1.3::IDrmFactory/clearkey</fqname>
-        <fqname>@1.3::ICryptoFactory/widevine</fqname>
-        <fqname>@1.3::IDrmFactory/widevine</fqname>
-    </hal>
-    <hal format = "hidl">
-        <name>android.hardware.dumpstate</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IDumpstateDevice</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.bluetooth</name>
-        <transport>hwbinder</transport>
-        <version>1.1</version>
-        <interface>
-            <name>IBluetoothHci</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.bluetooth.audio</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IBluetoothAudioProvidersFactory</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.boot</name>
-        <transport>hwbinder</transport>
-        <fqname>@1.2::IBootControl/default</fqname>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.sensors</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>ISensors</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-<!--
-    <hal format="hidl">
-        <name>android.hardware.neuralnetworks</name>
-        <transport>hwbinder</transport>
-        <version>1.2</version>
-        <interface>
-            <name>IDevice</name>
-            <instance>armnn</instance>
-        </interface>
-        <fqname>@1.2::IDevice/armnn</fqname>
-    </hal>
--->
-    <hal format="hidl">
-       <name>android.hardware.neuralnetworks</name>
-       <transport>hwbinder</transport>
-       <fqname>@1.3::IDevice/google-edgetpu</fqname>
-    </hal>
-    <hal format="hidl">
-        <name>android.hardware.health</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IHealth</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="aidl">
-        <name>com.google.input</name>
-        <interface>
-            <name>ITouchContextService</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>hardware.google.bluetooth.bt_channel_avoidance</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IBTChannelAvoidance</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-        <name>hardware.google.bluetooth.sar</name>
-        <transport>hwbinder</transport>
-        <version>1.1</version>
-        <interface>
-            <name>IBluetoothSar</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-   <hal format="hidl">
-        <name>hardware.google.bluetooth.ccc</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-            <name>IBluetoothCcc</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
-    <hal format="hidl">
-      <name>vendor.google.google_battery</name>
-      <transport>hwbinder</transport>
-      <version>1.1</version>
-      <interface>
-        <name>IGoogleBattery</name>
-        <instance>default</instance>
-      </interface>
-    </hal>
-    <hal format="hidl">
-       <name>vendor.google.whitechapel.audio.audioext</name>
-       <transport>hwbinder</transport>
-       <version>2.0</version>
-       <interface>
-           <name>IAudioExt</name>
-           <instance>default</instance>
-       </interface>
-    </hal>
-    <hal format="hidl">
-       <name>vendor.google.audiometricext</name>
-       <transport>hwbinder</transport>
-       <version>1.0</version>
-       <interface>
-           <name>IAudioMetricExt</name>
-           <instance>default</instance>
-       </interface>
-    </hal>
-    <kernel target-level="6"/>
-</manifest>
diff --git a/manifest_64.xml b/manifest_64.xml
index 17b08d0..8c19233 100644
--- a/manifest_64.xml
+++ b/manifest_64.xml
@@ -2,7 +2,7 @@
    <hal format="hidl">
         <name>android.hardware.audio</name>
         <transport>hwbinder</transport>
-        <version>7.0</version>
+        <version>7.1</version>
         <interface>
             <name>IDevicesFactory</name>
             <instance>default</instance>
@@ -109,15 +109,6 @@
        <transport>hwbinder</transport>
        <fqname>@1.3::IDevice/google-edgetpu</fqname>
     </hal>
-    <hal format="hidl">
-        <name>android.hardware.health</name>
-        <transport>hwbinder</transport>
-        <version>2.1</version>
-        <interface>
-            <name>IHealth</name>
-            <instance>default</instance>
-        </interface>
-    </hal>
     <hal format="aidl">
         <name>com.google.input</name>
         <interface>
@@ -155,7 +146,7 @@
     <hal format="hidl">
       <name>vendor.google.google_battery</name>
       <transport>hwbinder</transport>
-      <version>1.1</version>
+      <version>1.2</version>
       <interface>
         <name>IGoogleBattery</name>
         <instance>default</instance>
@@ -164,7 +155,7 @@
     <hal format="hidl">
        <name>vendor.google.whitechapel.audio.audioext</name>
        <transport>hwbinder</transport>
-       <version>2.0</version>
+       <version>3.0</version>
        <interface>
            <name>IAudioExt</name>
            <instance>default</instance>
diff --git a/media_codecs_aosp_c2.xml b/media_codecs_aosp_c2.xml
index 5d34a90..62b4707 100644
--- a/media_codecs_aosp_c2.xml
+++ b/media_codecs_aosp_c2.xml
@@ -153,6 +153,7 @@
             <Limit name="concurrent-instances" max="16" />
             <Feature name="can-swap-width-height" value="1" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
         <MediaCodec name="c2.exynos.hevc.encoder" type="video/hevc" >
             <Limit name="size" min="64x64" max="3840x2176" />
@@ -166,6 +167,7 @@
             <Limit name="concurrent-instances" max="16" />
             <Feature name="can-swap-width-height" value="1" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
         <MediaCodec name="c2.exynos.mpeg4.encoder" type="video/mp4v-es">
             <Limit name="size" min="32x32" max="2048x2048" />
@@ -179,6 +181,7 @@
             <Limit name="concurrent-instances" max="16" />
             <Feature name="can-swap-width-height" value="1" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
         <MediaCodec name="c2.exynos.h263.encoder" type="video/3gpp">
             <Limit name="size" min="32x32" max="2048x1152" />
@@ -191,6 +194,7 @@
             <Limit name="performance-point-1920x1080" range="120" />
             <Limit name="concurrent-instances" max="16" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
         <MediaCodec name="c2.exynos.vp8.encoder" type="video/x-vnd.on2.vp8" >
             <Limit name="size" min="32x32" max="3840x2160" />
@@ -204,6 +208,7 @@
             <Limit name="concurrent-instances" max="16" />
             <Feature name="can-swap-width-height" value="1" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
         <MediaCodec name="c2.exynos.vp9.encoder" type="video/x-vnd.on2.vp9" >
             <Limit name="size" min="64x64" max="3840x2176" />
@@ -217,6 +222,7 @@
             <Limit name="concurrent-instances" max="16" />
             <Feature name="can-swap-width-height" value="1" />
             <Feature name="vq-minimum-quality"/>
+            <Feature name="qp-bounds"/>
         </MediaCodec>
     </Encoders>
 </MediaCodecs>
diff --git a/modem/user.mk b/modem/user.mk
index 81f3773..fb01f2c 100644
--- a/modem/user.mk
+++ b/modem/user.mk
@@ -1,2 +1,4 @@
-PRODUCT_PACKAGES += dmd
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+  PRODUCT_PACKAGES += dmd
+endif
 BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/user
diff --git a/modem/userdebug.mk b/modem/userdebug.mk
index 87697a7..4fcab64 100644
--- a/modem/userdebug.mk
+++ b/modem/userdebug.mk
@@ -1,2 +1,4 @@
-PRODUCT_PACKAGES += vcd
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+  PRODUCT_PACKAGES += vcd
+endif
 BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/userdebug/
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 3c1e38a..5c14b29 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -240,10 +240,18 @@
     <!-- Should the pinner service pin the Home application? -->
     <bool name="config_pinnerHomeApp">true</bool>
 
+    <!-- The default intensity level for alarm vibrations. See
+         Settings.System.ALARM_VIBRATION_INTENSITY more details on the constant values and
+         meanings. -->
+    <integer name="config_defaultAlarmVibrationIntensity">3</integer>
     <!-- The default intensity level for haptic feedback. See
          Settings.System.HAPTIC_FEEDBACK_INTENSITY more details on the constant values and
          meanings. -->
     <integer name="config_defaultHapticFeedbackIntensity">3</integer>
+    <!-- The default intensity level for media vibrations. See
+         Settings.System.MEDIA_VIBRATION_INTENSITY more details on the constant values and
+         meanings. -->
+    <integer name="config_defaultMediaVibrationIntensity">3</integer>
     <!-- The default intensity level for notification vibrations. See
          Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
          meanings. -->
@@ -260,4 +268,19 @@
 
     <!-- Enable Zram writeback feature to allow unused pages in zram be written to flash. -->
     <bool name="config_zramWriteback">true</bool>
+
+    <!-- Configure tcp buffer sizes in the form:
+         rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max
+         If this is configured as an empty string, the system default will be applied.
+
+         For now this config is used by mobile data only. In the future it should be
+         used by Wi-Fi as well.
+
+         Note that starting from Android 13, the TCP buffer size is fixed after boot up, and should
+         never be changed based on carriers or the network types. The value should be configured
+         appropriately based on the device's memory and performance. It is recommended to use lower
+         values if the device has low memory or doesn't support high-speed network such like LTE,
+         NR, or Wifi.
+    -->
+    <string name="config_tcp_buffers" translatable="false">2097152,6291456,16777216,512000,2097152,8388608</string>
 </resources>
diff --git a/overlay/frameworks/base/core/res/res/values/dimens.xml b/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 0000000..fc36aa3
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2022, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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>
+    <!-- for 20dp of padding at 3.5px/dp at default density -->
+    <dimen name="rounded_corner_content_padding">70px</dimen>
+</resources>
diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
index cea6e90..6d08eb4 100644
--- a/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
+++ b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -16,9 +16,6 @@
 */
 -->
 <resources>
-    <!-- for 20dp of padding at 3.5px/dp at default density -->
-    <dimen name="rounded_corner_content_padding">70px</dimen>
-
     <!-- the padding on the top of the statusbar (usually 0) -->
     <dimen name="status_bar_padding_top">1dp</dimen>
 
diff --git a/pixelstats/pixelstats-vendor.gs101.rc b/pixelstats/pixelstats-vendor.gs101.rc
index 98af5fc..d324b6a 100644
--- a/pixelstats/pixelstats-vendor.gs101.rc
+++ b/pixelstats/pixelstats-vendor.gs101.rc
@@ -1,5 +1,5 @@
 on property:sys.boot_completed=1
-    start vendor.pixelstats_vendor
+	start vendor.pixelstats_vendor
 
 service vendor.pixelstats_vendor /vendor/bin/pixelstats-vendor
     class hal
diff --git a/pkvm/Android.bp b/pkvm/Android.bp
new file mode 100644
index 0000000..dba9601
--- /dev/null
+++ b/pkvm/Android.bp
@@ -0,0 +1,31 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: [
+        "//device/google/gs101:device_google_gs101_license",
+    ],
+}
+
+cc_binary {
+    name: "pkvm_enabler",
+    vendor: true,
+    init_rc: ["pkvm_enabler.gs101.rc"],
+    srcs: ["pkvm_enabler.c"],
+    shared_libs: ["liblog"],
+}
diff --git a/pkvm/pkvm_enabler.c b/pkvm/pkvm_enabler.c
new file mode 100644
index 0000000..cb14ba6
--- /dev/null
+++ b/pkvm/pkvm_enabler.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG     "pkvm_enabler"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <log/log.h>
+
+#define KVM_DEVICE  "/dev/kvm"
+#define MISC_WRITER "/vendor/bin/misc_writer"
+
+int main() {
+    char *newargv[] = { MISC_WRITER, "--set-enable-pkvm", NULL };
+    char *newenvp[] = { NULL };
+    pid_t pid;
+    int ret, wstatus;
+
+    /* Check whether KVM device exists. */
+    ret = access(KVM_DEVICE, F_OK);
+
+    /* If KVM device exists, return SUCCESS to continue booting. */
+    if (ret == 0) {
+        exit(EXIT_SUCCESS);
+    }
+
+    if (ret != -ENOENT) {
+        ALOGW("Unexpected error from access(): %d", ret);
+    }
+
+    /*
+     * If KVM device does not exist, run misc_writer and return FAILURE
+     * to force a reboot.
+     */
+    pid = fork();
+    if (pid == -1) {
+        ALOGE("Could not fork: %d", errno);
+        exit(EXIT_FAILURE);
+    }
+
+    if (pid == 0) {
+        execve(MISC_WRITER, newargv, newenvp);
+        ALOGE("Could not execute " MISC_WRITER ": %d", errno);
+        _exit(EXIT_FAILURE);
+    }
+
+    waitpid(pid, &wstatus, 0);
+    if (WIFEXITED(wstatus)) {
+        ret = WEXITSTATUS(wstatus);
+        if (ret) {
+            ALOGE(MISC_WRITER " exit status: %d", ret);
+        }
+    } else {
+        ALOGE(MISC_WRITER " terminated unexpectedly: %d", wstatus);
+    }
+
+    exit(EXIT_FAILURE);
+}
diff --git a/pkvm/pkvm_enabler.gs101.rc b/pkvm/pkvm_enabler.gs101.rc
new file mode 100644
index 0000000..6f329d3
--- /dev/null
+++ b/pkvm/pkvm_enabler.gs101.rc
@@ -0,0 +1,5 @@
+service pkvm_enabler /vendor/bin/pkvm_enabler
+    reboot_on_failure reboot,pkvm-not-enabled
+
+on early-init
+    exec_start pkvm_enabler
\ No newline at end of file
diff --git a/pkvm/pkvm_experiment.rc b/pkvm/pkvm_experiment.rc
new file mode 100644
index 0000000..148f084
--- /dev/null
+++ b/pkvm/pkvm_experiment.rc
@@ -0,0 +1,13 @@
+service vendor.pkvm_enable /vendor/bin/misc_writer --set-enable-pkvm
+    disabled
+    oneshot
+
+service vendor.pkvm_disable /vendor/bin/misc_writer --set-disable-pkvm
+    disabled
+    oneshot
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=true
+    start vendor.pkvm_enable
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=false
+    start vendor.pkvm_disable
diff --git a/powerhint_a0.json b/powerhint_a0.json
index 2136a2b..4787367 100644
--- a/powerhint_a0.json
+++ b/powerhint_a0.json
@@ -55,7 +55,7 @@
     },
     {
       "Name": "TAUClampBoost",
-      "Path": "/sys/kernel/vendor_sched/ta_uclamp_min",
+      "Path": "/proc/vendor_sched/ta_uclamp_min",
       "Values": [
         "0",
         "410",
diff --git a/powerhint_a1.json b/powerhint_a1.json
index c3d1581..81b4b65 100644
--- a/powerhint_a1.json
+++ b/powerhint_a1.json
@@ -75,7 +75,7 @@
     },
     {
       "Name": "TAUClampBoost",
-      "Path": "/sys/kernel/vendor_sched/ta_uclamp_min",
+      "Path": "/proc/vendor_sched/ta_uclamp_min",
       "Values": [
         "0",
         "410",
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index 10ecbed..74b7242 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -11,6 +11,14 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
+soong_namespace {
+    imports: [
+        "hardware/google/pixel",
+        "device/google/gs-common/powerstats",
+    ],
+}
+
 package {
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
@@ -33,6 +41,7 @@
     ],
 
     shared_libs: [
+        "android.hardware.power.stats-impl.gs-common",
         "android.hardware.power.stats-impl.pixel",
     ],
 }
diff --git a/powerstats/AocStateResidencyDataProvider.cpp b/powerstats/AocStateResidencyDataProvider.cpp
deleted file mode 100644
index c64496d..0000000
--- a/powerstats/AocStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "AocStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-AocStateResidencyDataProvider::AocStateResidencyDataProvider(std::vector<std::pair<std::string,
-        std::string>> ids, std::vector<std::pair<std::string, std::string>> states) {
-    // AoC stats are reported in ticks of 244.140625ns. The transform
-    // function converts ticks to milliseconds.
-    // 1000000 / 244.140625 = 4096.
-    static const uint64_t AOC_CLK = 4096;
-    std::function<uint64_t(uint64_t)> aocTickToMs = [](uint64_t a) { return a / AOC_CLK; };
-    GenericStateResidencyDataProvider::StateResidencyConfig config = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "Counter:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "Cumulative time:",
-            .totalTimeTransform = aocTickToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "Time last entered:",
-            .lastEntryTransform = aocTickToMs,
-    };
-    for (const auto &id : ids) {
-        for (const auto &state : states) {
-            std::vector<std::pair<std::string, std::string>> aocStateHeaders = {
-                std::make_pair(state.first, ""),
-            };
-            std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
-            cfgs.emplace_back(generateGenericStateResidencyConfigs(config, aocStateHeaders),
-                    id.first, "");
-            std::unique_ptr<GenericStateResidencyDataProvider> sdp(
-                    new GenericStateResidencyDataProvider(id.second + state.second, cfgs));
-            mProviders[id.first].push_back(std::move(sdp));
-        }
-    }
-}
-
-bool AocStateResidencyDataProvider::getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
-    // States from the same power entity are merged.
-    bool ret = true;
-    for (const auto &providerList : mProviders) {
-        int32_t stateId = 0;
-        std::string curEntity = providerList.first;
-        std::vector<StateResidency> stateResidencies;
-
-        // Iterate over each provider in the providerList, appending each of the states
-        for (const auto &provider : providerList.second) {
-            std::unordered_map<std::string, std::vector<StateResidency>> residency;
-            ret &= provider->getStateResidencies(&residency);
-
-            // Each provider should only return data for curEntity but checking anyway
-            if (residency.find(curEntity) != residency.end()) {
-                for (auto &r : residency.at(curEntity)) {
-                    /*
-                     * Modifying stateId here because we are stitching together infos from
-                     * multiple GenericStateResidencyDataProviders. stateId must be modified
-                     * to maintain uniqueness for a given entity
-                     */
-                    r.id = stateId++;
-                    stateResidencies.push_back(r);
-                }
-            }
-        }
-
-        residencies->emplace(curEntity, stateResidencies);
-    }
-    return ret;
-}
-
-std::unordered_map<std::string, std::vector<State>> AocStateResidencyDataProvider::getInfo() {
-    // States from the same power entity are merged
-    std::unordered_map<std::string, std::vector<State>> infos;
-    for (const auto &providerList : mProviders) {
-        int32_t stateId = 0;
-        std::string curEntity = providerList.first;
-        std::vector<State> stateInfos;
-
-        // Iterate over each provider in the providerList, appending each of the states
-        for (const auto &provider : providerList.second) {
-            std::unordered_map<std::string, std::vector<State>> info = provider->getInfo();
-
-            // Each provider should only return data for curEntity but checking anyway
-            if (info.find(curEntity) != info.end()) {
-                for (auto &i : info.at(curEntity)) {
-                    /*
-                     * Modifying stateId because we are stitching together infos from
-                     * multiple GenericStateResidencyDataProviders. stateId must be modified
-                     * to maintain uniqueness for a given entity
-                     */
-                    i.id = stateId++;
-                    stateInfos.push_back(i);
-                }
-            }
-        }
-
-        infos.emplace(curEntity, stateInfos);
-    }
-
-    return infos;
-}
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/AocStateResidencyDataProvider.h b/powerstats/AocStateResidencyDataProvider.h
deleted file mode 100644
index 5008912..0000000
--- a/powerstats/AocStateResidencyDataProvider.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#pragma once
-
-#include <dataproviders/GenericStateResidencyDataProvider.h>
-#include <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class AocStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
-  public:
-    AocStateResidencyDataProvider(std::vector<std::pair<std::string, std::string>> ids,
-                                  std::vector<std::pair<std::string, std::string>> states);
-    ~AocStateResidencyDataProvider() = default;
-    bool getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-    std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
-  private:
-    std::unordered_map<std::string /* entity name */,
-        std::vector<std::unique_ptr<GenericStateResidencyDataProvider>> /* providers */> mProviders;
-};
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
\ No newline at end of file
diff --git a/powerstats/DevfreqStateResidencyDataProvider.cpp b/powerstats/DevfreqStateResidencyDataProvider.cpp
deleted file mode 100644
index d59e1e5..0000000
--- a/powerstats/DevfreqStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "DevfreqStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-
-static const std::string nameSuffix = "-DVFS";
-static const std::string pathSuffix = "/time_in_state";
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-DevfreqStateResidencyDataProvider::DevfreqStateResidencyDataProvider(const std::string& name,
-        const std::string& path) : mName(name + nameSuffix), mPath(path + pathSuffix) {}
-
-bool DevfreqStateResidencyDataProvider::extractNum(const char *str, char **str_end, int base,
-        int64_t* num) {
-    // errno can be set to any non-zero value by a library function call
-    // regardless of whether there was an error, so it needs to be cleared
-    // in order to check the error set by strtoll
-    errno = 0;
-    *num = std::strtoll(str, str_end, base);
-    return (errno != ERANGE);
-}
-
-std::vector<std::pair<int64_t, int64_t>> DevfreqStateResidencyDataProvider::parseTimeInState() {
-    // Using FILE* instead of std::ifstream for performance reasons
-    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(mPath.c_str(), "r"), fclose);
-    if (!fp) {
-        PLOG(ERROR) << "Failed to open file " << mPath;
-        return {};
-    }
-
-    std::vector<std::pair<int64_t, int64_t>> timeInState;
-
-    char *line = nullptr;
-    size_t len = 0;
-    while (getline(&line, &len, fp.get()) != -1) {
-        char* pEnd;
-        int64_t frequencyHz, totalTimeMs;
-        if (!extractNum(line, &pEnd, 10, &frequencyHz) ||
-            !extractNum(pEnd, &pEnd, 10, &totalTimeMs)) {
-            PLOG(ERROR) << "Failed to parse " << mPath;
-            free(line);
-            return {};
-        }
-
-        timeInState.push_back({frequencyHz, totalTimeMs});
-    }
-
-    free(line);
-    return timeInState;
-}
-
-bool DevfreqStateResidencyDataProvider::getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
-    std::vector<std::pair<int64_t, int64_t>> timeInState = parseTimeInState();
-
-    if (timeInState.empty()) {
-        return false;
-    }
-
-    int32_t id = 0;
-    std::vector<StateResidency> stateResidencies;
-    for (const auto[frequencyHz, totalTimeMs] : timeInState) {
-        StateResidency s = {.id = id++, .totalTimeInStateMs = totalTimeMs};
-        stateResidencies.push_back(s);
-    }
-
-    residencies->emplace(mName, stateResidencies);
-    return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> DevfreqStateResidencyDataProvider::getInfo() {
-    std::vector<std::pair<int64_t, int64_t>> timeInState = parseTimeInState();
-
-    if (timeInState.empty()) {
-        return {};
-    }
-
-    int32_t id = 0;
-    std::vector<State> states;
-    for (const auto[frequencyHz, totalTimeMs] : timeInState) {
-        State s = {.id = id++, .name = std::to_string(frequencyHz / 1000) + "MHz"};
-        states.push_back(s);
-    }
-
-    return {{mName, states}};
-}
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/DevfreqStateResidencyDataProvider.h b/powerstats/DevfreqStateResidencyDataProvider.h
deleted file mode 100644
index 8341b43..0000000
--- a/powerstats/DevfreqStateResidencyDataProvider.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#pragma once
-
-#include <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class DevfreqStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
-  public:
-    DevfreqStateResidencyDataProvider(const std::string& name, const std::string& path);
-    ~DevfreqStateResidencyDataProvider() = default;
-
-    /*
-     * See IStateResidencyDataProvider::getStateResidencies
-     */
-    bool getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
-    /*
-     * See IStateResidencyDataProvider::getInfo
-     */
-    std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
-  private:
-    bool extractNum(const char *str, char **str_end, int base, int64_t* num);
-    std::vector<std::pair<int64_t, int64_t>> parseTimeInState();
-    const std::string mName;
-    const std::string mPath;
-};
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
deleted file mode 100644
index 511159e..0000000
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "DvfsStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-#include <android-base/parseint.h>
-#include <android-base/strings.h>
-
-#include <string>
-#include <utility>
-
-using android::base::ParseUint;
-using android::base::Split;
-using android::base::StartsWith;
-using android::base::Trim;
-
-static const std::string nameSuffix = "-DVFS";
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate,
-        std::vector<Config> cfgs)
-    : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {}
-
-int32_t DvfsStateResidencyDataProvider::matchEntity(char const *line) {
-    for (int32_t i = 0; i < mPowerEntities.size(); i++) {
-        if (mPowerEntities[i].powerEntityName == Trim(std::string(line))) {
-            return i;
-        }
-    }
-    return -1;
-}
-
-int32_t DvfsStateResidencyDataProvider::matchState(char const *line, const Config& powerEntity) {
-    for (int32_t i = 0; i < powerEntity.states.size(); i++) {
-        if (StartsWith(Trim(std::string(line)), powerEntity.states[i].second)) {
-            return i;
-        }
-    }
-    return -1;
-}
-
-bool DvfsStateResidencyDataProvider::parseState(char const *line, uint64_t *duration,
-        uint64_t *count) {
-    std::vector<std::string> parts = Split(line, " ");
-    if (parts.size() != 7) {
-        return false;
-    }
-    if (!ParseUint(Trim(parts[3]), count)) {
-        return false;
-    }
-    if (!ParseUint(Trim(parts[6]), duration)) {
-        return false;
-    }
-    return true;
-}
-
-bool DvfsStateResidencyDataProvider::getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
-    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(mPath.c_str(), "r"), fclose);
-    if (!fp) {
-        PLOG(ERROR) << __func__ << ":Failed to open file " << mPath;
-        return false;
-    }
-
-    for (const Config &powerEntity : mPowerEntities) {
-        std::vector<StateResidency> stateResidency(powerEntity.states.size());
-        for (int32_t i = 0; i < stateResidency.size(); i++) {
-            stateResidency[i].id = i;
-        }
-        residencies->emplace(powerEntity.powerEntityName + nameSuffix, stateResidency);
-    }
-
-    size_t len = 0;
-    char *line = nullptr;
-
-    int32_t temp, powerEntityIndex, stateId = -1;
-    uint64_t duration, count;
-    auto it = residencies->end();
-
-    while (getline(&line, &len, fp.get()) != -1) {
-        temp = matchEntity(line);
-        // Assign new index only when a new valid entity is encountered.
-        if (temp >= 0) {
-            powerEntityIndex = temp;
-            it = residencies->find(mPowerEntities[powerEntityIndex].powerEntityName + nameSuffix);
-        }
-
-        if (it != residencies->end()) {
-            stateId = matchState(line, mPowerEntities[powerEntityIndex]);
-
-            if (stateId >= 0) {
-                if (parseState(line, &duration, &count)) {
-                    it->second[stateId].totalTimeInStateMs =
-                            duration / mClockRate;
-                    it->second[stateId].totalStateEntryCount = count;
-                } else {
-                    LOG(ERROR) << "Failed to parse duration and count from [" << std::string(line)
-                               << "]";
-                    return false;
-                }
-            }
-        }
-    }
-
-    free(line);
-
-    return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> DvfsStateResidencyDataProvider::getInfo() {
-    std::unordered_map<std::string, std::vector<State>> info;
-    for (auto const &entity : mPowerEntities) {
-        std::vector<State> stateInfo(entity.states.size());
-        int32_t stateId = 0;
-        for (auto const &state : entity.states) {
-            stateInfo[stateId] = State{
-                .id = stateId,
-                .name = state.first
-            };
-            stateId++;
-        }
-        info.emplace(entity.powerEntityName + nameSuffix, stateInfo);
-    }
-    return info;
-}
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.h b/powerstats/DvfsStateResidencyDataProvider.h
deleted file mode 100644
index ca8ab22..0000000
--- a/powerstats/DvfsStateResidencyDataProvider.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#pragma once
-
-#include <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class DvfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
-  public:
-    class Config {
-      public:
-        // Power entity name to parse.
-        std::string powerEntityName;
-
-        // List of state pairs (name to display, name to parse).
-        std::vector<std::pair<std::string, std::string>> states;
-    };
-    /*
-     * path - path to dvfs sysfs node.
-     * clockRate - clock rate in KHz.
-     */
-    DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate, std::vector<Config> cfgs);
-    ~DvfsStateResidencyDataProvider() = default;
-
-    /*
-     * See IStateResidencyDataProvider::getStateResidencies
-     */
-    bool getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
-    /*
-     * See IStateResidencyDataProvider::getInfo
-     */
-    std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
-  private:
-    int32_t matchEntity(char const *line);
-    int32_t matchState(char const *line, const Config& powerEntity);
-    bool parseState(char const *line, uint64_t *duration, uint64_t *count);
-
-    const std::string mPath;
-    const uint64_t mClockRate;
-    std::vector<Config> mPowerEntities;
-};
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp
index f1e3aa5..13e6b71 100644
--- a/powerstats/Gs101CommonDataProviders.cpp
+++ b/powerstats/Gs101CommonDataProviders.cpp
@@ -605,17 +605,33 @@
 }
 
 void addDevfreq(std::shared_ptr<PowerStats> p) {
-    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("INT",
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "INT",
             "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int"));
 
-    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("INTCAM",
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "INTCAM",
             "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam"));
 
-    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("CAM",
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "DISP",
+            "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp"));
+
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "CAM",
             "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam"));
 
-    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("TNR",
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "TNR",
             "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr"));
+
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "MFC",
+            "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc"));
+
+    p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+            "BO",
+            "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo"));
 }
 
 void addTPU(std::shared_ptr<PowerStats> p) {
@@ -630,7 +646,7 @@
 
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
             EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"},
-            {{UID_TIME_IN_STATE, "/sys/class/edgetpu/abrolhos/device/tpu_usage"}},
+            {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}},
             stateCoeffs));
 }
 
diff --git a/powerstats/UfsStateResidencyDataProvider.cpp b/powerstats/UfsStateResidencyDataProvider.cpp
deleted file mode 100644
index aec7724..0000000
--- a/powerstats/UfsStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "UfsStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-#include <android-base/parseint.h>
-#include <android-base/strings.h>
-
-#include <string>
-#include <utility>
-
-using android::base::ParseInt;
-using android::base::Split;
-using android::base::StartsWith;
-using android::base::Trim;
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-const int32_t HIBERNATE_STATE_ID = 0;
-const std::string UFS_NAME = "UFS";
-
-UfsStateResidencyDataProvider::UfsStateResidencyDataProvider(std::string prefix) : kPrefix(prefix) {}
-
-bool UfsStateResidencyDataProvider::getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
-    StateResidency residency;
-    residency.id = HIBERNATE_STATE_ID;
-
-        // The transform function converts microseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
-
-    residency.totalTimeInStateMs = usecToMs(readStat(kPrefix + "hibern8_total_us"));
-    residency.totalStateEntryCount = readStat(kPrefix + "hibern8_exit_cnt");
-    residency.lastEntryTimestampMs = usecToMs(readStat(kPrefix + "last_hibern8_enter_time"));
-
-    residencies->emplace(UFS_NAME, std::vector<StateResidency>{residency});
-    return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> UfsStateResidencyDataProvider::getInfo() {
-    return {{UFS_NAME, std::vector<State>{{HIBERNATE_STATE_ID, "HIBERN8"}} }};
-}
-
-int64_t UfsStateResidencyDataProvider::readStat(std::string path) {
-    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(path.c_str(), "r"), fclose);
-    if (!fp) {
-        PLOG(ERROR) << __func__ << ":Failed to open file " << path
-                    << " Error = " << strerror(errno);
-        return 0;
-    }
-    const size_t size = 20;
-    char buf[size];
-    (void)fread(&buf, sizeof(char), size, fp.get());
-    int64_t ret;
-    if (!ParseInt(Trim(std::string(buf)), &ret)) {
-        LOG(ERROR) << "Failed to parse int64 from [" << std::string(buf) << "]";
-    }
-    return ret;
-}
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/powerstats/UfsStateResidencyDataProvider.h b/powerstats/UfsStateResidencyDataProvider.h
deleted file mode 100644
index f4ef268..0000000
--- a/powerstats/UfsStateResidencyDataProvider.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#pragma once
-
-#include <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class UfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
-  public:
-    UfsStateResidencyDataProvider(std::string prefix);
-    ~UfsStateResidencyDataProvider() = default;
-
-    /*
-     * See IStateResidencyDataProvider::getStateResidencies
-     */
-    bool getStateResidencies(
-        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
-    /*
-     * See IStateResidencyDataProvider::getInfo
-     */
-    std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
-  private:
-    int64_t readStat(std::string path);
-
-    const std::string kPrefix;
-};
-
-}  // namespace stats
-}  // namespace power
-}  // namespace hardware
-}  // namespace android
-}  // namespace aidl
diff --git a/radio/config/Pixel_Default.cfg b/radio/config/Pixel_Default.cfg
new file mode 100644
index 0000000..b1a83fd
--- /dev/null
+++ b/radio/config/Pixel_Default.cfg
@@ -0,0 +1 @@
+Pixel_Default.nprf,Pixel_Default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/Pixel_Default.nprf b/radio/config/Pixel_Default.nprf
new file mode 100644
index 0000000..76406e4
--- /dev/null
+++ b/radio/config/Pixel_Default.nprf
Binary files differ
diff --git a/radio/config/Pixel_Default_metrics.xml b/radio/config/Pixel_Default_metrics.xml
new file mode 100644
index 0000000..2549946
--- /dev/null
+++ b/radio/config/Pixel_Default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+  <ITEM NAME="COMMON">
+    <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+  </ITEM>
+  <ITEM NAME="LTE">
+    <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="EDGE">
+    <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="HSPA">
+    <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="true"></ITEM>
+    <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="true"></ITEM>
+    <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="true"></ITEM>
+    <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="CDMA">
+    <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+  </ITEM>
+</NODE>
diff --git a/radio/config/Pixel_stability.cfg b/radio/config/Pixel_stability.cfg
new file mode 100644
index 0000000..db01dd1
--- /dev/null
+++ b/radio/config/Pixel_stability.cfg
@@ -0,0 +1 @@
+Pixel_stability.nprf,Pixel_Default_metrics.xml
diff --git a/radio/config/Pixel_stability.nprf b/radio/config/Pixel_stability.nprf
new file mode 100644
index 0000000..327b8f1
--- /dev/null
+++ b/radio/config/Pixel_stability.nprf
Binary files differ
diff --git a/radio/config/default.cfg b/radio/config/default.cfg
new file mode 100644
index 0000000..58f9cd3
--- /dev/null
+++ b/radio/config/default.cfg
@@ -0,0 +1 @@
+default.nprf,default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/default.nprf b/radio/config/default.nprf
new file mode 100644
index 0000000..e9b3199
--- /dev/null
+++ b/radio/config/default.nprf
Binary files differ
diff --git a/radio/config/default_NAS_RRC.cfg b/radio/config/default_NAS_RRC.cfg
new file mode 100644
index 0000000..2cd3df2
--- /dev/null
+++ b/radio/config/default_NAS_RRC.cfg
@@ -0,0 +1 @@
+default_NAS_RRC.nprf,default_metrics.xml
diff --git a/radio/config/default_NAS_RRC.nprf b/radio/config/default_NAS_RRC.nprf
new file mode 100644
index 0000000..351827f
--- /dev/null
+++ b/radio/config/default_NAS_RRC.nprf
Binary files differ
diff --git a/radio/config/default_metrics.xml b/radio/config/default_metrics.xml
new file mode 100644
index 0000000..5a54933
--- /dev/null
+++ b/radio/config/default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+  <ITEM NAME="COMMON">
+    <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+  </ITEM>
+  <ITEM NAME="LTE">
+    <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="EDGE">
+    <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="HSPA">
+    <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="CDMA">
+    <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+  </ITEM>
+</NODE>
diff --git a/radio/config/default_network.cfg b/radio/config/default_network.cfg
new file mode 100644
index 0000000..fbe5613
--- /dev/null
+++ b/radio/config/default_network.cfg
@@ -0,0 +1 @@
+default_network.nprf,default_metrics.xml
diff --git a/radio/config/default_network.nprf b/radio/config/default_network.nprf
new file mode 100644
index 0000000..f5152cf
--- /dev/null
+++ b/radio/config/default_network.nprf
Binary files differ
diff --git a/radio/config/default_stability.cfg b/radio/config/default_stability.cfg
new file mode 100644
index 0000000..6974dd6
--- /dev/null
+++ b/radio/config/default_stability.cfg
@@ -0,0 +1 @@
+default_stability.nprf,default_metrics.xml
diff --git a/radio/config/default_stability.nprf b/radio/config/default_stability.nprf
new file mode 100644
index 0000000..b9536a1
--- /dev/null
+++ b/radio/config/default_stability.nprf
Binary files differ
diff --git a/radio/config/logging.conf b/radio/config/logging.conf
new file mode 100644
index 0000000..d57c82a
--- /dev/null
+++ b/radio/config/logging.conf
@@ -0,0 +1 @@
+modem_logging_control START -o /data/vendor/radio/logs/always-on -n 10 -s 20 -m /vendor/etc/modem/default.cfg --enable_exmetric --enable_exmetric_internal
\ No newline at end of file
diff --git a/radio/config/teamfood_default.cfg b/radio/config/teamfood_default.cfg
new file mode 100644
index 0000000..608ba54
--- /dev/null
+++ b/radio/config/teamfood_default.cfg
@@ -0,0 +1 @@
+teamfood_default.nprf,teamfood_default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/teamfood_default.nprf b/radio/config/teamfood_default.nprf
new file mode 100644
index 0000000..9f3f1c5
--- /dev/null
+++ b/radio/config/teamfood_default.nprf
Binary files differ
diff --git a/radio/config/teamfood_default_metrics.xml b/radio/config/teamfood_default_metrics.xml
new file mode 100644
index 0000000..5a54933
--- /dev/null
+++ b/radio/config/teamfood_default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+  <ITEM NAME="COMMON">
+    <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+    <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+    <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+    <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+  </ITEM>
+  <ITEM NAME="LTE">
+    <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+    <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+    <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="EDGE">
+    <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+    <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="HSPA">
+    <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+    <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+  </ITEM>
+  <ITEM NAME="CDMA">
+    <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+    <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+  </ITEM>
+</NODE>
diff --git a/rro_overlays/WifiOverlay/res/values/config.xml b/rro_overlays/WifiOverlay/res/values/config.xml
index 4e5d4bf..1a7681e 100644
--- a/rro_overlays/WifiOverlay/res/values/config.xml
+++ b/rro_overlays/WifiOverlay/res/values/config.xml
@@ -132,4 +132,13 @@
     <bool translatable="false" name="config_wifiDefaultCoexAlgorithmEnabled">true</bool>
     <!-- Whether to use the explicit vendor HAL API: IWifiStaIface.setRoamingState for disabling fw roaming. -->
     <bool translatable="false" name="config_wifiUseHalApiToDisableFwRoaming">true</bool>
+
+    <!-- Indicate the driver doesn't support NL80211 Reg changed event -->
+    <bool translatable="false" name="config_wifiDriverSupportedNl80211RegChangedEvent">false</bool>
+
+    <!-- Indicate whether the verbose logging is always on -->
+    <!-- 0: verbose logging controlled by user
+         1: verbose logging on by default for userdebug
+         2: verbose logging on by default for all builds -->
+    <integer translatable="false" name="config_wifiVerboseLoggingAlwaysOnLevel">1</integer>
 </resources>
diff --git a/task_profiles.json b/task_profiles.json
index 773f986..4bcfe41 100644
--- a/task_profiles.json
+++ b/task_profiles.json
@@ -7,7 +7,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_ta",
+            "FilePath": "/proc/vendor_sched/set_task_group_ta",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -21,7 +22,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_cam",
+            "FilePath": "/proc/vendor_sched/set_task_group_cam",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -35,7 +37,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_cam_power",
+            "FilePath": "/proc/vendor_sched/set_task_group_cam_power",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam_power",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -49,7 +52,23 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_dex2oat",
+            "FilePath": "/proc/vendor_sched/set_task_group_dex2oat",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_dex2oat",
+            "Value": "<pid>",
+            "LogFailures": "false"
+          }
+        }
+      ]
+    },
+    {
+      "Name": "OtaPerformance",
+      "Actions": [
+        {
+          "Name": "WriteFile",
+          "Params":
+          {
+            "FilePath": "/proc/vendor_sched/set_task_group_ota",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_ota",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -102,7 +121,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_bg",
+            "FilePath": "/proc/vendor_sched/set_task_group_bg",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_bg",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -116,7 +136,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_sys",
+            "FilePath": "/proc/vendor_sched/set_task_group_sys",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_sys",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -130,7 +151,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_fg",
+            "FilePath": "/proc/vendor_sched/set_task_group_fg",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_fg",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -144,7 +166,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_ta",
+            "FilePath": "/proc/vendor_sched/set_task_group_ta",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -158,7 +181,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_nnapi",
+            "FilePath": "/proc/vendor_sched/set_task_group_nnapi",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_nnapi",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -172,7 +196,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_sysbg",
+            "FilePath": "/proc/vendor_sched/set_task_group_sysbg",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_sysbg",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -194,7 +219,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_sf",
+            "FilePath": "/proc/vendor_sched/set_task_group_sf",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_sf",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -216,7 +242,8 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/set_task_group_rt",
+            "FilePath": "/proc/vendor_sched/set_task_group_rt",
+            "ProcFilePath": "/proc/vendor_sched/set_proc_group_rt",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -230,7 +257,7 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/uclamp_fork_reset_set",
+            "FilePath": "/proc/vendor_sched/uclamp_fork_reset_set",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -244,7 +271,7 @@
           "Name": "WriteFile",
           "Params":
           {
-            "FilePath": "/sys/kernel/vendor_sched/uclamp_fork_reset_clear",
+            "FilePath": "/proc/vendor_sched/uclamp_fork_reset_clear",
             "Value": "<pid>",
             "LogFailures": "false"
           }
@@ -257,6 +284,10 @@
     {
       "Name": "Dex2OatBootComplete",
       "Profiles": [ "Dex2oatPerformance", "ProcessCapacityNormal", "LowIoPriority", "TimerSlackHigh" ]
+    },
+    {
+      "Name": "OtaProfiles",
+      "Profiles": [ "OtaPerformance", "ServiceCapacityLow", "LowIoPriority", "TimerSlackHigh" ]
     }
   ]
 }
diff --git a/telephony/user.mk b/telephony/user.mk
index 983a19a..f75596f 100644
--- a/telephony/user.mk
+++ b/telephony/user.mk
@@ -1,2 +1,2 @@
-PRODUCT_COPY_FILES += vendor/samsung_slsi/telephony/common/device/samsung/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh
+PRODUCT_COPY_FILES += vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device/samsung/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh
 BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/telephony/user/
diff --git a/usb/Usb.cpp b/usb/Usb.cpp
deleted file mode 100644
index caf4f57..0000000
--- a/usb/Usb.cpp
+++ /dev/null
@@ -1,938 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "android.hardware.usb@1.3-service.gs101"
-
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <assert.h>
-#include <dirent.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <chrono>
-#include <regex>
-#include <thread>
-#include <unordered_map>
-
-#include <cutils/uevent.h>
-#include <sys/epoll.h>
-#include <utils/Errors.h>
-#include <utils/StrongPointer.h>
-
-#include "Usb.h"
-#include "UsbGadget.h"
-
-#include <aidl/android/frameworks/stats/IStats.h>
-#include <pixelstats/StatsHelper.h>
-
-using aidl::android::frameworks::stats::IStats;
-using android::base::GetProperty;
-using android::hardware::google::pixel::getStatsService;
-using android::hardware::google::pixel::PixelAtoms::VendorUsbPortOverheat;
-using android::hardware::google::pixel::reportUsbPortOverheat;
-
-namespace android {
-namespace hardware {
-namespace usb {
-namespace V1_3 {
-namespace implementation {
-
-Return<bool> Usb::enableUsbDataSignal(bool enable) {
-    bool result = true;
-
-    ALOGI("Userspace turn %s USB data signaling", enable ? "on" : "off");
-
-    if(enable) {
-        if (!WriteStringToFile("1", USB_DATA_PATH)) {
-            ALOGE("Not able to turn on usb connection notification");
-            result = false;
-        }
-
-        if(!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
-            ALOGE("Gadget cannot be pulled up");
-            result = false;
-        }
-    }
-    else {
-        if (!WriteStringToFile("1", ID_PATH)) {
-            ALOGE("Not able to turn off host mode");
-            result = false;
-        }
-
-        if (!WriteStringToFile("0", VBUS_PATH)) {
-            ALOGE("Not able to set Vbus state");
-            result = false;
-        }
-
-        if (!WriteStringToFile("0", USB_DATA_PATH)) {
-            ALOGE("Not able to turn off usb connection notification");
-            result = false;
-        }
-
-        if(!WriteStringToFile("none", PULLUP_PATH)) {
-            ALOGE("Gadget cannot be pulled down");
-            result = false;
-        }
-    }
-
-    return result;
-}
-
-// Set by the signal handler to destroy the thread
-volatile bool destroyThread;
-
-std::string enabledPath;
-constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
-constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
-constexpr char kContaminantDetectionPath[] = "i2c-max77759tcpc/contaminant_detection";
-constexpr char kStatusPath[] = "i2c-max77759tcpc/contaminant_detection_status";
-constexpr char kTypecPath[] = "/sys/class/typec";
-constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
-constexpr char kOverheatStatsPath[] = "/sys/devices/platform/google,usbc_port_cooling_dev/";
-constexpr char kOverheatStatsDev[] = "DRIVER=google,usbc_port_cooling_dev";
-constexpr char kThermalZoneForTrip[] = "VIRTUAL-USB-THROTTLING";
-constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
-constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
-constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
-constexpr int kSamplingIntervalSec = 5;
-
-int32_t readFile(const std::string &filename, std::string *contents) {
-    FILE *fp;
-    ssize_t read = 0;
-    char *line = NULL;
-    size_t len = 0;
-
-    fp = fopen(filename.c_str(), "r");
-    if (fp != NULL) {
-        if ((read = getline(&line, &len, fp)) != -1) {
-            char *pos;
-            if ((pos = strchr(line, '\n')) != NULL)
-                *pos = '\0';
-            *contents = line;
-        }
-        free(line);
-        fclose(fp);
-        return 0;
-    } else {
-        ALOGE("fopen failed");
-    }
-
-    return -1;
-}
-
-int32_t writeFile(const std::string &filename, const std::string &contents) {
-    FILE *fp;
-    std::string written;
-
-    fp = fopen(filename.c_str(), "w");
-    if (fp != NULL) {
-        // FAILURE RETRY
-        int ret = fputs(contents.c_str(), fp);
-        fclose(fp);
-        if ((ret != EOF) && !readFile(filename, &written) && written == contents)
-            return 0;
-    }
-    return -1;
-}
-
-Status getContaminantDetectionNamesHelper(std::string *name) {
-    DIR *dp;
-
-    dp = opendir(kHsi2cPath);
-    if (dp != NULL) {
-        struct dirent *ep;
-
-        while ((ep = readdir(dp))) {
-            if (ep->d_type == DT_DIR) {
-                if (std::string::npos != std::string(ep->d_name).find("i2c-")) {
-                    std::strtok(ep->d_name, "-");
-                    *name = std::strtok(NULL, "-");
-                }
-            }
-        }
-        closedir(dp);
-        return Status::SUCCESS;
-    }
-
-    ALOGE("Failed to open %s", kHsi2cPath);
-    return Status::ERROR;
-}
-
-Status queryMoistureDetectionStatus(hidl_vec<PortStatus> *currentPortStatus_1_2) {
-    std::string enabled, status, path, DetectedPath;
-
-    if (currentPortStatus_1_2 == NULL || currentPortStatus_1_2->size() == 0) {
-        ALOGE("currentPortStatus_1_2 is not available");
-        return Status::ERROR;
-    }
-
-    (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes = 0;
-    (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes |=
-        V1_2::ContaminantProtectionMode::FORCE_SINK;
-    (*currentPortStatus_1_2)[0].contaminantProtectionStatus = V1_2::ContaminantProtectionStatus::NONE;
-    (*currentPortStatus_1_2)[0].contaminantDetectionStatus = V1_2::ContaminantDetectionStatus::DISABLED;
-    (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceDetection = true;
-    (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceProtection = false;
-
-    getContaminantDetectionNamesHelper(&path);
-    enabledPath = kI2CPath + path + "/" + kContaminantDetectionPath;
-    if (readFile(enabledPath, &enabled)) {
-        ALOGE("Failed to open moisture_detection_enabled");
-        return Status::ERROR;
-    }
-
-    if (enabled == "1") {
-        DetectedPath = kI2CPath + path + "/" + kStatusPath;
-        if (readFile(DetectedPath, &status)) {
-            ALOGE("Failed to open moisture_detected");
-            return Status::ERROR;
-        }
-        if (status == "1") {
-            (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
-                V1_2::ContaminantDetectionStatus::DETECTED;
-            (*currentPortStatus_1_2)[0].contaminantProtectionStatus =
-                V1_2::ContaminantProtectionStatus::FORCE_SINK;
-        } else
-            (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
-                V1_2::ContaminantDetectionStatus::NOT_DETECTED;
-    }
-
-     ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
-           (*currentPortStatus_1_2)[0].contaminantDetectionStatus,
-           (*currentPortStatus_1_2)[0].contaminantProtectionStatus);
-
-    return Status::SUCCESS;
-}
-
-std::string appendRoleNodeHelper(const std::string &portName, PortRoleType type) {
-    std::string node("/sys/class/typec/" + portName);
-
-    switch (type) {
-        case PortRoleType::DATA_ROLE:
-            return node + "/data_role";
-        case PortRoleType::POWER_ROLE:
-            return node + "/power_role";
-        case PortRoleType::MODE:
-            return node + "/port_type";
-        default:
-            return "";
-    }
-}
-
-std::string convertRoletoString(PortRole role) {
-    if (role.type == PortRoleType::POWER_ROLE) {
-        if (role.role == static_cast<uint32_t>(PortPowerRole::SOURCE))
-            return "source";
-        else if (role.role == static_cast<uint32_t>(PortPowerRole::SINK))
-            return "sink";
-    } else if (role.type == PortRoleType::DATA_ROLE) {
-        if (role.role == static_cast<uint32_t>(PortDataRole::HOST))
-            return "host";
-        if (role.role == static_cast<uint32_t>(PortDataRole::DEVICE))
-            return "device";
-    } else if (role.type == PortRoleType::MODE) {
-        if (role.role == static_cast<uint32_t>(PortMode_1_1::UFP))
-            return "sink";
-        if (role.role == static_cast<uint32_t>(PortMode_1_1::DFP))
-            return "source";
-    }
-    return "none";
-}
-
-void extractRole(std::string *roleName) {
-    std::size_t first, last;
-
-    first = roleName->find("[");
-    last = roleName->find("]");
-
-    if (first != std::string::npos && last != std::string::npos) {
-        *roleName = roleName->substr(first + 1, last - first - 1);
-    }
-}
-
-void switchToDrp(const std::string &portName) {
-    std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), PortRoleType::MODE);
-    FILE *fp;
-
-    if (filename != "") {
-        fp = fopen(filename.c_str(), "w");
-        if (fp != NULL) {
-            int ret = fputs("dual", fp);
-            fclose(fp);
-            if (ret == EOF)
-                ALOGE("Fatal: Error while switching back to drp");
-        } else {
-            ALOGE("Fatal: Cannot open file to switch back to drp");
-        }
-    } else {
-        ALOGE("Fatal: invalid node type");
-    }
-}
-
-bool switchMode(const hidl_string &portName, const PortRole &newRole, struct Usb *usb) {
-    std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), newRole.type);
-    std::string written;
-    FILE *fp;
-    bool roleSwitch = false;
-
-    if (filename == "") {
-        ALOGE("Fatal: invalid node type");
-        return false;
-    }
-
-    fp = fopen(filename.c_str(), "w");
-    if (fp != NULL) {
-        // Hold the lock here to prevent loosing connected signals
-        // as once the file is written the partner added signal
-        // can arrive anytime.
-        pthread_mutex_lock(&usb->mPartnerLock);
-        usb->mPartnerUp = false;
-        int ret = fputs(convertRoletoString(newRole).c_str(), fp);
-        fclose(fp);
-
-        if (ret != EOF) {
-            struct timespec to;
-            struct timespec now;
-
-        wait_again:
-            clock_gettime(CLOCK_MONOTONIC, &now);
-            to.tv_sec = now.tv_sec + PORT_TYPE_TIMEOUT;
-            to.tv_nsec = now.tv_nsec;
-
-            int err = pthread_cond_timedwait(&usb->mPartnerCV, &usb->mPartnerLock, &to);
-            // There are no uevent signals which implies role swap timed out.
-            if (err == ETIMEDOUT) {
-                ALOGI("uevents wait timedout");
-                // Validity check.
-            } else if (!usb->mPartnerUp) {
-                goto wait_again;
-                // Role switch succeeded since usb->mPartnerUp is true.
-            } else {
-                roleSwitch = true;
-            }
-        } else {
-            ALOGI("Role switch failed while wrting to file");
-        }
-        pthread_mutex_unlock(&usb->mPartnerLock);
-    }
-
-    if (!roleSwitch)
-        switchToDrp(std::string(portName.c_str()));
-
-    return roleSwitch;
-}
-
-Usb::Usb()
-    : mLock(PTHREAD_MUTEX_INITIALIZER),
-      mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
-      mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
-      mPartnerUp(false),
-      mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip,
-                         ThrottlingSeverity::CRITICAL),
-                {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary,
-                          ThrottlingSeverity::NONE),
-                 ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary1,
-                          ThrottlingSeverity::NONE),
-                 ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2,
-                          ThrottlingSeverity::NONE)}, kSamplingIntervalSec) {
-    pthread_condattr_t attr;
-    if (pthread_condattr_init(&attr)) {
-        ALOGE("pthread_condattr_init failed: %s", strerror(errno));
-        abort();
-    }
-    if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
-        ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
-        abort();
-    }
-    if (pthread_cond_init(&mPartnerCV, &attr)) {
-        ALOGE("pthread_cond_init failed: %s", strerror(errno));
-        abort();
-    }
-    if (pthread_condattr_destroy(&attr)) {
-        ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
-        abort();
-    }
-}
-
-Return<void> Usb::switchRole(const hidl_string &portName, const V1_0::PortRole &newRole) {
-    std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), newRole.type);
-    std::string written;
-    FILE *fp;
-    bool roleSwitch = false;
-
-    if (filename == "") {
-        ALOGE("Fatal: invalid node type");
-        return Void();
-    }
-
-    pthread_mutex_lock(&mRoleSwitchLock);
-
-    ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(newRole).c_str());
-
-    if (newRole.type == PortRoleType::MODE) {
-        roleSwitch = switchMode(portName, newRole, this);
-    } else {
-        fp = fopen(filename.c_str(), "w");
-        if (fp != NULL) {
-            int ret = fputs(convertRoletoString(newRole).c_str(), fp);
-            fclose(fp);
-            if ((ret != EOF) && !readFile(filename, &written)) {
-                extractRole(&written);
-                ALOGI("written: %s", written.c_str());
-                if (written == convertRoletoString(newRole)) {
-                    roleSwitch = true;
-                } else {
-                    ALOGE("Role switch failed");
-                }
-            } else {
-                ALOGE("failed to update the new role");
-            }
-        } else {
-            ALOGE("fopen failed");
-        }
-    }
-
-    pthread_mutex_lock(&mLock);
-    if (mCallback_1_0 != NULL) {
-        Return<void> ret = mCallback_1_0->notifyRoleSwitchStatus(
-            portName, newRole, roleSwitch ? Status::SUCCESS : Status::ERROR);
-        if (!ret.isOk())
-            ALOGE("RoleSwitchStatus error %s", ret.description().c_str());
-    } else {
-        ALOGE("Not notifying the userspace. Callback is not set");
-    }
-    pthread_mutex_unlock(&mLock);
-    pthread_mutex_unlock(&mRoleSwitchLock);
-
-    return Void();
-}
-
-Status getAccessoryConnected(const std::string &portName, std::string *accessory) {
-    std::string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
-
-    if (readFile(filename, accessory)) {
-        ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
-        return Status::ERROR;
-    }
-
-    return Status::SUCCESS;
-}
-
-Status getCurrentRoleHelper(const std::string &portName, bool connected, PortRoleType type,
-                            uint32_t *currentRole) {
-    std::string filename;
-    std::string roleName;
-    std::string accessory;
-
-    // Mode
-
-    if (type == PortRoleType::POWER_ROLE) {
-        filename = "/sys/class/typec/" + portName + "/power_role";
-        *currentRole = static_cast<uint32_t>(PortPowerRole::NONE);
-    } else if (type == PortRoleType::DATA_ROLE) {
-        filename = "/sys/class/typec/" + portName + "/data_role";
-        *currentRole = static_cast<uint32_t>(PortDataRole::NONE);
-    } else if (type == PortRoleType::MODE) {
-        filename = "/sys/class/typec/" + portName + "/data_role";
-        *currentRole = static_cast<uint32_t>(PortMode_1_1::NONE);
-    } else {
-        return Status::ERROR;
-    }
-
-    if (!connected)
-        return Status::SUCCESS;
-
-    if (type == PortRoleType::MODE) {
-        if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
-            return Status::ERROR;
-        }
-        if (accessory == "analog_audio") {
-            *currentRole = static_cast<uint32_t>(PortMode_1_1::AUDIO_ACCESSORY);
-            return Status::SUCCESS;
-        } else if (accessory == "debug") {
-            *currentRole = static_cast<uint32_t>(PortMode_1_1::DEBUG_ACCESSORY);
-            return Status::SUCCESS;
-        }
-    }
-
-    if (readFile(filename, &roleName)) {
-        ALOGE("getCurrentRole: Failed to open filesystem node: %s", filename.c_str());
-        return Status::ERROR;
-    }
-
-    extractRole(&roleName);
-
-    if (roleName == "source") {
-        *currentRole = static_cast<uint32_t>(PortPowerRole::SOURCE);
-    } else if (roleName == "sink") {
-        *currentRole = static_cast<uint32_t>(PortPowerRole::SINK);
-    } else if (roleName == "host") {
-        if (type == PortRoleType::DATA_ROLE)
-            *currentRole = static_cast<uint32_t>(PortDataRole::HOST);
-        else
-            *currentRole = static_cast<uint32_t>(PortMode_1_1::DFP);
-    } else if (roleName == "device") {
-        if (type == PortRoleType::DATA_ROLE)
-            *currentRole = static_cast<uint32_t>(PortDataRole::DEVICE);
-        else
-            *currentRole = static_cast<uint32_t>(PortMode_1_1::UFP);
-    } else if (roleName != "none") {
-        /* case for none has already been addressed.
-         * so we check if the role isn't none.
-         */
-        return Status::UNRECOGNIZED_ROLE;
-    }
-
-    return Status::SUCCESS;
-}
-
-Status getTypeCPortNamesHelper(std::unordered_map<std::string, bool> *names) {
-    DIR *dp;
-
-    dp = opendir(kTypecPath);
-    if (dp != NULL) {
-        struct dirent *ep;
-
-        while ((ep = readdir(dp))) {
-            if (ep->d_type == DT_LNK) {
-                if (std::string::npos == std::string(ep->d_name).find("-partner")) {
-                    std::unordered_map<std::string, bool>::const_iterator portName =
-                        names->find(ep->d_name);
-                    if (portName == names->end()) {
-                        names->insert({ep->d_name, false});
-                    }
-                } else {
-                    (*names)[std::strtok(ep->d_name, "-")] = true;
-                }
-            }
-        }
-        closedir(dp);
-        return Status::SUCCESS;
-    }
-
-    ALOGE("Failed to open /sys/class/typec");
-    return Status::ERROR;
-}
-
-bool canSwitchRoleHelper(const std::string &portName, PortRoleType /*type*/) {
-    std::string filename = "/sys/class/typec/" + portName + "-partner/supports_usb_power_delivery";
-    std::string supportsPD;
-
-    if (!readFile(filename, &supportsPD)) {
-        if (supportsPD == "yes") {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-/*
- * Reuse the same method for both V1_0 and V1_1 callback objects.
- * The caller of this method would reconstruct the V1_0::PortStatus
- * object if required.
- */
-Status getPortStatusHelper(hidl_vec<PortStatus> *currentPortStatus_1_2, HALVersion version,
-                           android::hardware::usb::V1_3::implementation::Usb *usb) {
-    std::unordered_map<std::string, bool> names;
-    Status result = getTypeCPortNamesHelper(&names);
-    int i = -1;
-
-    if (result == Status::SUCCESS) {
-        currentPortStatus_1_2->resize(names.size());
-        for (std::pair<std::string, bool> port : names) {
-            i++;
-            ALOGI("%s", port.first.c_str());
-            (*currentPortStatus_1_2)[i].status_1_1.status.portName = port.first;
-
-            uint32_t currentRole;
-            if (getCurrentRoleHelper(port.first, port.second, PortRoleType::POWER_ROLE,
-                                     &currentRole) == Status::SUCCESS) {
-                (*currentPortStatus_1_2)[i].status_1_1.status.currentPowerRole =
-                    static_cast<PortPowerRole>(currentRole);
-            } else {
-                ALOGE("Error while retrieving portNames");
-                goto done;
-            }
-
-            if (getCurrentRoleHelper(port.first, port.second, PortRoleType::DATA_ROLE,
-                                     &currentRole) == Status::SUCCESS) {
-                (*currentPortStatus_1_2)[i].status_1_1.status.currentDataRole =
-                    static_cast<PortDataRole>(currentRole);
-            } else {
-                ALOGE("Error while retrieving current port role");
-                goto done;
-            }
-
-            if (getCurrentRoleHelper(port.first, port.second, PortRoleType::MODE, &currentRole) ==
-                Status::SUCCESS) {
-                (*currentPortStatus_1_2)[i].status_1_1.currentMode =
-                    static_cast<PortMode_1_1>(currentRole);
-                (*currentPortStatus_1_2)[i].status_1_1.status.currentMode =
-                    static_cast<V1_0::PortMode>(currentRole);
-            } else {
-                ALOGE("Error while retrieving current data role");
-                goto done;
-            }
-
-            (*currentPortStatus_1_2)[i].status_1_1.status.canChangeMode = true;
-            (*currentPortStatus_1_2)[i].status_1_1.status.canChangeDataRole =
-                port.second ? canSwitchRoleHelper(port.first, PortRoleType::DATA_ROLE) : false;
-            (*currentPortStatus_1_2)[i].status_1_1.status.canChangePowerRole =
-                port.second ? canSwitchRoleHelper(port.first, PortRoleType::POWER_ROLE) : false;
-
-            if (version == HALVersion::V1_0) {
-                ALOGI("HAL version V1_0");
-                (*currentPortStatus_1_2)[i].status_1_1.status.supportedModes = V1_0::PortMode::DRP;
-            } else {
-                if (version == HALVersion::V1_1)
-                    ALOGI("HAL version V1_1");
-                else
-                    ALOGI("HAL version V1_2");
-                (*currentPortStatus_1_2)[i].status_1_1.supportedModes = 0 | PortMode_1_1::DRP;
-                (*currentPortStatus_1_2)[i].status_1_1.status.supportedModes = V1_0::PortMode::NONE;
-                (*currentPortStatus_1_2)[i].status_1_1.status.currentMode = V1_0::PortMode::NONE;
-            }
-
-            // Query temperature for the first connect
-            if (port.second && !usb->mPluggedTemperatureCelsius) {
-                usb->mOverheat.getCurrentTemperature(kThermalZoneForTempReadPrimary,
-                    &usb->mPluggedTemperatureCelsius);
-                ALOGV("USB Initial temperature: %f", usb->mPluggedTemperatureCelsius);
-            }
-            ALOGI(
-                "%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d "
-                "supportedModes:%d",
-                i, port.first.c_str(), port.second,
-                (*currentPortStatus_1_2)[i].status_1_1.status.canChangeMode,
-                (*currentPortStatus_1_2)[i].status_1_1.status.canChangeDataRole,
-                (*currentPortStatus_1_2)[i].status_1_1.status.canChangePowerRole,
-                (*currentPortStatus_1_2)[i].status_1_1.supportedModes);
-        }
-        return Status::SUCCESS;
-    }
-done:
-    return Status::ERROR;
-}
-
-void queryVersionHelper(android::hardware::usb::V1_3::implementation::Usb *usb,
-                        hidl_vec<PortStatus> *currentPortStatus_1_2) {
-    hidl_vec<V1_1::PortStatus_1_1> currentPortStatus_1_1;
-    hidl_vec<V1_0::PortStatus> currentPortStatus;
-    Status status;
-    sp<V1_1::IUsbCallback> callback_V1_1 = V1_1::IUsbCallback::castFrom(usb->mCallback_1_0);
-    sp<IUsbCallback> callback_V1_2 = IUsbCallback::castFrom(usb->mCallback_1_0);
-
-    pthread_mutex_lock(&usb->mLock);
-    if (usb->mCallback_1_0 != NULL) {
-        if (callback_V1_2 != NULL) {
-            status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_2, usb);
-            if (status == Status::SUCCESS)
-                queryMoistureDetectionStatus(currentPortStatus_1_2);
-        } else if (callback_V1_1 != NULL) {
-            status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_1, usb);
-            currentPortStatus_1_1.resize(currentPortStatus_1_2->size());
-            for (unsigned long i = 0; i < currentPortStatus_1_2->size(); i++)
-                currentPortStatus_1_1[i] = (*currentPortStatus_1_2)[i].status_1_1;
-        } else {
-            status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_0, usb);
-            currentPortStatus.resize(currentPortStatus_1_2->size());
-            for (unsigned long i = 0; i < currentPortStatus_1_2->size(); i++)
-                currentPortStatus[i] = (*currentPortStatus_1_2)[i].status_1_1.status;
-        }
-
-        Return<void> ret;
-
-        if (callback_V1_2 != NULL)
-            ret = callback_V1_2->notifyPortStatusChange_1_2(*currentPortStatus_1_2, status);
-        else if (callback_V1_1 != NULL)
-            ret = callback_V1_1->notifyPortStatusChange_1_1(currentPortStatus_1_1, status);
-        else
-            ret = usb->mCallback_1_0->notifyPortStatusChange(currentPortStatus, status);
-
-        if (!ret.isOk())
-            ALOGE("queryPortStatus_1_2 error %s", ret.description().c_str());
-    } else {
-        ALOGI("Notifying userspace skipped. Callback is NULL");
-    }
-    pthread_mutex_unlock(&usb->mLock);
-}
-
-Return<void> Usb::queryPortStatus() {
-    hidl_vec<PortStatus> currentPortStatus_1_2;
-
-    queryVersionHelper(this, &currentPortStatus_1_2);
-    return Void();
-}
-
-Return<void> Usb::enableContaminantPresenceDetection(const hidl_string & /*portName*/,
-                                                     bool enable) {
-
-    std::string disable = GetProperty(kDisableContatminantDetection, "");
-
-    if (disable != "true")
-        writeFile(enabledPath, enable ? "1" : "0");
-
-    hidl_vec<PortStatus> currentPortStatus_1_2;
-
-    queryVersionHelper(this, &currentPortStatus_1_2);
-    return Void();
-}
-
-Return<void> Usb::enableContaminantPresenceProtection(const hidl_string & /*portName*/,
-                                                      bool /*enable*/) {
-    hidl_vec<PortStatus> currentPortStatus_1_2;
-
-    queryVersionHelper(this, &currentPortStatus_1_2);
-    return Void();
-}
-
-void report_overheat_event(android::hardware::usb::V1_3::implementation::Usb *usb) {
-    VendorUsbPortOverheat overheat_info;
-    std::string contents;
-
-    overheat_info.set_plug_temperature_deci_c(usb->mPluggedTemperatureCelsius * 10);
-    overheat_info.set_max_temperature_deci_c(usb->mOverheat.getMaxOverheatTemperature() * 10);
-    if (ReadFileToString(std::string(kOverheatStatsPath) + "trip_time", &contents)) {
-        overheat_info.set_time_to_overheat_secs(stoi(contents));
-    } else {
-        ALOGE("Unable to read trip_time");
-        return;
-    }
-    if (ReadFileToString(std::string(kOverheatStatsPath) + "hysteresis_time", &contents)) {
-        overheat_info.set_time_to_hysteresis_secs(stoi(contents));
-    } else {
-        ALOGE("Unable to read hysteresis_time");
-        return;
-    }
-    if (ReadFileToString(std::string(kOverheatStatsPath) + "cleared_time", &contents)) {
-        overheat_info.set_time_to_inactive_secs(stoi(contents));
-    } else {
-        ALOGE("Unable to read cleared_time");
-        return;
-    }
-
-    const std::shared_ptr<IStats> stats_client = getStatsService();
-    if (!stats_client) {
-        ALOGE("Unable to get AIDL Stats service");
-    } else {
-        reportUsbPortOverheat(stats_client, overheat_info);
-    }
-}
-
-struct data {
-    int uevent_fd;
-    android::hardware::usb::V1_3::implementation::Usb *usb;
-};
-
-static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
-    char msg[UEVENT_MSG_LEN + 2];
-    char *cp;
-    int n;
-
-    n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
-    if (n <= 0)
-        return;
-    if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
-        return;
-
-    msg[n] = '\0';
-    msg[n + 1] = '\0';
-    cp = msg;
-
-    while (*cp) {
-        if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) {
-            ALOGI("partner added");
-            pthread_mutex_lock(&payload->usb->mPartnerLock);
-            payload->usb->mPartnerUp = true;
-            pthread_cond_signal(&payload->usb->mPartnerCV);
-            pthread_mutex_unlock(&payload->usb->mPartnerLock);
-            // Update Plugged temperature
-            payload->usb->mOverheat.getCurrentTemperature(kThermalZoneForTempReadPrimary,
-                    &payload->usb->mPluggedTemperatureCelsius);
-            ALOGI("Usb Plugged temp: %f", payload->usb->mPluggedTemperatureCelsius);
-        } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
-                   !strncmp(cp, "DRIVER=max77759tcpc",
-                            strlen("DRIVER=max77759tcpc"))) {
-            hidl_vec<PortStatus> currentPortStatus_1_2;
-            queryVersionHelper(payload->usb, &currentPortStatus_1_2);
-
-            // Role switch is not in progress and port is in disconnected state
-            if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
-                for (unsigned long i = 0; i < currentPortStatus_1_2.size(); i++) {
-                    DIR *dp =
-                        opendir(std::string("/sys/class/typec/" +
-                                            std::string(currentPortStatus_1_2[i]
-                                                            .status_1_1.status.portName.c_str()) +
-                                            "-partner")
-                                    .c_str());
-                    if (dp == NULL) {
-                        // PortRole role = {.role = static_cast<uint32_t>(PortMode::UFP)};
-                        switchToDrp(currentPortStatus_1_2[i].status_1_1.status.portName);
-                    } else {
-                        closedir(dp);
-                    }
-                }
-                pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
-            }
-            break;
-        } else if (!strncmp(cp, kOverheatStatsDev, strlen(kOverheatStatsDev))) {
-            ALOGV("Overheat Cooling device suez update");
-            report_overheat_event(payload->usb);
-        }
-        /* advance to after the next \0 */
-        while (*cp++) {
-        }
-    }
-}
-
-void *work(void *param) {
-    int epoll_fd, uevent_fd;
-    struct epoll_event ev;
-    int nevents = 0;
-    struct data payload;
-
-    ALOGE("creating thread");
-
-    uevent_fd = uevent_open_socket(64 * 1024, true);
-
-    if (uevent_fd < 0) {
-        ALOGE("uevent_init: uevent_open_socket failed\n");
-        return NULL;
-    }
-
-    payload.uevent_fd = uevent_fd;
-    payload.usb = (android::hardware::usb::V1_3::implementation::Usb *)param;
-
-    fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
-
-    ev.events = EPOLLIN;
-    ev.data.ptr = (void *)uevent_event;
-
-    epoll_fd = epoll_create(64);
-    if (epoll_fd == -1) {
-        ALOGE("epoll_create failed; errno=%d", errno);
-        goto error;
-    }
-
-    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
-        ALOGE("epoll_ctl failed; errno=%d", errno);
-        goto error;
-    }
-
-    while (!destroyThread) {
-        struct epoll_event events[64];
-
-        nevents = epoll_wait(epoll_fd, events, 64, -1);
-        if (nevents == -1) {
-            if (errno == EINTR)
-                continue;
-            ALOGE("usb epoll_wait failed; errno=%d", errno);
-            break;
-        }
-
-        for (int n = 0; n < nevents; ++n) {
-            if (events[n].data.ptr)
-                (*(void (*)(int, struct data *payload))events[n].data.ptr)(events[n].events,
-                                                                           &payload);
-        }
-    }
-
-    ALOGI("exiting worker thread");
-error:
-    close(uevent_fd);
-
-    if (epoll_fd >= 0)
-        close(epoll_fd);
-
-    return NULL;
-}
-
-void sighandler(int sig) {
-    if (sig == SIGUSR1) {
-        destroyThread = true;
-        ALOGI("destroy set");
-        return;
-    }
-    signal(SIGUSR1, sighandler);
-}
-
-Return<void> Usb::setCallback(const sp<V1_0::IUsbCallback> &callback) {
-    sp<V1_1::IUsbCallback> callback_V1_1 = V1_1::IUsbCallback::castFrom(callback);
-    sp<IUsbCallback> callback_V1_2 = IUsbCallback::castFrom(callback);
-
-    if (callback != NULL) {
-        if (callback_V1_2 != NULL)
-            ALOGI("Registering 1.2 callback");
-        else if (callback_V1_1 != NULL)
-            ALOGI("Registering 1.1 callback");
-    }
-
-    pthread_mutex_lock(&mLock);
-    /*
-     * When both the old callback and new callback values are NULL,
-     * there is no need to spin off the worker thread.
-     * When both the values are not NULL, we would already have a
-     * worker thread running, so updating the callback object would
-     * be suffice.
-     */
-    if ((mCallback_1_0 == NULL && callback == NULL) ||
-        (mCallback_1_0 != NULL && callback != NULL)) {
-        /*
-         * Always store as V1_0 callback object. Type cast to V1_1
-         * when the callback is actually invoked.
-         */
-        mCallback_1_0 = callback;
-        pthread_mutex_unlock(&mLock);
-        return Void();
-    }
-
-    mCallback_1_0 = callback;
-    ALOGI("registering callback");
-
-    // Kill the worker thread if the new callback is NULL.
-    if (mCallback_1_0 == NULL) {
-        pthread_mutex_unlock(&mLock);
-        if (!pthread_kill(mPoll, SIGUSR1)) {
-            pthread_join(mPoll, NULL);
-            ALOGI("pthread destroyed");
-        }
-        return Void();
-    }
-
-    destroyThread = false;
-    signal(SIGUSR1, sighandler);
-
-    /*
-     * Create a background thread if the old callback value is NULL
-     * and being updated with a new value.
-     */
-    if (pthread_create(&mPoll, NULL, work, this)) {
-        ALOGE("pthread creation failed %d", errno);
-        mCallback_1_0 = NULL;
-    }
-
-    pthread_mutex_unlock(&mLock);
-    return Void();
-}
-
-}  // namespace implementation
-}  // namespace V1_3
-}  // namespace usb
-}  // namespace hardware
-}  // namespace android
diff --git a/usb/Usb.h b/usb/Usb.h
deleted file mode 100644
index 23ed011..0000000
--- a/usb/Usb.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android-base/file.h>
-#include <android/hardware/usb/1.3/IUsb.h>
-#include <android/hardware/usb/1.2/types.h>
-#include <android/hardware/usb/1.2/IUsbCallback.h>
-#include <hidl/Status.h>
-#include <pixelusb/UsbOverheatEvent.h>
-#include <utils/Log.h>
-
-#define UEVENT_MSG_LEN 2048
-// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
-// The -partner directory would not be created until this is done.
-// Having a margin of ~3 secs for the directory and other related bookeeping
-// structures created and uvent fired.
-#define PORT_TYPE_TIMEOUT 8
-
-namespace android {
-namespace hardware {
-namespace usb {
-namespace V1_3 {
-namespace implementation {
-
-using ::android::base::WriteStringToFile;
-using ::android::base::ReadFileToString;
-using ::android::hardware::hidl_array;
-using ::android::hardware::hidl_memory;
-using ::android::hardware::hidl_string;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::google::pixel::usb::UsbOverheatEvent;
-using ::android::hardware::google::pixel::usb::ZoneInfo;
-using ::android::hardware::thermal::V2_0::TemperatureType;
-using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
-using ::android::hardware::usb::V1_0::PortRole;
-using ::android::hardware::usb::V1_0::PortRoleType;
-using ::android::hardware::usb::V1_0::PortDataRole;
-using ::android::hardware::usb::V1_0::PortPowerRole;
-using ::android::hardware::usb::V1_0::PortRole;
-using ::android::hardware::usb::V1_0::PortRoleType;
-using ::android::hardware::usb::V1_0::Status;
-using ::android::hardware::usb::V1_3::IUsb;
-using ::android::hardware::usb::V1_2::IUsbCallback;
-using ::android::hardware::usb::V1_2::PortStatus;
-using ::android::hardware::usb::V1_1::PortMode_1_1;
-using ::android::hardware::usb::V1_1::PortStatus_1_1;
-using ::android::hidl::base::V1_0::DebugInfo;
-using ::android::hidl::base::V1_0::IBase;
-using ::android::sp;
-
-enum class HALVersion{
-    V1_0,
-    V1_1,
-    V1_2,
-    V1_3
-};
-
-constexpr char kGadgetName[] = "11110000.dwc3";
-#define NEW_UDC_PATH "/sys/devices/platform/11110000.usb/"
-
-#define ID_PATH NEW_UDC_PATH "dwc3_exynos_otg_id"
-#define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess"
-#define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled"
-
-struct Usb : public IUsb {
-    Usb();
-
-    Return<void> switchRole(const hidl_string &portName, const PortRole &role) override;
-    Return<void> setCallback(const sp<V1_0::IUsbCallback>& callback) override;
-    Return<void> queryPortStatus() override;
-    Return<void> enableContaminantPresenceDetection(const hidl_string &portName, bool enable);
-    Return<void> enableContaminantPresenceProtection(const hidl_string &portName, bool enable);
-    Return<bool> enableUsbDataSignal(bool enable) override;
-
-    sp<V1_0::IUsbCallback> mCallback_1_0;
-    // Protects mCallback variable
-    pthread_mutex_t mLock;
-    // Protects roleSwitch operation
-    pthread_mutex_t mRoleSwitchLock;
-    // Threads waiting for the partner to come back wait here
-    pthread_cond_t mPartnerCV;
-    // lock protecting mPartnerCV
-    pthread_mutex_t mPartnerLock;
-    // Variable to signal partner coming back online after type switch
-    bool mPartnerUp;
-
-    // Usb Overheat object for push suez event
-    UsbOverheatEvent mOverheat;
-    // Temperature when connected
-    float mPluggedTemperatureCelsius;
-
-  private:
-    pthread_t mPoll;
-};
-
-}  // namespace implementation
-}  // namespace V1_3
-}  // namespace usb
-}  // namespace hardware
-}  // namespace android
diff --git a/usb/Android.bp b/usb/gadget/Android.bp
similarity index 67%
rename from usb/Android.bp
rename to usb/gadget/Android.bp
index 5aafe14..ab7ac32 100644
--- a/usb/Android.bp
+++ b/usb/gadget/Android.bp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2017 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -25,14 +25,13 @@
 }
 
 cc_binary {
-    name: "android.hardware.usb@1.3-service.gs101",
+    name: "android.hardware.usb.gadget-service.gs101",
     relative_install_path: "hw",
-    init_rc: ["android.hardware.usb@1.3-service.gs101.rc"],
+    init_rc: ["android.hardware.usb.gadget-service.gs101.rc"],
     vintf_fragments: [
-        "android.hardware.usb@1.3-service.gs101.xml",
         "android.hardware.usb.gadget@1.2-service.gs101.xml",
     ],
-    srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
+    srcs: ["service_gadget.cpp", "UsbGadget.cpp"],
     cflags: ["-Wall", "-Werror"],
     shared_libs: [
         "libbase",
@@ -41,27 +40,13 @@
         "liblog",
         "libutils",
         "libhardware",
-        "android.hardware.usb@1.0",
-        "android.hardware.usb@1.1",
-        "android.hardware.usb@1.2",
-        "android.hardware.usb@1.3",
         "android.hardware.usb.gadget@1.0",
         "android.hardware.usb.gadget@1.1",
         "android.hardware.usb.gadget@1.2",
-        "android.hardware.thermal@1.0",
-        "android.hardware.thermal@2.0",
         "libcutils",
-        "android.frameworks.stats-V1-ndk",
-        "pixelatoms-cpp",
-        "libbinder_ndk",
     ],
     static_libs: [
         "libpixelusb",
-        "libpixelstats",
-    ],
-    export_shared_lib_headers: [
-        "android.frameworks.stats-V1-ndk",
-        "pixelatoms-cpp",
     ],
     proprietary: true,
 }
diff --git a/usb/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
similarity index 100%
rename from usb/UsbGadget.cpp
rename to usb/gadget/UsbGadget.cpp
diff --git a/usb/UsbGadget.h b/usb/gadget/UsbGadget.h
similarity index 100%
rename from usb/UsbGadget.h
rename to usb/gadget/UsbGadget.h
diff --git a/usb/android.hardware.usb@1.3-service.gs101.rc b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
similarity index 94%
rename from usb/android.hardware.usb@1.3-service.gs101.rc
rename to usb/gadget/android.hardware.usb.gadget-service.gs101.rc
index 4112b4e..d0e355c 100644
--- a/usb/android.hardware.usb@1.3-service.gs101.rc
+++ b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
@@ -1,4 +1,4 @@
-service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.gs101
+service vendor.usb-gadget-hal-1-2 /vendor/bin/hw/android.hardware.usb.gadget-service.gs101
     class hal
     user system
     group system shell mtp wakelock
@@ -10,6 +10,8 @@
     chown root system /sys/class/typec/port0/port_type
     chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
     chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
     chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
     chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
     chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
diff --git a/usb/android.hardware.usb.gadget@1.2-service.gs101.xml b/usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
similarity index 100%
rename from usb/android.hardware.usb.gadget@1.2-service.gs101.xml
rename to usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
diff --git a/usb/service.cpp b/usb/gadget/service_gadget.cpp
similarity index 69%
rename from usb/service.cpp
rename to usb/gadget/service_gadget.cpp
index a4a30d2..d0908ee 100644
--- a/usb/service.cpp
+++ b/usb/gadget/service_gadget.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "android.hardware.usb@1.3-service.gs101"
+#define LOG_TAG "android.hardware.usb.gadget-service.gs101"
 
 #include <hidl/HidlTransportSupport.h>
-#include "Usb.h"
 #include "UsbGadget.h"
 
 using android::sp;
@@ -29,34 +28,23 @@
 // Generated HIDL files
 using android::hardware::usb::gadget::V1_2::IUsbGadget;
 using android::hardware::usb::gadget::V1_2::implementation::UsbGadget;
-using android::hardware::usb::V1_3::IUsb;
-using android::hardware::usb::V1_3::implementation::Usb;
 
 using android::OK;
 using android::status_t;
 
 int main() {
-    android::sp<IUsb> service = new Usb();
-    android::sp<IUsbGadget> service2 = new UsbGadget();
-
+    android::sp<IUsbGadget> service = new UsbGadget();
     configureRpcThreadpool(2, true /*callerWillJoin*/);
     status_t status = service->registerAsService();
 
     if (status != OK) {
-        ALOGE("Cannot register USB HAL service");
-        return 1;
-    }
-
-    status = service2->registerAsService();
-
-    if (status != OK) {
         ALOGE("Cannot register USB Gadget HAL service");
         return 1;
     }
 
-    ALOGI("USB HAL Ready.");
+    ALOGI("USB gadget HAL Ready.");
     joinRpcThreadpool();
     // Under noraml cases, execution will not reach this line.
-    ALOGI("USB HAL failed to join thread pool.");
+    ALOGI("USB gadget HAL failed to join thread pool.");
     return 1;
 }
diff --git a/usb/Android.bp b/usb/usb/Android.bp
similarity index 60%
copy from usb/Android.bp
copy to usb/usb/Android.bp
index 5aafe14..f0f5069 100644
--- a/usb/Android.bp
+++ b/usb/usb/Android.bp
@@ -1,5 +1,5 @@
 //
-// Copyright (C) 2017 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,28 +12,27 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+//
 
 package {
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+    // all of the 'license_kinds' from "device_google_gs101_license"
     // to get the below license kinds:
     //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: [
-        "//device/google/gs101:device_google_gs101_license",
-    ],
+    default_applicable_licenses: ["device_google_gs101_license"],
 }
 
 cc_binary {
-    name: "android.hardware.usb@1.3-service.gs101",
+    name: "android.hardware.usb-service.gs101",
     relative_install_path: "hw",
-    init_rc: ["android.hardware.usb@1.3-service.gs101.rc"],
-    vintf_fragments: [
-        "android.hardware.usb@1.3-service.gs101.xml",
-        "android.hardware.usb.gadget@1.2-service.gs101.xml",
+    init_rc: ["android.hardware.usb-service.rc"],
+    vintf_fragments: ["android.hardware.usb-service.xml"],
+    vendor: true,
+    srcs: [
+        "service.cpp",
+        "Usb.cpp",
     ],
-    srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
-    cflags: ["-Wall", "-Werror"],
     shared_libs: [
         "libbase",
         "libbinder",
@@ -41,19 +40,15 @@
         "liblog",
         "libutils",
         "libhardware",
-        "android.hardware.usb@1.0",
-        "android.hardware.usb@1.1",
-        "android.hardware.usb@1.2",
-        "android.hardware.usb@1.3",
-        "android.hardware.usb.gadget@1.0",
-        "android.hardware.usb.gadget@1.1",
-        "android.hardware.usb.gadget@1.2",
         "android.hardware.thermal@1.0",
         "android.hardware.thermal@2.0",
+	"android.hardware.usb.gadget@1.0",
+	"android.hardware.usb-V1-ndk",
         "libcutils",
         "android.frameworks.stats-V1-ndk",
         "pixelatoms-cpp",
         "libbinder_ndk",
+
     ],
     static_libs: [
         "libpixelusb",
@@ -63,5 +58,4 @@
         "android.frameworks.stats-V1-ndk",
         "pixelatoms-cpp",
     ],
-    proprietary: true,
 }
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
new file mode 100644
index 0000000..b8ad7c5
--- /dev/null
+++ b/usb/usb/Usb.cpp
@@ -0,0 +1,1021 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.usb.aidl-service"
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <assert.h>
+#include <cstring>
+#include <dirent.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <chrono>
+#include <regex>
+#include <thread>
+#include <unordered_map>
+
+#include <cutils/uevent.h>
+#include <sys/epoll.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+
+#include "Usb.h"
+
+#include <aidl/android/frameworks/stats/IStats.h>
+#include <pixelusb/UsbGadgetCommon.h>
+#include <pixelstats/StatsHelper.h>
+
+using aidl::android::frameworks::stats::IStats;
+using android::base::GetProperty;
+using android::base::Trim;
+using android::hardware::google::pixel::getStatsService;
+using android::hardware::google::pixel::PixelAtoms::VendorUsbPortOverheat;
+using android::hardware::google::pixel::reportUsbPortOverheat;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+// Set by the signal handler to destroy the thread
+volatile bool destroyThread;
+
+string enabledPath;
+constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
+constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
+constexpr char kContaminantDetectionPath[] = "i2c-max77759tcpc/contaminant_detection";
+constexpr char kStatusPath[] = "i2c-max77759tcpc/contaminant_detection_status";
+constexpr char kSinkLimitEnable[] = "i2c-max77759tcpc/usb_limit_sink_enable";
+constexpr char kSourceLimitEnable[] = "i2c-max77759tcpc/usb_limit_source_enable";
+constexpr char kSinkLimitCurrent[] = "i2c-max77759tcpc/usb_limit_sink_current";
+constexpr char kTypecPath[] = "/sys/class/typec";
+constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
+constexpr char kOverheatStatsPath[] = "/sys/devices/platform/google,usbc_port_cooling_dev/";
+constexpr char kOverheatStatsDev[] = "DRIVER=google,usbc_port_cooling_dev";
+constexpr char kThermalZoneForTrip[] = "VIRTUAL-USB-THROTTLING";
+constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
+constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
+constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
+constexpr char kPogoUsbActive[] = "/sys/devices/platform/google,pogo/pogo_usb_active";
+constexpr char KPogoMoveDataToUsb[] = "/sys/devices/platform/google,pogo/move_data_to_usb";
+constexpr char kPowerSupplyUsbType[] = "/sys/class/power_supply/usb/usb_type";
+constexpr int kSamplingIntervalSec = 5;
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+                        std::vector<PortStatus> *currentPortStatus);
+
+ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable,
+        int64_t in_transactionId) {
+    bool result = true;
+    std::vector<PortStatus> currentPortStatus;
+
+    ALOGI("Userspace turn %s USB data signaling. opID:%ld", in_enable ? "on" : "off",
+            in_transactionId);
+
+    if (in_enable) {
+        if (!mUsbDataEnabled) {
+            if (!WriteStringToFile("1", USB_DATA_PATH)) {
+                ALOGE("Not able to turn on usb connection notification");
+                result = false;
+            }
+
+            if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+                ALOGE("Gadget cannot be pulled up");
+                result = false;
+            }
+        }
+    } else {
+        if (!WriteStringToFile("1", ID_PATH)) {
+            ALOGE("Not able to turn off host mode");
+            result = false;
+        }
+
+        if (!WriteStringToFile("0", VBUS_PATH)) {
+            ALOGE("Not able to set Vbus state");
+            result = false;
+        }
+
+        if (!WriteStringToFile("0", USB_DATA_PATH)) {
+            ALOGE("Not able to turn on usb connection notification");
+            result = false;
+        }
+
+        if (!WriteStringToFile("none", PULLUP_PATH)) {
+            ALOGE("Gadget cannot be pulled down");
+            result = false;
+        }
+    }
+
+    if (result) {
+        mUsbDataEnabled = in_enable;
+    }
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+        ScopedAStatus ret = mCallback->notifyEnableUsbDataStatus(
+            in_portName, in_enable, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+    queryVersionHelper(this, &currentPortStatus);
+
+    return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName,
+        int64_t in_transactionId) {
+    bool success = true;
+    bool notSupported = true;
+    std::vector<PortStatus> currentPortStatus;
+
+    ALOGI("Userspace enableUsbDataWhileDocked  opID:%ld", in_transactionId);
+
+    int flags = O_RDONLY;
+    ::android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(KPogoMoveDataToUsb, flags)));
+    if (fd != -1) {
+        notSupported = false;
+        success = WriteStringToFile("1", KPogoMoveDataToUsb);
+        if (!success) {
+            ALOGE("Write to move_data_to_usb failed");
+        }
+    }
+
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+        ScopedAStatus ret = mCallback->notifyEnableUsbDataWhileDockedStatus(
+                in_portName, notSupported ? Status::NOT_SUPPORTED :
+                success ? Status::SUCCESS : Status::ERROR, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+    queryVersionHelper(this, &currentPortStatus);
+
+    return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) {
+    bool result = true;
+    std::vector<PortStatus> currentPortStatus;
+
+    ALOGI("Userspace reset USB Port. opID:%ld", in_transactionId);
+
+    if (!WriteStringToFile("none", PULLUP_PATH)) {
+        ALOGI("Gadget cannot be pulled down");
+        result = false;
+    }
+
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+        ::ndk::ScopedAStatus ret = mCallback->notifyResetUsbPortStatus(
+            in_portName, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("notifyTransactionStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+
+    return ::ndk::ScopedAStatus::ok();
+}
+
+Status getI2cBusHelper(string *name) {
+    DIR *dp;
+
+    dp = opendir(kHsi2cPath);
+    if (dp != NULL) {
+        struct dirent *ep;
+
+        while ((ep = readdir(dp))) {
+            if (ep->d_type == DT_DIR) {
+                if (string::npos != string(ep->d_name).find("i2c-")) {
+                    std::strtok(ep->d_name, "-");
+                    *name = std::strtok(NULL, "-");
+                }
+            }
+        }
+        closedir(dp);
+        return Status::SUCCESS;
+    }
+
+    ALOGE("Failed to open %s", kHsi2cPath);
+    return Status::ERROR;
+}
+
+Status queryMoistureDetectionStatus(std::vector<PortStatus> *currentPortStatus) {
+    string enabled, status, path, DetectedPath;
+
+    (*currentPortStatus)[0].supportedContaminantProtectionModes
+            .push_back(ContaminantProtectionMode::FORCE_DISABLE);
+    (*currentPortStatus)[0].contaminantProtectionStatus = ContaminantProtectionStatus::NONE;
+    (*currentPortStatus)[0].contaminantDetectionStatus = ContaminantDetectionStatus::DISABLED;
+    (*currentPortStatus)[0].supportsEnableContaminantPresenceDetection = true;
+    (*currentPortStatus)[0].supportsEnableContaminantPresenceProtection = false;
+
+    getI2cBusHelper(&path);
+    enabledPath = kI2CPath + path + "/" + kContaminantDetectionPath;
+    if (!ReadFileToString(enabledPath, &enabled)) {
+        ALOGE("Failed to open moisture_detection_enabled");
+        return Status::ERROR;
+    }
+
+    enabled = Trim(enabled);
+    if (enabled == "1") {
+        DetectedPath = kI2CPath + path + "/" + kStatusPath;
+        if (!ReadFileToString(DetectedPath, &status)) {
+            ALOGE("Failed to open moisture_detected");
+            return Status::ERROR;
+        }
+        status = Trim(status);
+        if (status == "1") {
+            (*currentPortStatus)[0].contaminantDetectionStatus =
+                ContaminantDetectionStatus::DETECTED;
+            (*currentPortStatus)[0].contaminantProtectionStatus =
+                ContaminantProtectionStatus::FORCE_DISABLE;
+        } else {
+            (*currentPortStatus)[0].contaminantDetectionStatus =
+                ContaminantDetectionStatus::NOT_DETECTED;
+        }
+    }
+
+    ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
+            (*currentPortStatus)[0].contaminantDetectionStatus,
+            (*currentPortStatus)[0].contaminantProtectionStatus);
+
+    return Status::SUCCESS;
+}
+
+string appendRoleNodeHelper(const string &portName, PortRole::Tag tag) {
+    string node("/sys/class/typec/" + portName);
+
+    switch (tag) {
+        case PortRole::dataRole:
+            return node + "/data_role";
+        case PortRole::powerRole:
+            return node + "/power_role";
+        case PortRole::mode:
+            return node + "/port_type";
+        default:
+            return "";
+    }
+}
+
+string convertRoletoString(PortRole role) {
+    if (role.getTag() == PortRole::powerRole) {
+        if (role.get<PortRole::powerRole>() == PortPowerRole::SOURCE)
+            return "source";
+        else if (role.get<PortRole::powerRole>() == PortPowerRole::SINK)
+            return "sink";
+    } else if (role.getTag() == PortRole::dataRole) {
+        if (role.get<PortRole::dataRole>() == PortDataRole::HOST)
+            return "host";
+        if (role.get<PortRole::dataRole>() == PortDataRole::DEVICE)
+            return "device";
+    } else if (role.getTag() == PortRole::mode) {
+        if (role.get<PortRole::mode>() == PortMode::UFP)
+            return "sink";
+        if (role.get<PortRole::mode>() == PortMode::DFP)
+            return "source";
+    }
+    return "none";
+}
+
+void extractRole(string *roleName) {
+    std::size_t first, last;
+
+    first = roleName->find("[");
+    last = roleName->find("]");
+
+    if (first != string::npos && last != string::npos) {
+        *roleName = roleName->substr(first + 1, last - first - 1);
+    }
+}
+
+void switchToDrp(const string &portName) {
+    string filename = appendRoleNodeHelper(string(portName.c_str()), PortRole::mode);
+    FILE *fp;
+
+    if (filename != "") {
+        fp = fopen(filename.c_str(), "w");
+        if (fp != NULL) {
+            int ret = fputs("dual", fp);
+            fclose(fp);
+            if (ret == EOF)
+                ALOGE("Fatal: Error while switching back to drp");
+        } else {
+            ALOGE("Fatal: Cannot open file to switch back to drp");
+        }
+    } else {
+        ALOGE("Fatal: invalid node type");
+    }
+}
+
+bool switchMode(const string &portName, const PortRole &in_role, struct Usb *usb) {
+    string filename = appendRoleNodeHelper(string(portName.c_str()), in_role.getTag());
+    string written;
+    FILE *fp;
+    bool roleSwitch = false;
+
+    if (filename == "") {
+        ALOGE("Fatal: invalid node type");
+        return false;
+    }
+
+    fp = fopen(filename.c_str(), "w");
+    if (fp != NULL) {
+        // Hold the lock here to prevent loosing connected signals
+        // as once the file is written the partner added signal
+        // can arrive anytime.
+        pthread_mutex_lock(&usb->mPartnerLock);
+        usb->mPartnerUp = false;
+        int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+        fclose(fp);
+
+        if (ret != EOF) {
+            struct timespec to;
+            struct timespec now;
+
+        wait_again:
+            clock_gettime(CLOCK_MONOTONIC, &now);
+            to.tv_sec = now.tv_sec + PORT_TYPE_TIMEOUT;
+            to.tv_nsec = now.tv_nsec;
+
+            int err = pthread_cond_timedwait(&usb->mPartnerCV, &usb->mPartnerLock, &to);
+            // There are no uevent signals which implies role swap timed out.
+            if (err == ETIMEDOUT) {
+                ALOGI("uevents wait timedout");
+                // Validity check.
+            } else if (!usb->mPartnerUp) {
+                goto wait_again;
+                // Role switch succeeded since usb->mPartnerUp is true.
+            } else {
+                roleSwitch = true;
+            }
+        } else {
+            ALOGI("Role switch failed while wrting to file");
+        }
+        pthread_mutex_unlock(&usb->mPartnerLock);
+    }
+
+    if (!roleSwitch)
+        switchToDrp(string(portName.c_str()));
+
+    return roleSwitch;
+}
+
+Usb::Usb()
+    : mLock(PTHREAD_MUTEX_INITIALIZER),
+      mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
+      mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
+      mPartnerUp(false),
+      mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip,
+                         ThrottlingSeverity::CRITICAL),
+                {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary,
+                          ThrottlingSeverity::NONE),
+                 ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary1,
+                          ThrottlingSeverity::NONE),
+                 ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2,
+                          ThrottlingSeverity::NONE)}, kSamplingIntervalSec),
+      mUsbDataEnabled(true) {
+    pthread_condattr_t attr;
+    if (pthread_condattr_init(&attr)) {
+        ALOGE("pthread_condattr_init failed: %s", strerror(errno));
+        abort();
+    }
+    if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
+        ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
+        abort();
+    }
+    if (pthread_cond_init(&mPartnerCV, &attr)) {
+        ALOGE("pthread_cond_init failed: %s", strerror(errno));
+        abort();
+    }
+    if (pthread_condattr_destroy(&attr)) {
+        ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
+        abort();
+    }
+}
+
+ScopedAStatus Usb::switchRole(const string& in_portName, const PortRole& in_role,
+        int64_t in_transactionId) {
+    string filename = appendRoleNodeHelper(string(in_portName.c_str()), in_role.getTag());
+    string written;
+    FILE *fp;
+    bool roleSwitch = false;
+
+    if (filename == "") {
+        ALOGE("Fatal: invalid node type");
+        return ScopedAStatus::ok();
+    }
+
+    pthread_mutex_lock(&mRoleSwitchLock);
+
+    ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(in_role).c_str());
+
+    if (in_role.getTag() == PortRole::mode) {
+        roleSwitch = switchMode(in_portName, in_role, this);
+    } else {
+        fp = fopen(filename.c_str(), "w");
+        if (fp != NULL) {
+            int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+            fclose(fp);
+            if ((ret != EOF) && ReadFileToString(filename, &written)) {
+                written = Trim(written);
+                extractRole(&written);
+                ALOGI("written: %s", written.c_str());
+                if (written == convertRoletoString(in_role)) {
+                    roleSwitch = true;
+                } else {
+                    ALOGE("Role switch failed");
+                }
+            } else {
+                ALOGE("failed to update the new role");
+            }
+        } else {
+            ALOGE("fopen failed");
+        }
+    }
+
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+         ScopedAStatus ret = mCallback->notifyRoleSwitchStatus(
+            in_portName, in_role, roleSwitch ? Status::SUCCESS : Status::ERROR, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("RoleSwitchStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+    pthread_mutex_unlock(&mRoleSwitchLock);
+
+    return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit,
+        int64_t in_transactionId) {
+    bool sessionFail = false, success;
+    std::vector<PortStatus> currentPortStatus;
+    string path, sinkLimitEnablePath, currentLimitPath, sourceLimitEnablePath;
+
+    getI2cBusHelper(&path);
+    sinkLimitEnablePath = kI2CPath + path + "/" + kSinkLimitEnable;
+    sourceLimitEnablePath = kI2CPath + path + "/" + kSourceLimitEnable;
+    currentLimitPath = kI2CPath + path + "/" + kSinkLimitCurrent;
+
+    pthread_mutex_lock(&mLock);
+    if (in_limit) {
+        success = WriteStringToFile("0", currentLimitPath);
+        if (!success) {
+            ALOGE("Failed to set sink current limit");
+            sessionFail = true;
+        }
+    }
+    success = WriteStringToFile(in_limit ? "1" : "0", sinkLimitEnablePath);
+    if (!success) {
+        ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable",
+              sinkLimitEnablePath.c_str());
+        sessionFail = true;
+    }
+    success = WriteStringToFile(in_limit ? "1" : "0", sourceLimitEnablePath);
+    if (!success) {
+        ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable",
+              sourceLimitEnablePath.c_str());
+              sessionFail = true;
+    }
+    ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
+    if (mCallback != NULL && in_transactionId >= 0) {
+        ScopedAStatus ret = mCallback->notifyLimitPowerTransferStatus(
+                in_portName, in_limit, sessionFail ? Status::ERROR : Status::SUCCESS,
+                in_transactionId);
+        if (!ret.isOk())
+            ALOGE("limitPowerTransfer error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+
+    pthread_mutex_unlock(&mLock);
+    queryVersionHelper(this, &currentPortStatus);
+
+    return ScopedAStatus::ok();
+}
+
+Status queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) {
+    string limitedPath, enabled, path;
+
+    getI2cBusHelper(&path);
+    limitedPath = kI2CPath + path + "/" + kSinkLimitEnable;
+    if (!ReadFileToString(limitedPath, &enabled)) {
+        ALOGE("Failed to open limit_sink_enable");
+        return Status::ERROR;
+    }
+
+    enabled = Trim(enabled);
+    (*currentPortStatus)[0].powerTransferLimited = enabled == "1";
+
+    ALOGI("powerTransferLimited:%d", (*currentPortStatus)[0].powerTransferLimited ? 1 : 0);
+    return Status::SUCCESS;
+}
+
+Status getAccessoryConnected(const string &portName, string *accessory) {
+    string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
+
+    if (!ReadFileToString(filename, accessory)) {
+        ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
+        return Status::ERROR;
+    }
+    *accessory = Trim(*accessory);
+
+    return Status::SUCCESS;
+}
+
+Status getCurrentRoleHelper(const string &portName, bool connected, PortRole *currentRole) {
+    string filename;
+    string roleName;
+    string accessory;
+
+    // Mode
+
+    if (currentRole->getTag() == PortRole::powerRole) {
+        filename = "/sys/class/typec/" + portName + "/power_role";
+        currentRole->set<PortRole::powerRole>(PortPowerRole::NONE);
+    } else if (currentRole->getTag() == PortRole::dataRole) {
+        filename = "/sys/class/typec/" + portName + "/data_role";
+        currentRole->set<PortRole::dataRole>(PortDataRole::NONE);
+    } else if (currentRole->getTag() == PortRole::mode) {
+        filename = "/sys/class/typec/" + portName + "/data_role";
+        currentRole->set<PortRole::mode>(PortMode::NONE);
+    } else {
+        return Status::ERROR;
+    }
+
+    if (!connected)
+        return Status::SUCCESS;
+
+    if (currentRole->getTag() == PortRole::mode) {
+        if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
+            return Status::ERROR;
+        }
+        if (accessory == "analog_audio") {
+            currentRole->set<PortRole::mode>(PortMode::AUDIO_ACCESSORY);
+            return Status::SUCCESS;
+        } else if (accessory == "debug") {
+            currentRole->set<PortRole::mode>(PortMode::DEBUG_ACCESSORY);
+            return Status::SUCCESS;
+        }
+    }
+
+    if (!ReadFileToString(filename, &roleName)) {
+        ALOGE("getCurrentRole: Failed to open filesystem node: %s", filename.c_str());
+        return Status::ERROR;
+    }
+
+    roleName = Trim(roleName);
+    extractRole(&roleName);
+
+    if (roleName == "source") {
+        currentRole->set<PortRole::powerRole>(PortPowerRole::SOURCE);
+    } else if (roleName == "sink") {
+        currentRole->set<PortRole::powerRole>(PortPowerRole::SINK);
+    } else if (roleName == "host") {
+        if (currentRole->getTag() == PortRole::dataRole)
+            currentRole->set<PortRole::dataRole>(PortDataRole::HOST);
+        else
+            currentRole->set<PortRole::mode>(PortMode::DFP);
+    } else if (roleName == "device") {
+        if (currentRole->getTag() == PortRole::dataRole)
+            currentRole->set<PortRole::dataRole>(PortDataRole::DEVICE);
+        else
+            currentRole->set<PortRole::mode>(PortMode::UFP);
+    } else if (roleName != "none") {
+        /* case for none has already been addressed.
+         * so we check if the role isn't none.
+         */
+        return Status::UNRECOGNIZED_ROLE;
+    }
+    return Status::SUCCESS;
+}
+
+Status getTypeCPortNamesHelper(std::unordered_map<string, bool> *names) {
+    DIR *dp;
+
+    dp = opendir(kTypecPath);
+    if (dp != NULL) {
+        struct dirent *ep;
+
+        while ((ep = readdir(dp))) {
+            if (ep->d_type == DT_LNK) {
+                if (string::npos == string(ep->d_name).find("-partner")) {
+                    std::unordered_map<string, bool>::const_iterator portName =
+                        names->find(ep->d_name);
+                    if (portName == names->end()) {
+                        names->insert({ep->d_name, false});
+                    }
+                } else {
+                    (*names)[std::strtok(ep->d_name, "-")] = true;
+                }
+            }
+        }
+        closedir(dp);
+        return Status::SUCCESS;
+    }
+
+    ALOGE("Failed to open /sys/class/typec");
+    return Status::ERROR;
+}
+
+bool canSwitchRoleHelper(const string &portName) {
+    string filename = "/sys/class/typec/" + portName + "-partner/supports_usb_power_delivery";
+    string supportsPD;
+
+    if (ReadFileToString(filename, &supportsPD)) {
+        supportsPD = Trim(supportsPD);
+        if (supportsPD == "yes") {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+Status getPortStatusHelper(android::hardware::usb::Usb *usb,
+        std::vector<PortStatus> *currentPortStatus) {
+    std::unordered_map<string, bool> names;
+    Status result = getTypeCPortNamesHelper(&names);
+    int i = -1;
+
+    if (result == Status::SUCCESS) {
+        currentPortStatus->resize(names.size());
+        for (std::pair<string, bool> port : names) {
+            i++;
+            ALOGI("%s", port.first.c_str());
+            (*currentPortStatus)[i].portName = port.first;
+
+            PortRole currentRole;
+            currentRole.set<PortRole::powerRole>(PortPowerRole::NONE);
+            if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS){
+                (*currentPortStatus)[i].currentPowerRole = currentRole.get<PortRole::powerRole>();
+            } else {
+                ALOGE("Error while retrieving portNames");
+                goto done;
+            }
+
+            currentRole.set<PortRole::dataRole>(PortDataRole::NONE);
+            if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS) {
+                (*currentPortStatus)[i].currentDataRole = currentRole.get<PortRole::dataRole>();
+            } else {
+                ALOGE("Error while retrieving current port role");
+                goto done;
+            }
+
+            currentRole.set<PortRole::mode>(PortMode::NONE);
+            if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS) {
+                (*currentPortStatus)[i].currentMode = currentRole.get<PortRole::mode>();
+            } else {
+                ALOGE("Error while retrieving current data role");
+                goto done;
+            }
+
+            (*currentPortStatus)[i].canChangeMode = true;
+            (*currentPortStatus)[i].canChangeDataRole =
+                port.second ? canSwitchRoleHelper(port.first) : false;
+            (*currentPortStatus)[i].canChangePowerRole =
+                port.second ? canSwitchRoleHelper(port.first) : false;
+
+            (*currentPortStatus)[i].supportedModes.push_back(PortMode::DRP);
+
+            bool dataEnabled = true;
+            string pogoUsbActive = "0";
+            if (ReadFileToString(string(kPogoUsbActive), &pogoUsbActive) &&
+                stoi(Trim(pogoUsbActive)) == 1) {
+                (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_DOCK);
+                dataEnabled = false;
+            }
+            if (!usb->mUsbDataEnabled) {
+                (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_FORCE);
+                dataEnabled = false;
+            }
+            if (dataEnabled) {
+                (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::ENABLED);
+            }
+
+            // When connected return powerBrickStatus
+            if (port.second) {
+                string usbType;
+                if (ReadFileToString(string(kPowerSupplyUsbType), &usbType)) {
+                    if (strstr(usbType.c_str(), "[D")) {
+                        (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::CONNECTED;
+                    } else if (strstr(usbType.c_str(), "[U")) {
+                        (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::UNKNOWN;
+                    } else {
+                        (*currentPortStatus)[i].powerBrickStatus =
+                                PowerBrickStatus::NOT_CONNECTED;
+                    }
+                } else {
+                    ALOGE("Error while reading usb_type");
+                }
+            } else {
+                (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::NOT_CONNECTED;
+            }
+
+            ALOGI("%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d "
+                  "usbDataEnabled:%d",
+                i, port.first.c_str(), port.second,
+                (*currentPortStatus)[i].canChangeMode,
+                (*currentPortStatus)[i].canChangeDataRole,
+                (*currentPortStatus)[i].canChangePowerRole,
+                dataEnabled ? 1 : 0);
+        }
+
+        return Status::SUCCESS;
+    }
+done:
+    return Status::ERROR;
+}
+
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+                        std::vector<PortStatus> *currentPortStatus) {
+    Status status;
+    pthread_mutex_lock(&usb->mLock);
+    status = getPortStatusHelper(usb, currentPortStatus);
+    queryMoistureDetectionStatus(currentPortStatus);
+    queryPowerTransferStatus(currentPortStatus);
+    if (usb->mCallback != NULL) {
+        ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus,
+            status);
+        if (!ret.isOk())
+            ALOGE("queryPortStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGI("Notifying userspace skipped. Callback is NULL");
+    }
+    pthread_mutex_unlock(&usb->mLock);
+}
+
+ScopedAStatus Usb::queryPortStatus(int64_t in_transactionId) {
+    std::vector<PortStatus> currentPortStatus;
+
+    queryVersionHelper(this, &currentPortStatus);
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+        ScopedAStatus ret = mCallback->notifyQueryPortStatus(
+            "all", Status::SUCCESS, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("notifyQueryPortStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+
+    return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableContaminantPresenceDetection(const string& in_portName,
+        bool in_enable, int64_t in_transactionId) {
+    string disable = GetProperty(kDisableContatminantDetection, "");
+    std::vector<PortStatus> currentPortStatus;
+    bool success = true;
+
+    if (disable != "true")
+        success = WriteStringToFile(in_enable ? "1" : "0", enabledPath);
+
+    pthread_mutex_lock(&mLock);
+    if (mCallback != NULL) {
+        ScopedAStatus ret = mCallback->notifyContaminantEnabledStatus(
+            in_portName, in_enable, success ? Status::SUCCESS : Status::ERROR, in_transactionId);
+        if (!ret.isOk())
+            ALOGE("notifyContaminantEnabledStatus error %s", ret.getDescription().c_str());
+    } else {
+        ALOGE("Not notifying the userspace. Callback is not set");
+    }
+    pthread_mutex_unlock(&mLock);
+
+    queryVersionHelper(this, &currentPortStatus);
+    return ScopedAStatus::ok();
+}
+
+void report_overheat_event(android::hardware::usb::Usb *usb) {
+    VendorUsbPortOverheat overheat_info;
+    string contents;
+
+    overheat_info.set_plug_temperature_deci_c(usb->mPluggedTemperatureCelsius * 10);
+    overheat_info.set_max_temperature_deci_c(usb->mOverheat.getMaxOverheatTemperature() * 10);
+    if (ReadFileToString(string(kOverheatStatsPath) + "trip_time", &contents)) {
+        overheat_info.set_time_to_overheat_secs(stoi(Trim(contents)));
+    } else {
+        ALOGE("Unable to read trip_time");
+        return;
+    }
+    if (ReadFileToString(string(kOverheatStatsPath) + "hysteresis_time", &contents)) {
+        overheat_info.set_time_to_hysteresis_secs(stoi(Trim(contents)));
+    } else {
+        ALOGE("Unable to read hysteresis_time");
+        return;
+    }
+    if (ReadFileToString(string(kOverheatStatsPath) + "cleared_time", &contents)) {
+        overheat_info.set_time_to_inactive_secs(stoi(Trim(contents)));
+    } else {
+        ALOGE("Unable to read cleared_time");
+        return;
+    }
+
+    const shared_ptr<IStats> stats_client = getStatsService();
+    if (!stats_client) {
+        ALOGE("Unable to get AIDL Stats service");
+    } else {
+        reportUsbPortOverheat(stats_client, overheat_info);
+    }
+}
+
+struct data {
+    int uevent_fd;
+    ::aidl::android::hardware::usb::Usb *usb;
+};
+
+static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
+    char msg[UEVENT_MSG_LEN + 2];
+    char *cp;
+    int n;
+
+    n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
+    if (n <= 0)
+        return;
+    if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
+        return;
+
+    msg[n] = '\0';
+    msg[n + 1] = '\0';
+    cp = msg;
+
+    while (*cp) {
+        if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) {
+            ALOGI("partner added");
+            pthread_mutex_lock(&payload->usb->mPartnerLock);
+            payload->usb->mPartnerUp = true;
+            pthread_cond_signal(&payload->usb->mPartnerCV);
+            pthread_mutex_unlock(&payload->usb->mPartnerLock);
+        } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
+                   !strncmp(cp, "DRIVER=max77759tcpc",
+                            strlen("DRIVER=max77759tcpc")) ||
+                   !strncmp(cp, "DRIVER=pogo-transport",
+                            strlen("DRIVER=pogo-transport")) ||
+                   !strncmp(cp, "POWER_SUPPLY_NAME=usb",
+                            strlen("POWER_SUPPLY_NAME=usb"))) {
+            std::vector<PortStatus> currentPortStatus;
+            queryVersionHelper(payload->usb, &currentPortStatus);
+
+            // Role switch is not in progress and port is in disconnected state
+            if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
+                for (unsigned long i = 0; i < currentPortStatus.size(); i++) {
+                    DIR *dp =
+                        opendir(string("/sys/class/typec/" +
+                                            string(currentPortStatus[i].portName.c_str()) +
+                                            "-partner").c_str());
+                    if (dp == NULL) {
+                        switchToDrp(currentPortStatus[i].portName);
+                    } else {
+                        closedir(dp);
+                    }
+                }
+                pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
+            }
+            break;
+        } else if (!strncmp(cp, kOverheatStatsDev, strlen(kOverheatStatsDev))) {
+            ALOGV("Overheat Cooling device suez update");
+            report_overheat_event(payload->usb);
+        }
+        /* advance to after the next \0 */
+        while (*cp++) {
+        }
+    }
+}
+
+void *work(void *param) {
+    int epoll_fd, uevent_fd;
+    struct epoll_event ev;
+    int nevents = 0;
+    struct data payload;
+
+    ALOGE("creating thread");
+
+    uevent_fd = uevent_open_socket(64 * 1024, true);
+
+    if (uevent_fd < 0) {
+        ALOGE("uevent_init: uevent_open_socket failed\n");
+        return NULL;
+    }
+
+    payload.uevent_fd = uevent_fd;
+    payload.usb = (::aidl::android::hardware::usb::Usb *)param;
+
+    fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
+
+    ev.events = EPOLLIN;
+    ev.data.ptr = (void *)uevent_event;
+
+    epoll_fd = epoll_create(64);
+    if (epoll_fd == -1) {
+        ALOGE("epoll_create failed; errno=%d", errno);
+        goto error;
+    }
+
+    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
+        ALOGE("epoll_ctl failed; errno=%d", errno);
+        goto error;
+    }
+
+    while (!destroyThread) {
+        struct epoll_event events[64];
+
+        nevents = epoll_wait(epoll_fd, events, 64, -1);
+        if (nevents == -1) {
+            if (errno == EINTR)
+                continue;
+            ALOGE("usb epoll_wait failed; errno=%d", errno);
+            break;
+        }
+
+        for (int n = 0; n < nevents; ++n) {
+            if (events[n].data.ptr)
+                (*(void (*)(int, struct data *payload))events[n].data.ptr)(events[n].events,
+                                                                           &payload);
+        }
+    }
+
+    ALOGI("exiting worker thread");
+error:
+    close(uevent_fd);
+
+    if (epoll_fd >= 0)
+        close(epoll_fd);
+
+    return NULL;
+}
+
+void sighandler(int sig) {
+    if (sig == SIGUSR1) {
+        destroyThread = true;
+        ALOGI("destroy set");
+        return;
+    }
+    signal(SIGUSR1, sighandler);
+}
+
+ScopedAStatus Usb::setCallback(const shared_ptr<IUsbCallback>& in_callback) {
+    pthread_mutex_lock(&mLock);
+    if ((mCallback == NULL && in_callback == NULL) ||
+            (mCallback != NULL && in_callback != NULL)) {
+        mCallback = in_callback;
+        pthread_mutex_unlock(&mLock);
+        return ScopedAStatus::ok();
+    }
+
+    mCallback = in_callback;
+    ALOGI("registering callback");
+
+    if (mCallback == NULL) {
+        if  (!pthread_kill(mPoll, SIGUSR1)) {
+            pthread_join(mPoll, NULL);
+            ALOGI("pthread destroyed");
+        }
+        pthread_mutex_unlock(&mLock);
+        return ScopedAStatus::ok();
+    }
+
+    destroyThread = false;
+    signal(SIGUSR1, sighandler);
+
+    /*
+     * Create a background thread if the old callback value is NULL
+     * and being updated with a new value.
+     */
+    if (pthread_create(&mPoll, NULL, work, this)) {
+        ALOGE("pthread creation failed %d", errno);
+        mCallback = NULL;
+    }
+
+    pthread_mutex_unlock(&mLock);
+    return ScopedAStatus::ok();
+}
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h
new file mode 100644
index 0000000..1a93e19
--- /dev/null
+++ b/usb/usb/Usb.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <aidl/android/hardware/usb/BnUsb.h>
+#include <aidl/android/hardware/usb/BnUsbCallback.h>
+#include <pixelusb/UsbOverheatEvent.h>
+#include <utils/Log.h>
+
+#define UEVENT_MSG_LEN 2048
+// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
+// The -partner directory would not be created until this is done.
+// Having a margin of ~3 secs for the directory and other related bookeeping
+// structures created and uvent fired.
+#define PORT_TYPE_TIMEOUT 8
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+
+using ::aidl::android::hardware::usb::IUsbCallback;
+using ::aidl::android::hardware::usb::PortRole;
+using ::android::base::ReadFileToString;
+using ::android::base::WriteStringToFile;
+using ::android::hardware::google::pixel::usb::UsbOverheatEvent;
+using ::android::hardware::google::pixel::usb::ZoneInfo;
+using ::android::hardware::thermal::V2_0::TemperatureType;
+using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
+using ::android::sp;
+using ::ndk::ScopedAStatus;
+using ::std::shared_ptr;
+using ::std::string;
+
+constexpr char kGadgetName[] = "11110000.dwc3";
+#define NEW_UDC_PATH "/sys/devices/platform/11110000.usb/"
+
+#define ID_PATH NEW_UDC_PATH "dwc3_exynos_otg_id"
+#define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess"
+#define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled"
+
+struct Usb : public BnUsb {
+    Usb();
+
+    ScopedAStatus enableContaminantPresenceDetection(const std::string& in_portName,
+            bool in_enable, int64_t in_transactionId) override;
+    ScopedAStatus queryPortStatus(int64_t in_transactionId) override;
+    ScopedAStatus setCallback(const shared_ptr<IUsbCallback>& in_callback) override;
+    ScopedAStatus switchRole(const string& in_portName, const PortRole& in_role,
+            int64_t in_transactionId) override;
+    ScopedAStatus enableUsbData(const string& in_portName, bool in_enable,
+            int64_t in_transactionId) override;
+    ScopedAStatus enableUsbDataWhileDocked(const string& in_portName,
+            int64_t in_transactionId) override;
+    ScopedAStatus limitPowerTransfer(const string& in_portName, bool in_limit,
+        int64_t in_transactionId) override;
+    ScopedAStatus resetUsbPort(const string& in_portName, int64_t in_transactionId) override;
+
+    std::shared_ptr<::aidl::android::hardware::usb::IUsbCallback> mCallback;
+    // Protects mCallback variable
+    pthread_mutex_t mLock;
+    // Protects roleSwitch operation
+    pthread_mutex_t mRoleSwitchLock;
+    // Threads waiting for the partner to come back wait here
+    pthread_cond_t mPartnerCV;
+    // lock protecting mPartnerCV
+    pthread_mutex_t mPartnerLock;
+    // Variable to signal partner coming back online after type switch
+    bool mPartnerUp;
+
+    // Usb Overheat object for push suez event
+    UsbOverheatEvent mOverheat;
+    // Temperature when connected
+    float mPluggedTemperatureCelsius;
+    // Usb Data status
+    bool mUsbDataEnabled;
+  private:
+    pthread_t mPoll;
+};
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc
new file mode 100644
index 0000000..5b966c6
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -0,0 +1,53 @@
+service vendor.usb /vendor/bin/hw/android.hardware.usb-service.gs101
+    class hal
+    user system
+    group system shell wakelock
+    capabilities WAKE_ALARM BLOCK_SUSPEND
+
+on post-fs
+    chown root system /sys/class/typec/port0/power_role
+    chown root system /sys/class/typec/port0/data_role
+    chown root system /sys/class/typec/port0/port_type
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+    chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+    chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+    chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+    chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
+    chown root system /sys/devices/platform/google,pogo/move_data_to_usb
+    chmod 664 /sys/class/typec/port0/power_role
+    chmod 664 /sys/class/typec/port0/data_role
+    chmod 664 /sys/class/typec/port0/port_type
+    chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+    chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+    chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+    chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+    chmod 664 /sys/devices/platform/google,pogo/move_data_to_usb
diff --git a/usb/android.hardware.usb@1.3-service.gs101.xml b/usb/usb/android.hardware.usb-service.xml
similarity index 68%
rename from usb/android.hardware.usb@1.3-service.gs101.xml
rename to usb/usb/android.hardware.usb-service.xml
index cd54268..6088194 100644
--- a/usb/android.hardware.usb@1.3-service.gs101.xml
+++ b/usb/usb/android.hardware.usb-service.xml
@@ -1,12 +1,10 @@
 <manifest version="1.0" type="device">
-    <hal format="hidl">
+    <hal format="aidl">
         <name>android.hardware.usb</name>
-        <transport>hwbinder</transport>
-        <version>1.3</version>
+        <version>1</version>
         <interface>
             <name>IUsb</name>
             <instance>default</instance>
         </interface>
     </hal>
 </manifest>
-
diff --git a/usb/usb/service.cpp b/usb/usb/service.cpp
new file mode 100644
index 0000000..2c0a596
--- /dev/null
+++ b/usb/usb/service.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <utils/Log.h>
+
+#include "Usb.h"
+
+using ::aidl::android::hardware::usb::Usb;
+
+int main() {
+    ABinderProcess_setThreadPoolMaxThreadCount(0);
+    std::shared_ptr<Usb> usb = ndk::SharedRefBase::make<Usb>();
+
+    const std::string instance = std::string() + Usb::descriptor + "/default";
+    binder_status_t status = AServiceManager_addService(usb->asBinder().get(), instance.c_str());
+    CHECK(status == STATUS_OK);
+
+    ALOGV("AIDL USB HAL about to start");
+    ABinderProcess_joinThreadPool();
+    return -1; // Should never be reached
+}
diff --git a/uwb/calibration/init.uwb.calib.sh b/uwb/calibration/init.uwb.calib.sh
new file mode 100644
index 0000000..a604885
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.sh
@@ -0,0 +1,57 @@
+#!/vendor/bin/sh
+if [ -z "$2" ]
+then
+    echo "usage is $0 input-calibration output_calibration"
+    exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+    touch $OUTPUT_CALIB
+    chmod 0600 $OUTPUT_CALIB
+    file="$1"
+    while IFS=, read -r f1 f2
+    do
+        case $f1 in
+            "UWB_cal_tx_xtal_reg_final_value")
+                if [ $((0x$f2)) -gt 63 ]; then
+                    f2=63
+                fi
+                echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+            "UWB_TX1RX1_CH5_tx_ant_delay_cal_data")
+                echo 'ant0.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+            "UWB_TX1RX1_CH5_rx_ant_delay_cal_data")
+                echo 'ant1.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+            "UWB_TX1RX1_CH9_tx_ant_delay_cal_data")
+                echo 'ant0.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+            "UWB_TX1RX1_CH9_rx_ant_delay_cal_data")
+                echo 'ant1.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+            "UWB_RX2_CH5_cal_pdoa_data")
+                 # float value * 2048
+                 #/vendor/bin/sh does not support "bc"
+                 base=2048
+                 ones=${f2%%.*}
+                 dec=${f2#*.}
+                 ones="$(($ones*$base))"
+                 if [ ${#dec} -eq 2 ]; then
+                     dec="$(($dec*$base/100))"
+                     echo 'ant1.ant3.ch5.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+                 fi
+                 ;;
+             "UWB_RX2_CH9_cal_pdoa_data")
+                 base=2048
+                 ones=${f2%%.*}
+                 dec=${f2#*.}
+                 ones="$(($ones*$base))"
+                 if [ ${#dec} -eq 2 ]; then
+                     dec="$(($dec*$base/100))"
+                     echo 'ant1.ant3.ch9.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+                 fi
+        esac
+    done <"$file"
+    exit 0
+fi
diff --git a/uwb/calibration/init.uwb.calib.xtal.sh b/uwb/calibration/init.uwb.calib.xtal.sh
new file mode 100644
index 0000000..efdfd6b
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.xtal.sh
@@ -0,0 +1,25 @@
+#!/vendor/bin/sh
+# only use xtal_trim from factory calibration
+if [ -z "$2" ]
+then
+    echo "usage is $0 input-calibration output_calibration"
+    exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+    touch $OUTPUT_CALIB
+    chmod 0644 $OUTPUT_CALIB
+    file="$1"
+    while IFS=, read -r f1 f2
+    do
+        case $f1 in
+            "UWB_cal_tx_xtal_reg_final_value")
+                if [ $((0x$f2)) -gt 63 ]; then
+                    f2=63
+                fi
+                echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+                ;;
+        esac
+    done <"$file"
+    exit 0
+fi
diff --git a/uwb/uwb.mk b/uwb/uwb.mk
index 72663b4..58cdc3c 100644
--- a/uwb/uwb.mk
+++ b/uwb/uwb.mk
@@ -35,7 +35,8 @@
     $(LOCAL_UWB_CAL_DIR)/UWB-calibration-tj.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tj.conf \
     $(LOCAL_UWB_CAL_DIR)/UWB-calibration-tm.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tm.conf \
     $(LOCAL_UWB_CAL_DIR)/UWB-calibration-ua.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-ua.conf \
-    $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf
+    $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf \
+    $(LOCAL_UWB_CAL_DIR)/init.uwb.calib.xtal.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.uwb.calib.sh \
 
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.uwb.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/etc/permissions/android.hardware.uwb.xml
diff --git a/vendor_dlkm.blocklist b/vendor_dlkm.blocklist
deleted file mode 100644
index b259ab6..0000000
--- a/vendor_dlkm.blocklist
+++ /dev/null
@@ -1,15 +0,0 @@
-blocklist bcmdhd43752
-blocklist bcmdhd4389
-blocklist cl_dsp
-blocklist drv2624
-blocklist ftm5
-blocklist input-cs40l26-i2c
-blocklist pktgen
-blocklist sec_touch
-blocklist snd-soc-cs35l41-i2c
-blocklist snd-soc-cs35l41-spi
-blocklist st33spi
-blocklist st54spi
-blocklist uwb_desense.ko
-blocklist uwb-hal.ko
-blocklist uwbcore.ko
diff --git a/wifi/BoardConfig-wifi.mk b/wifi/BoardConfig-wifi.mk
new file mode 100644
index 0000000..58a9778
--- /dev/null
+++ b/wifi/BoardConfig-wifi.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2021 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# WiFi
+BOARD_WLAN_DEVICE := bcmdhd
+BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+WPA_SUPPLICANT_VERSION := VER_0_8_X
+BOARD_WPA_SUPPLICANT_DRIVER := NL80211
+BOARD_HOSTAPD_DRIVER := NL80211
+# Wifi interface combination - {1 STA + 1 AP} or {1 STA + 1 AP_BRIDGED} or {1 STA + 1 P2P}
+# or {1 STA + 1 NAN} or {2 STA}
+WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{P2P, NAN, AP, AP_BRIDGED}, 1}}, {{{STA}, 2}}
+WIFI_FEATURE_WIFI_EXT_HAL := true
+WIFI_FEATURE_IMU_DETECTION := true
+# Avoid Wifi reset on MAC Address change
+WIFI_AVOID_IFACE_RESET_MAC_CHANGE := true
+WIFI_FEATURE_HOSTAPD_11AX := true
+BOARD_HOSTAPD_CONFIG_80211W_MFP_OPTIONAL := true
+