diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
index 87e829e..6a95618 100644
--- a/BoardConfig-common.mk
+++ b/BoardConfig-common.mk
@@ -133,10 +133,6 @@
 # Graphics
 #BOARD_USES_EXYNOS_DATASPACE_FEATURE := true
 
-# Storage options
-BOARD_USES_VENDORIMAGE := true
-TARGET_COPY_OUT_VENDOR := vendor
-
 # Enable chain partition for system.
 BOARD_AVB_VBMETA_SYSTEM := system system_ext product
 BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
@@ -144,6 +140,12 @@
 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
 
+# Enable chained vbmeta for boot images
+BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
+BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA2048
+BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
+BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
+
 TARGET_USERIMAGES_USE_EXT4 := true
 TARGET_USERIMAGES_USE_F2FS := true
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 11796480000
@@ -363,6 +365,9 @@
 # System As Root
 BOARD_BUILD_SYSTEM_ROOT_IMAGE := false
 
+# Vendor ramdisk image for kernel development
+BOARD_BUILD_VENDOR_RAMDISK_IMAGE := true
+
 # Kernel modules
 BOARD_VENDOR_KERNEL_MODULES += \
     $(wildcard $(TARGET_KERNEL_DIR)/*.ko)
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 10cf0fb..1ca5183 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -72,3 +72,8 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb@1.3-service.slider)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb@1.3-service.slider.rc)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb@1.3-service.slider.xml)
+
+# Power Stats HAL 1.0 to AIDL
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.power.stats@1.0-service.gs101)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.power.stats@1.0-service.gs101.rc)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.power.stats@1.0-service.gs101.xml)
diff --git a/compatibility_matrix.xml b/compatibility_matrix.xml
index 1938442..ed29152 100644
--- a/compatibility_matrix.xml
+++ b/compatibility_matrix.xml
@@ -80,7 +80,7 @@
     </hal>
     <hal format="hidl" optional="true">
         <name>vendor.google.wireless_charger</name>
-        <version>1.2</version>
+        <version>1.3</version>
         <interface>
             <name>IWirelessCharger</name>
             <instance>default</instance>
diff --git a/conf/fstab.gs101 b/conf/fstab.gs101
index 8bfd58c..d649b1b 100644
--- a/conf/fstab.gs101
+++ b/conf/fstab.gs101
@@ -8,13 +8,14 @@
 system_ext                                               /system_ext                 ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
 product                                                  /product                    ext4    ro,barrier=1             wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
 vendor                                                   /vendor                     ext4    ro,barrier=1             wait,slotselect,avb=vbmeta,logical,first_stage_mount
+/dev/block/platform/14700000.ufs/by-name/boot            /boot                       emmc    defaults                 slotselect,avb=boot,first_stage_mount
 /dev/block/platform/14700000.ufs/by-name/efs             /mnt/vendor/efs             ext4    defaults,noatime,rw      wait,check,formattable
 /dev/block/platform/14700000.ufs/by-name/efs_backup      /mnt/vendor/efs_backup      ext4    defaults,noatime,rw      wait,check,formattable
 /dev/block/platform/14700000.ufs/by-name/modem_userdata  /mnt/vendor/modem_userdata  ext4    defaults,noatime,rw      wait,check,formattable
-/dev/block/platform/14700000.ufs/by-name/modem           /mnt/vendor/modem_img       ext4    ro,defaults              wait,slotselect
+/dev/block/platform/14700000.ufs/by-name/modem           /mnt/vendor/modem_img       ext4    ro,defaults,context=u:object_r:modem_img_file:s0    wait,slotselect
 /dev/block/platform/14700000.ufs/by-name/misc            /misc                       emmc    defaults                 wait
 /dev/block/platform/14700000.ufs/by-name/metadata        /metadata                   ext4    noatime,nosuid,nodev,data=journal,commit=1    wait,check,formattable,first_stage_mount,metadata_csum
 /dev/block/platform/14700000.ufs/by-name/pvmfw           /pvmfw                      emmc    defaults                 wait,slotselect,avb=pvmfw,first_stage_mount
-/dev/block/platform/14700000.ufs/by-name/userdata        /data                       f2fs    noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt,compress_extension=apk,compress_extension=apex,compress_extension=so,atgc    latemount,wait,check,quota,formattable,sysfs_path=/dev/sys/block/bootdevice,checkpoint=fs,reservedsize=128M,fileencryption=aes-256-xts:aes-256-cts:v2,keydirectory=/metadata/vold/metadata_encryption,fscompress
+/dev/block/platform/14700000.ufs/by-name/userdata        /data                       f2fs    noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt,compress_extension=apk,compress_extension=apex,compress_extension=so,atgc,checkpoint_merge    latemount,wait,check,quota,formattable,sysfs_path=/dev/sys/block/bootdevice,checkpoint=fs,reservedsize=128M,fileencryption=::inlinecrypt_optimized+wrappedkey_v0,metadata_encryption=:wrappedkey_v0,keydirectory=/metadata/vold/metadata_encryption,fscompress
 /dev/block/zram0                                         none                        swap    defaults                 zramsize=2147483648,max_comp_streams=8,zram_backingdev_size=512M
 /devices/platform/11110000.usb*                          auto                        vfat    defaults                 voldmanaged=usb:auto
diff --git a/conf/fstab.gs101.emmc b/conf/fstab.gs101.emmc
deleted file mode 100644
index 076978d..0000000
--- a/conf/fstab.gs101.emmc
+++ /dev/null
@@ -1,12 +0,0 @@
-# Android fstab file.
-#<src>                  <mnt_point>         <type>    <mnt_flags and options>                               <fs_mgr_flags>
-# The filesystem that contains the filesystem checker binary (typically /system) cannot
-# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
-
-
-#/dev/block/mmcblk0p2    /system             ext4      ro                                                    wait
-/dev/block/mmcblk0p3    /cache              ext4      noatime,nosuid,nodev,nomblk_io_submit,errors=panic    wait
-/dev/block/mmcblk0p4    /data               ext4      noatime,nosuid,nodev,nomblk_io_submit,noauto_da_alloc,errors=panic    wait
-
-# VOLD
-/devices/13d00000.dwmmc2/mmc_host/mmc1		/storage/sdcard		vfat	default	voldmanaged=sdcard:auto
diff --git a/conf/fstab.gs101.sdboot b/conf/fstab.gs101.sdboot
deleted file mode 100644
index dd87955..0000000
--- a/conf/fstab.gs101.sdboot
+++ /dev/null
@@ -1,14 +0,0 @@
-# Android fstab file.
-#<src>                  <mnt_point>         <type>    <mnt_flags and options>                               <fs_mgr_flags>
-# The filesystem that contains the filesystem checker binary (typically /system) cannot
-# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
-
-
-#/dev/block/mmcblk1p2    /system             ext4      ro                                                    wait
-/dev/block/mmcblk1p4    /cache              ext4      noatime,nosuid,nodev,nomblk_io_submit,errors=panic    wait
-/dev/block/mmcblk1p3    /data               ext4      noatime,nosuid,nodev,nomblk_io_submit,noauto_da_alloc,errors=panic    wait
-/dev/block/mmcblk1p8    /efs                ext4      defaults,rw                                           wait
-
-# VOLD
-/devices/10c00000.usb				auto			vfat	default	voldmanaged=usb1:auto
-/devices/10c00000.usb/10c00000.dwc3/xhci-hcd	auto			vfat	default	voldmanaged=usb2:auto
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
index eb36739..c288888 100644
--- a/conf/init.gs101.rc
+++ b/conf/init.gs101.rc
@@ -17,7 +17,6 @@
 on early-init
     mkdir /mnt/vendor/efs 0771 radio system
     mkdir /mnt/vendor/efs_backup 0771 radio system
-    mkdir /mnt/vendor/modem_img 0771 radio system
     mkdir /mnt/vendor/modem_userdata 0771 radio system
     mkdir /mnt/vendor/persist 0771 system system
     mount debugfs /sys/kernel/debug /sys/kernel/debug
@@ -30,7 +29,7 @@
     # Boot time fs tuning
     write /sys/block/sda/queue/iostats 0
     write /sys/block/sda/queue/scheduler bfq
-    write /sys/block/sda/queue/iosched/slice_idle 8
+    write /sys/block/sda/queue/iosched/slice_idle 0
     write /sys/block/sda/queue/nr_requests 256
     write /dev/sys/fs/by-name/userdata/data_io_flag 56
     write /dev/sys/fs/by-name/userdata/node_io_flag 56
@@ -216,8 +215,6 @@
 
 on post-fs-data
     # Log data folder
-    mkdir /data/log 0771 radio system
-    mkdir /data/log/abox 0771 audioserver system
     mkdir /data/vendor 0771 radio system
     mkdir /data/vendor/log 0771 radio system
     mkdir /data/vendor/log/cbd 0771 radio system
@@ -260,7 +257,6 @@
     mkdir /data/vendor/misc/vpn 0771 root system
 
 # Permissions Camera
-    mkdir /data/camera 0777 root root
     mkdir /data/vendor/camera 0770 system camera
     chmod 0755 /sys/kernel/debug/tracing
     restorecon /sys/kernel/debug/tracing/trace_marker
@@ -410,10 +406,6 @@
     chown radio system /mnt/vendor/modem_userdata
     restorecon_recursive /mnt/vendor/modem_userdata
 
-    # Configure multi-bin radio
-    chown radio system /mnt/vendor/modem_img
-    restorecon_recursive /mnt/vendor/modem_img
-
     restorecon_recursive /mnt/vendor/persist
     restorecon_recursive /mnt/vendor/persist/audio
     restorecon_recursive /mnt/vendor/persist/sensors
@@ -442,6 +434,27 @@
     chown system system /sys/class/backlight/panel0-backlight/hbm_mode
     chown system system /sys/devices/platform/exynos-drm/primary-panel/gamma
     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
 
 # Copy DRM Key
 #    copy /system/app/wv.keys /factory/wv.keys
@@ -541,6 +554,7 @@
     # Runtime fs tuning
     write /sys/block/sda/queue/nr_requests 128
     write /sys/block/sda/queue/iostats 1
+    write /sys/block/sda/queue/iosched/slice_idle 8
     write /dev/sys/fs/by-name/userdata/data_io_flag 8
     write /dev/sys/fs/by-name/userdata/node_io_flag 8
 
diff --git a/device-common.mk b/device-common.mk
index d0e4ca1..f0b2bda 100644
--- a/device-common.mk
+++ b/device-common.mk
@@ -20,3 +20,6 @@
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml
 
+# Factory OTA
+-include vendor/google/factoryota/client/factoryota.mk
+
diff --git a/device.mk b/device.mk
index 17b0e98..9a8508e 100644
--- a/device.mk
+++ b/device.mk
@@ -57,21 +57,6 @@
 LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
 endif
 
-LOCAL_USES_SDMMC_BOOT := false
-LOCAL_USES_UFS_BOOT := true
-LOCAL_USES_EMMC_BOOT := false
-
-# Metadata Encryption
-# Because the kernel interface to dm-default-key changed in Android R,
-# you also need to ensure that you have set the correct value for
-# PRODUCT_SHIPPING_API_LEVEL in device.mk. For example, if your device
-# launches with Android R (API level 30), device.mk should contain:
-#     PRODUCT_SHIPPING_API_LEVEL := 30
-# You can also set the following system property to force the use of
-# the new dm-default-key API regardless of shipping API level:
-PRODUCT_PROPERTY_OVERRIDES += \
-	ro.crypto.dm_default_key.options_format.version=2
-
 # OEM Unlock reporting
 PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
 	ro.oem_unlock_supported=1
@@ -221,23 +206,12 @@
 # Recovery files
 PRODUCT_COPY_FILES += \
 	device/google/gs101/conf/init.recovery.device.rc:$(TARGET_COPY_OUT_RECOVERY)/root/init.recovery.gs101.rc
-ifeq ($(LOCAL_USES_SDMMC_BOOT),true)
-PRODUCT_COPY_FILES += \
-	device/google/gs101/conf/fstab.gs101.sdboot:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
-	device/google/gs101/conf/fstab.gs101.sdboot:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101
-else
-ifeq ($(LOCAL_USES_UFS_BOOT),true)
+
+# Fstab files
 PRODUCT_COPY_FILES += \
 	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
-	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101 \
 	device/google/gs101/conf/fstab.persist:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.persist \
 	device/google/gs101/conf/fstab.gs101:$(TARGET_COPY_OUT_VENDOR_RAMDISK)/first_stage_ramdisk/fstab.gs101
-else
-PRODUCT_COPY_FILES += \
-	device/google/gs101/conf/fstab.gs101.emmc:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.gs101 \
-	device/google/gs101/conf/fstab.gs101.emmc:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.gs101
-endif
-endif
 
 # Shell scripts
 PRODUCT_COPY_FILES += \
@@ -281,9 +255,6 @@
 	tune2fs.vendor_ramdisk \
 	resize2fs.vendor_ramdisk
 
-PRODUCT_PROPERTY_OVERRIDES += \
-	ro.crypto.volume.filenames_mode=aes-256-cts
-
 # Userdata Checkpointing OTA GC
 PRODUCT_PACKAGES += \
 	checkpoint_gc
@@ -393,10 +364,6 @@
 
 # PowerStats HAL
 PRODUCT_PACKAGES += \
-	android.hardware.power.stats@1.0-service.gs101
-
-# PowerStats AIDL HAL
-PRODUCT_PACKAGES += \
 	android.hardware.power.stats-service.pixel
 
 # dumpstate HAL
@@ -831,6 +798,10 @@
 # Dynamic Partitions
 PRODUCT_USE_DYNAMIC_PARTITIONS := true
 
+# Use FUSE passthrough
+PRODUCT_PRODUCT_PROPERTIES += \
+	persist.sys.fuse.passthrough.enable=true
+
 # Use /product/etc/fstab.postinstall to mount system_other
 PRODUCT_PRODUCT_PROPERTIES += \
 	ro.postinstall.fstab.prefix=/product
@@ -978,9 +949,6 @@
 	Tag \
 	android.hardware.nfc@1.2-service.st
 
-PRODUCT_COPY_FILES += \
-	device/google/gs101/nfc/libnfc-nci.conf:$(TARGET_COPY_OUT_PRODUCT)/etc/libnfc-nci.conf
-
 # SecureElement
 PRODUCT_COPY_FILES += \
 	frameworks/native/data/etc/android.hardware.se.omapi.ese.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.se.omapi.ese.xml \
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index cd5aa6d..7d5bce8 100644
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -377,160 +377,216 @@
 
 // Dump items related to touch
 void DumpstateDevice::dumpTouchSection(int fd) {
-    const char c2_spi_path[] = "/sys/class/spi_master/spi11/spi11.0";
-    const char r3_spi_path[] = "/sys/devices/virtual/sec/tsp";
+    const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
+                                      "/proc/fts/driver_test",
+                                      "/sys/class/spi_master/spi6/spi6.0",
+                                      "/proc/fts_ext/driver_test"};
+    const char lsi_spi_path[] = "/sys/devices/virtual/sec/tsp";
     char cmd[256];
 
-    snprintf(cmd, sizeof(cmd), "%s/appid", c2_spi_path);
-    if (!access(cmd, R_OK)) {
-        // Touch firmware version
-        DumpFileToFd(fd, "STM touch firmware version", cmd);
+    for (int i = 0; i < 4; i+=2) {
+        snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo A0 01 > %s", stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Force Set AP as Bus Owner",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
 
-        // Touch controller status
-        snprintf(cmd, sizeof(cmd), "%s/status", c2_spi_path);
-        DumpFileToFd(fd, "STM touch status", cmd);
+        snprintf(cmd, sizeof(cmd), "%s/appid", stm_cmd_path[i]);
+        if (!access(cmd, R_OK)) {
+            // Touch firmware version
+            DumpFileToFd(fd, "STM touch firmware version", cmd);
 
-        // Mutual raw data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 13 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
+            // Touch controller status
+            snprintf(cmd, sizeof(cmd), "%s/status", stm_cmd_path[i]);
+            DumpFileToFd(fd, "STM touch status", cmd);
 
-        // Mutual strength data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 17 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+            // Mutual raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 13 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
 
-        // Self raw data
-        snprintf(cmd, sizeof(cmd),
-                 "echo 15 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
-                 c2_spi_path, c2_spi_path);
-        RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
+            // Mutual strength data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 17 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+
+            // Self raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 15 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo 23 00 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 23 03 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Baseline Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 23 02 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Strength Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 00 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 03 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Baseline Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 24 02 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Strength Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 32 10 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 32 11 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Mutual Low Power Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 33 12 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Self Compensation",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 34 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Golden Mutual Raw Data",
+                           {"/vendor/bin/sh", "-c", cmd});
+
+            snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 24 80 > %s",
+                     stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - HW reset",
+                           {"/vendor/bin/sh", "-c", cmd});
+            snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 68 08 > %s",
+                     stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - Hibernate Memory",
+                           {"/vendor/bin/sh", "-c", cmd});
+            snprintf(cmd, sizeof(cmd),
+                     "echo 02 FB 00 04 3F D8 00 10 01 > %s && cat %s",
+                     stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Packaging Plant - Read 16 bytes from Address 0x00041FD8",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        snprintf(cmd, sizeof(cmd), "%s/stm_fts_cmd", stm_cmd_path[i]);
+        if (!access(cmd, R_OK)) {
+            // ITO raw data
+            snprintf(cmd, sizeof(cmd),
+                     "echo 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+                     stm_cmd_path[i], stm_cmd_path[i]);
+            RunCommandToFd(fd, "ITO Raw", {"/vendor/bin/sh", "-c", cmd});
+        }
+
+        if (!access(cmd, R_OK)) {
+            snprintf(cmd, sizeof(cmd), "echo A0 00 > %s", stm_cmd_path[i + 1]);
+            RunCommandToFd(fd, "Restore Bus Owner",
+                           {"/vendor/bin/sh", "-c", cmd});
+        }
     }
 
-    if (!access("/proc/fts/driver_test", R_OK)) {
-        RunCommandToFd(fd, "Mutual Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 00 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Baseline Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 03 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Strength Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 23 02 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 00 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Baseline Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 03 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Strength Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 24 02 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Mutual Compensation",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 32 10 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Self Compensation",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 33 12 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-        RunCommandToFd(fd, "Golden Mutual Raw Data",
-                       {"/vendor/bin/sh", "-c",
-                        "echo 34 > /proc/fts/driver_test && "
-                        "cat /proc/fts/driver_test"});
-    }
-    if (!access(r3_spi_path, R_OK)) {
+    if (!access(lsi_spi_path, R_OK)) {
         // Enable: force touch active
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "force_touch_active,1",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
 
         // Firmware info
-        snprintf(cmd, sizeof(cmd), "%s/fw_version", r3_spi_path);
+        snprintf(cmd, sizeof(cmd), "%s/fw_version", lsi_spi_path);
         DumpFileToFd(fd, "LSI firmware version", cmd);
 
         // Touch status
-        snprintf(cmd, sizeof(cmd), "%s/status", r3_spi_path);
+        snprintf(cmd, sizeof(cmd), "%s/status", lsi_spi_path);
         DumpFileToFd(fd, "LSI touch status", cmd);
 
         // Calibration info
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "get_mis_cal_info",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Calibration info", {"/vendor/bin/sh", "-c", cmd});
 
         // Mutual strength
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_delta_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
 
         // Self strength
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_self_delta_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Self Strength", {"/vendor/bin/sh", "-c", cmd});
 
         // Raw cap
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawcap_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Mutual Raw Cap", {"/vendor/bin/sh", "-c", cmd});
 
         // Self raw cap
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_self_rawcap_read_all",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Self Raw Cap", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_AMBIENT_DATA
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,3",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_AMBIENT_DATA", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_DECODED_DATA
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,5",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_DECODED_DATA", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_NOI_P2P_MIN
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,30",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_NOI_P2P_MIN", {"/vendor/bin/sh", "-c", cmd});
 
         // TYPE_NOI_P2P_MAX
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "run_rawdata_read_type,31",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "TYPE_NOI_P2P_MAX", {"/vendor/bin/sh", "-c", cmd});
 
         // Disable: force touch active
         snprintf(cmd, sizeof(cmd),
                  "echo %s > %s/cmd && cat %s/cmd_result",
                  "force_touch_active,0",
-                 r3_spi_path, r3_spi_path);
+                 lsi_spi_path, lsi_spi_path);
         RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
     }
 }
diff --git a/interfaces/boot/1.2/BootControl.cpp b/interfaces/boot/1.2/BootControl.cpp
index b754404..8a24334 100644
--- a/interfaces/boot/1.2/BootControl.cpp
+++ b/interfaces/boot/1.2/BootControl.cpp
@@ -17,16 +17,15 @@
 #define LOG_TAG "bootcontrolhal"
 
 #include "BootControl.h"
-#include "GptUtils.h"
 
 #include <android-base/file.h>
 #include <android-base/unique_fd.h>
 #include <bootloader_message/bootloader_message.h>
 #include <cutils/properties.h>
-//#include <hardware/boot_control.h>
 #include <libboot_control/libboot_control.h>
 #include <log/log.h>
 
+#include "GptUtils.h"
 
 namespace android {
 namespace hardware {
@@ -37,12 +36,14 @@
 using android::bootable::GetMiscVirtualAbMergeStatus;
 using android::bootable::InitMiscVirtualAbMessageIfNeeded;
 using android::bootable::SetMiscVirtualAbMergeStatus;
-using android::hardware::boot::V1_1::MergeStatus;
-using android::hardware::boot::V1_0::CommandResult;
 using android::hardware::boot::V1_0::BoolResult;
+using android::hardware::boot::V1_0::CommandResult;
+using android::hardware::boot::V1_1::MergeStatus;
 
 namespace {
 
+// clang-format off
+
 #define BOOT_A_PATH     "/dev/block/by-name/boot_a"
 #define BOOT_B_PATH     "/dev/block/by-name/boot_b"
 
@@ -59,6 +60,8 @@
 #define AB_ATTR_MAX_PRIORITY        3UL
 #define AB_ATTR_MAX_RETRY_COUNT     3UL
 
+// clang-format on
+
 static std::string getDevPath(uint32_t slot) {
     char real_path[PATH_MAX];
 
@@ -122,17 +125,17 @@
     return 0;
 }
 
-}
+}  // namespace
 
 // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
 Return<uint32_t> BootControl::getNumberSlots() {
     uint32_t slots = 0;
 
     if (access(BOOT_A_PATH, F_OK) == 0)
-      slots++;
+        slots++;
 
     if (access(BOOT_B_PATH, F_OK) == 0)
-      slots++;
+        slots++;
 
     return slots;
 }
@@ -189,14 +192,14 @@
         return Void();
     }
 
-    std::string boot_lun_path = std::string("/sys/devices/platform/") +
-                                boot_dev + "/pixel/boot_lun_enabled";
+    std::string boot_lun_path =
+            std::string("/sys/devices/platform/") + boot_dev + "/pixel/boot_lun_enabled";
     int fd = open(boot_lun_path.c_str(), O_RDWR);
     if (fd < 0) {
         // Try old path for kernels < 5.4
         // TODO: remove once kernel 4.19 support is deprecated
-        std::string boot_lun_path = std::string("/sys/devices/platform/") +
-                                    boot_dev + "/attributes/boot_lun_enabled";
+        std::string boot_lun_path =
+                std::string("/sys/devices/platform/") + boot_dev + "/attributes/boot_lun_enabled";
         fd = open(boot_lun_path.c_str(), O_RDWR);
         if (fd < 0) {
             _hidl_cb({false, "failed to open ufs attr boot_lun_enabled"});
@@ -257,7 +260,8 @@
     return isSlotFlagSet(slot, AB_ATTR_UNBOOTABLE) ? BoolResult::FALSE : BoolResult::TRUE;
 }
 
-Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(uint32_t slot) {
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(
+        uint32_t slot) {
     if (getNumberSlots() == 0) {
         // just return true so that we don't we another call trying to mark it as successful
         // when there is no slots
@@ -278,7 +282,8 @@
     return InitMiscVirtualAbMessageIfNeeded();
 }
 
-Return<bool> BootControl::setSnapshotMergeStatus(::android::hardware::boot::V1_1::MergeStatus status) {
+Return<bool> BootControl::setSnapshotMergeStatus(
+        ::android::hardware::boot::V1_1::MergeStatus status) {
     return SetMiscVirtualAbMergeStatus(getCurrentSlot(), status);
 }
 
@@ -300,8 +305,7 @@
 
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
-
-IBootControl* HIDL_FETCH_IBootControl(const char* /* name */) {
+IBootControl *HIDL_FETCH_IBootControl(const char * /* name */) {
     auto module = new BootControl();
 
     module->Init();
diff --git a/interfaces/boot/1.2/BootControl.h b/interfaces/boot/1.2/BootControl.h
index b601779..17b5f0f 100644
--- a/interfaces/boot/1.2/BootControl.h
+++ b/interfaces/boot/1.2/BootControl.h
@@ -26,16 +26,15 @@
 namespace V1_2 {
 namespace implementation {
 
+using ::android::sp;
 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::sp;
 
 struct BootControl : public IBootControl {
-
     bool Init();
 
     // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
@@ -45,22 +44,23 @@
     Return<void> setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) override;
     Return<void> setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) override;
     Return<::android::hardware::boot::V1_0::BoolResult> isSlotBootable(uint32_t slot) override;
-    Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(uint32_t slot) override;
+    Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(
+            uint32_t slot) override;
     Return<void> getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) override;
 
     // Methods from ::android::hardware::boot::V1_1::IBootControl follow.
-    Return<bool> setSnapshotMergeStatus(::android::hardware::boot::V1_1::MergeStatus status) override;
+    Return<bool> setSnapshotMergeStatus(
+            ::android::hardware::boot::V1_1::MergeStatus status) override;
     Return<::android::hardware::boot::V1_1::MergeStatus> getSnapshotMergeStatus() override;
 
     // Methods from ::android::hardware::boot::V1_2::IBootControl follow.
     Return<uint32_t> getActiveBootSlot() override;
 
     // Methods from ::android::hidl::base::V1_0::IBase follow.
-
 };
 
 // FIXME: most likely delete, this is only for passthrough implementations
-extern "C" IBootControl* HIDL_FETCH_IBootControl(const char* name);
+extern "C" IBootControl *HIDL_FETCH_IBootControl(const char *name);
 
 }  // namespace implementation
 }  // namespace V1_2
diff --git a/interfaces/boot/1.2/GptUtils.cpp b/interfaces/boot/1.2/GptUtils.cpp
index 514aa89..25088e7 100644
--- a/interfaces/boot/1.2/GptUtils.cpp
+++ b/interfaces/boot/1.2/GptUtils.cpp
@@ -18,10 +18,10 @@
 
 #include "GptUtils.h"
 
-#include <errno.h>
-#include <log/log.h>
 #include <android-base/file.h>
+#include <errno.h>
 #include <linux/fs.h>
+#include <log/log.h>
 #include <zlib.h>
 
 namespace android {
@@ -32,8 +32,7 @@
 
 namespace {
 
-static int ValidateGptHeader(gpt_header *gpt)
-{
+static int ValidateGptHeader(gpt_header *gpt) {
     if (gpt->signature != GPT_SIGNATURE) {
         ALOGE("invalid gpt signature 0x%lx\n", gpt->signature);
         return -1;
@@ -52,12 +51,11 @@
     return 0;
 }
 
-}
+}  // namespace
 
 GptUtils::GptUtils(const std::string dev_path) : dev_path(dev_path), fd(0) {}
 
-int GptUtils::Load(void)
-{
+int GptUtils::Load(void) {
     fd = open(dev_path.c_str(), O_RDWR);
     if (fd < 0) {
         ALOGE("failed to open block dev %s, %d\n", dev_path.c_str(), errno);
@@ -102,20 +100,19 @@
     }
 
     if (ValidateGptHeader(&gpt_backup)) {
-        ALOGW("error validating gpt backup\n"); // just warn about it, not fail
+        ALOGW("error validating gpt backup\n");  // just warn about it, not fail
     }
 
     // Create map <partition name, gpt_entry pointer>
     auto get_name = [](const uint16_t *efi_name) {
         char name[37] = {};
-        for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i)
-            name[i] = efi_name[i];
+        for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i) name[i] = efi_name[i];
         return std::string(name);
     };
 
-    for (auto const &e: entry_array) {
+    for (auto const &e : entry_array) {
         if (e.name[0] == 0)
-            break;   // stop at the first partition with no name
+            break;  // stop at the first partition with no name
         std::string s = get_name(e.name);
         entries[s] = const_cast<gpt_entry *>(&e);
     }
@@ -123,19 +120,17 @@
     return 0;
 }
 
-gpt_entry *GptUtils::GetPartitionEntry(std::string name)
-{
-    return entries.find(name) != entries.end() ?  entries[name] : nullptr;
+gpt_entry *GptUtils::GetPartitionEntry(std::string name) {
+    return entries.find(name) != entries.end() ? entries[name] : nullptr;
 }
 
-int GptUtils::Sync(void)
-{
+int GptUtils::Sync(void) {
     if (!fd)
         return -1;
 
     // calculate crc and check if we need to update gpt
     gpt_primary.entries_crc32 = crc32(0, reinterpret_cast<uint8_t *>(entry_array.data()),
-                                entry_array.size() * sizeof(gpt_entry));
+                                      entry_array.size() * sizeof(gpt_entry));
 
     // save old crc
     uint32_t crc = gpt_primary.crc32;
@@ -143,7 +138,7 @@
 
     gpt_primary.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_primary), sizeof gpt_primary);
     if (crc == gpt_primary.crc32)
-        return 0; // nothing to do (no changes)
+        return 0;  // nothing to do (no changes)
 
     ALOGI("updating GPT\n");
 
@@ -161,7 +156,7 @@
         return -1;
     }
 
-    //update GPT backup entries and backup
+    // update GPT backup entries and backup
     lseek64(fd, block_size * gpt_backup.start_lba, SEEK_SET);
     ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
     if (ret < 0) {
@@ -184,8 +179,7 @@
     return 0;
 }
 
-GptUtils::~GptUtils()
-{
+GptUtils::~GptUtils() {
     if (fd) {
         Sync();
         close(fd);
diff --git a/interfaces/boot/1.2/GptUtils.h b/interfaces/boot/1.2/GptUtils.h
index 8965118..a2bed33 100644
--- a/interfaces/boot/1.2/GptUtils.h
+++ b/interfaces/boot/1.2/GptUtils.h
@@ -16,9 +16,9 @@
 
 #pragma once
 
+#include <map>
 #include <string>
 #include <vector>
-#include <map>
 
 namespace android {
 namespace hardware {
@@ -26,7 +26,7 @@
 namespace V1_2 {
 namespace implementation {
 
-#define GPT_SIGNATURE       0x5452415020494645UL
+#define GPT_SIGNATURE 0x5452415020494645UL
 
 typedef struct {
     uint8_t type_guid[16];
@@ -55,21 +55,21 @@
 } __attribute__((packed)) gpt_header;
 
 class GptUtils {
-   public:
+  public:
     GptUtils(const std::string dev_path);
     int Load(void);
     gpt_entry *GetPartitionEntry(std::string name);
     int Sync(void);
     ~GptUtils();
 
-   private:
+  private:
     std::string dev_path;
     int fd;
     uint32_t block_size;
     gpt_header gpt_primary;
     gpt_header gpt_backup;
     std::vector<gpt_entry> entry_array;
-    std::map<std::string, gpt_entry *>entries;
+    std::map<std::string, gpt_entry *> entries;
 };
 
 }  // namespace implementation
diff --git a/interfaces/boot/1.2/service.cpp b/interfaces/boot/1.2/service.cpp
index 158c456..f07682e 100644
--- a/interfaces/boot/1.2/service.cpp
+++ b/interfaces/boot/1.2/service.cpp
@@ -16,10 +16,11 @@
 
 #define LOG_TAG "android.hardware.boot@1.2-service"
 
-#include <log/log.h>
+#include <android/hardware/boot/1.2/IBootControl.h>
 #include <hidl/HidlTransportSupport.h>
 #include <hidl/Status.h>
-#include <android/hardware/boot/1.2/IBootControl.h>
+#include <log/log.h>
+
 #include "BootControl.h"
 
 using ::android::status_t;
@@ -27,9 +28,9 @@
 using ::android::hardware::boot::V1_2::IBootControl;
 
 using ::android::hardware::boot::V1_2::implementation::BootControl;
-//using ::android::hardware::boot::implementation::BootControl;
+// using ::android::hardware::boot::implementation::BootControl;
 
-int main (int /* argc */, char * /* argv */ []) {
+int main(int /* argc */, char * /* argv */[]) {
     // This function must be called before you join to ensure the proper
     // number of threads are created. The threadpool will never exceed
     // size one because of this call.
@@ -38,12 +39,12 @@
     ::android::sp bootctrl = new BootControl();
     const status_t status = bootctrl->registerAsService();
     if (status != ::android::OK) {
-        return 1; // or handle error
+        return 1;  // or handle error
     }
 
     // Adds this thread to the threadpool, resulting in one total
     // thread in the threadpool. We could also do other things, but
     // would have to specify 'false' to willJoin in configureRpcThreadpool.
     ::android::hardware::joinRpcThreadpool();
-    return 1; // joinRpcThreadpool should never return
+    return 1;  // joinRpcThreadpool should never return
 }
diff --git a/manifest-gralloc3.xml b/manifest-gralloc3.xml
index 3142a99..6b5010c 100644
--- a/manifest-gralloc3.xml
+++ b/manifest-gralloc3.xml
@@ -223,7 +223,7 @@
     <hal format="hidl">
       <name>vendor.google.wireless_charger</name>
       <transport>hwbinder</transport>
-      <version>1.2</version>
+      <version>1.3</version>
       <interface>
         <name>IWirelessCharger</name>
         <instance>default</instance>
diff --git a/manifest.xml b/manifest.xml
index 8dd4c31..2c0a308 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -223,7 +223,7 @@
     <hal format="hidl">
       <name>vendor.google.wireless_charger</name>
       <transport>hwbinder</transport>
-      <version>1.2</version>
+      <version>1.3</version>
       <interface>
         <name>IWirelessCharger</name>
         <instance>default</instance>
diff --git a/manifest_64-gralloc3.xml b/manifest_64-gralloc3.xml
index 750dbc2..3688484 100644
--- a/manifest_64-gralloc3.xml
+++ b/manifest_64-gralloc3.xml
@@ -212,7 +212,7 @@
     <hal format="hidl">
       <name>vendor.google.wireless_charger</name>
       <transport>hwbinder</transport>
-      <version>1.2</version>
+      <version>1.3</version>
       <interface>
         <name>IWirelessCharger</name>
         <instance>default</instance>
diff --git a/manifest_64.xml b/manifest_64.xml
index 7f38648..78f6a01 100644
--- a/manifest_64.xml
+++ b/manifest_64.xml
@@ -212,7 +212,7 @@
     <hal format="hidl">
       <name>vendor.google.wireless_charger</name>
       <transport>hwbinder</transport>
-      <version>1.2</version>
+      <version>1.3</version>
       <interface>
         <name>IWirelessCharger</name>
         <instance>default</instance>
diff --git a/nfc/libnfc-nci.conf b/nfc/libnfc-nci.conf
deleted file mode 100644
index c475161..0000000
--- a/nfc/libnfc-nci.conf
+++ /dev/null
@@ -1,108 +0,0 @@
-###############################################################################
-# Application options
-NFC_DEBUG_ENABLED=0
-
-###############################################################################
-# File used for NFA storage
-NFA_STORAGE="/data/nfc"
-
-###############################################################################
-# Force UICC to only listen to the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F
-UICC_LISTEN_TECH_MASK=0x07
-
-###############################################################################
-# AID for Empty Select command
-# If specified, this AID will be substituted when an Empty SELECT command is
-# detected.  The first byte is the length of the AID.  Maximum length is 16.
-AID_FOR_EMPTY_SELECT={08:A0:00:00:01:51:00:00:00}
-
-###############################################################################
-# When screen is turned off, specify the desired power state of the controller.
-# 0: power-off-sleep state; DEFAULT
-# 1: full-power state
-# 2: screen-off card-emulation (CE4/CE3/CE1 modes are used)
-SCREEN_OFF_POWER_STATE=1
-
-###############################################################################
-# Force tag polling for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B |
-#            NFA_TECHNOLOGY_MASK_F | NFA_TECHNOLOGY_MASK_ISO15693 |
-#            NFA_TECHNOLOGY_MASK_B_PRIME | NFA_TECHNOLOGY_MASK_KOVIO |
-#            NFA_TECHNOLOGY_MASK_ACTIVE
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_B             0x02    /* NFC Technology B             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-# NFA_TECHNOLOGY_MASK_ISO15693      0x08    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_KOVIO         0x20    /* Proprietary Technology       */
-# NFA_TECHNOLOGY_MASK_ACTIVE        0x40    /* NFC Technology Active        */
-POLLING_TECH_MASK=0x2F
-
-###############################################################################
-# Force P2P to only listen for the following technology(s).
-# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h.
-# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F |
-# NFA_TECHNOLOGY_MASK_ACTIVE
-#
-# Notable bits:
-# NFA_TECHNOLOGY_MASK_A             0x01    /* NFC Technology A             */
-# NFA_TECHNOLOGY_MASK_F             0x04    /* NFC Technology F             */
-# NFA_TECHNOLOGY_MASK_ACTIVE         0x40    /* NFC Technology Active        */
-P2P_LISTEN_TECH_MASK=0x00
-
-PRESERVE_STORAGE=0x01
-
-###############################################################################
-# Override the stack default for NFA_EE_MAX_EE_SUPPORTED set in nfc_target.h.
-# The value is set to 3 by default as it assumes we will discover 0xF2,
-# 0xF3, and 0xF4. If a platform will exclude and SE, this value can be reduced
-# so that the stack will not wait any longer than necessary.
-# Maximum EE supported number
-# NXP PN547C2 0x02
-# NXP PN65T 0x03
-# NXP PN548C2 0x02
-# NXP PN66T 0x03
-NFA_MAX_EE_SUPPORTED=0x02
-
-###############################################################################
-# AID_MATCHING constants
-# AID_MATCHING_EXACT_ONLY 0x00
-# AID_MATCHING_EXACT_OR_PREFIX 0x01
-# AID_MATCHING_PREFIX_ONLY 0x02
-# AID_MATCHING_EXACT_OR_SUBSET_OR_PREFIX 0x03
-AID_MATCHING_MODE=0x03
-
-###############################################################################
-#Set the default Felica T3T System Code :
-#This settings will be used when application does not set this parameter
-DEFAULT_SYS_CODE={FE:FE}
-
-###############################################################################
-# Value of NIC parameter NFCC_COFNIG_CONTROL
-# 0x00  NFCC is not allowed to manage RF configuration
-# 0x01  NFCC is allowed to manage RF configuration
-NFCC_CONFIG_CONTROL=0x01
-
-###############################################################################
-#Set if the AID routing should be blocked for the power modes not supported.
-NFA_AID_BLOCK_ROUTE=1
-
-###############################################################################
-#Set the OffHost AID supported power state:
-OFFHOST_AID_ROUTE_PWR_STATE=0x3B
-
-###############################################################################
-# Mifare Tag implementation
-# 0: General implementation
-# 1: Legacy implementation
-LEGACY_MIFARE_READER=0
-
-###############################################################################
-# Nfc recovery implementation
-# 0: Crash Nfc Service
-# 1: Toggle Nfc state
-RECOVERY_OPTION=1
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 1e2628a..d2d9f0f 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -75,9 +75,6 @@
     <!-- Type of the ambient tap sensor. Empty if ambient tap is not supported. -->
     <string name="config_dozeTapSensorType" translatable="false">com.google.sensor.single_touch</string>
 
-    <!-- Type of the udfps long press sensor. Empty if long press is not supported. -->
-    <string name="config_dozeUdfpsLongPressSensorType" translatable="false">com.google.sensor.long_press</string>
-
     <!-- If this is true, the screen will come on when you unplug usb/power/whatever. -->
     <bool name="config_unplugTurnsOnScreen">true</bool>
 
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index 07e16f1..7c7066c 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -23,50 +23,11 @@
 }
 
 cc_binary {
-    // TODO(b/167628903) : remove this
-    name: "android.hardware.power.stats@1.0-service.gs101",
-    header_libs: [
-        "device_kernel_headers",
-    ],
-    relative_install_path: "hw",
-    init_rc: ["android.hardware.power.stats@1.0-service.gs101.rc"],
-    vintf_fragments: ["android.hardware.power.stats@1.0-service.gs101.xml"],
-    srcs: [
-        "AocStateResidencyDataProvider.cpp",
-        "DvfsStateResidencyDataProvider.cpp",
-        "RailDataProvider.cpp",
-        "service.cpp",
-        "UfsStateResidencyDataProvider.cpp",
-    ],
-    cflags: [
-        "-Wall",
-        "-Werror",
-    ],
-    static_libs: [
-       "libpixelpowerstats",
-    ],
-    shared_libs: [
-        "android.hardware.power.stats@1.0",
-        "pixelpowerstats_provider_aidl_interface-cpp",
-        "libbase",
-        "libbinder",
-        "libcutils",
-        "libfmq",
-        "libhidlbase",
-        "liblog",
-        "libutils",
-    ],
-    vendor: true,
-}
-
-cc_binary {
     name: "android.hardware.power.stats-service.pixel",
     init_rc: ["android.hardware.power.stats-service.pixel.rc"],
     vintf_fragments: ["android.hardware.power.stats-service.pixel.xml"],
     srcs: [
-        "AocStateResidencyDataProviderAidl.cpp",
-        "DvfsStateResidencyDataProviderAidl.cpp",
-        "serviceaidl.cpp"
+        "*.cpp",
     ],
     cflags: [
         "-Wall",
@@ -81,6 +42,7 @@
         "liblog",
         "libutils",
         "libbinder_ndk",
+        "pixel_stateresidency_provider_aidl_interface-ndk_platform",
         "android.hardware.power.stats-V1-ndk_platform",
     ],
     relative_install_path: "hw",
diff --git a/powerstats/AocStateResidencyDataProvider.cpp b/powerstats/AocStateResidencyDataProvider.cpp
index 41c75bc..c64496d 100644
--- a/powerstats/AocStateResidencyDataProvider.cpp
+++ b/powerstats/AocStateResidencyDataProvider.cpp
@@ -13,29 +13,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_TAG "libpixelpowerstats"
 
 #include "AocStateResidencyDataProvider.h"
 
 #include <android-base/logging.h>
 
-#include <utility>
-
+namespace aidl {
 namespace android {
 namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
+namespace power {
+namespace stats {
 
-AocStateResidencyDataProvider::AocStateResidencyDataProvider(
-        std::vector<std::pair<uint32_t, std::string>> ids,
-        std::vector<std::pair<std::string, std::string>> states) {
+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; };
-    StateResidencyConfig config = {
+    GenericStateResidencyDataProvider::StateResidencyConfig config = {
             .entryCountSupported = true,
             .entryCountPrefix = "Counter:",
             .totalTimeSupported = true,
@@ -45,61 +41,88 @@
             .lastEntryPrefix = "Time last entered:",
             .lastEntryTransform = aocTickToMs,
     };
-    uint32_t state_id;
-    for (auto &id : ids) {
-        state_id = 1;
-        for (auto &state : states) {
+    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::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));
-            sdp->addEntity(id.first, PowerEntityConfig(state_id++, "",
-                                                       generateGenericStateResidencyConfigs(
-                                                               config, aocStateHeaders)));
-            mProviders.push_back(std::move(sdp));
+                    new GenericStateResidencyDataProvider(id.second + state.second, cfgs));
+            mProviders[id.first].push_back(std::move(sdp));
         }
     }
 }
 
-bool AocStateResidencyDataProvider::getResults(
-        std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) {
-    for (auto &provider : mProviders) {
-        provider->getResults(results);
-    }
-    return true;
-}
-
-std::vector<PowerEntityStateSpace> AocStateResidencyDataProvider::getStateSpaces() {
-    // Return state spaces based on all configured providers.
+bool AocStateResidencyDataProvider::getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
     // States from the same power entity are merged.
-    std::map<uint32_t, PowerEntityStateSpace> stateSpaces;
-    for (auto &provider : mProviders) {
-        for (auto &stateSpace : provider->getStateSpaces()) {
-            auto it = stateSpaces.find(stateSpace.powerEntityId);
-            if (it != stateSpaces.end()) {
-                auto &states = it->second.states;
-                auto size = states.size();
-                states.resize(size + stateSpace.states.size());
-                for (uint32_t i = 0; i < stateSpace.states.size(); i++) {
-                    states[size + i] = stateSpace.states[i];
+    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);
                 }
-            } else {
-                stateSpaces.insert(std::pair<uint32_t, PowerEntityStateSpace>(
-                        stateSpace.powerEntityId, stateSpace));
             }
         }
-    }
 
-    std::vector<PowerEntityStateSpace> ret;
-    for (auto &stateSpace : stateSpaces) {
-        ret.push_back(stateSpace.second);
+        residencies->emplace(curEntity, stateResidencies);
     }
     return ret;
 }
 
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
+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
index eef7ce7..5008912 100644
--- a/powerstats/AocStateResidencyDataProvider.h
+++ b/powerstats/AocStateResidencyDataProvider.h
@@ -13,35 +13,33 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef HARDWARE_GOOGLE_PIXEL_POWERSTATS_AOCSTATERESIDENCYDATAPROVIDER_H
-#define HARDWARE_GOOGLE_PIXEL_POWERSTATS_AOCSTATERESIDENCYDATAPROVIDER_H
+#pragma once
 
-#include <pixelpowerstats/GenericStateResidencyDataProvider.h>
-#include <pixelpowerstats/PowerStats.h>
+#include <dataproviders/GenericStateResidencyDataProvider.h>
+#include <PowerStatsAidl.h>
 
+namespace aidl {
 namespace android {
 namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
+namespace power {
+namespace stats {
 
-class AocStateResidencyDataProvider : public IStateResidencyDataProvider {
+class AocStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
   public:
-    AocStateResidencyDataProvider(std::vector<std::pair<uint32_t, std::string>> ids,
+    AocStateResidencyDataProvider(std::vector<std::pair<std::string, std::string>> ids,
                                   std::vector<std::pair<std::string, std::string>> states);
     ~AocStateResidencyDataProvider() = default;
-    bool getResults(
-            std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) override;
-    std::vector<PowerEntityStateSpace> getStateSpaces() override;
+    bool getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
+    std::unordered_map<std::string, std::vector<State>> getInfo() override;
 
   private:
-    std::vector<std::unique_ptr<GenericStateResidencyDataProvider>> mProviders;
+    std::unordered_map<std::string /* entity name */,
+        std::vector<std::unique_ptr<GenericStateResidencyDataProvider>> /* providers */> mProviders;
 };
 
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
+}  // namespace stats
+}  // namespace power
 }  // namespace hardware
 }  // namespace android
-
-#endif  // HARDWARE_GOOGLE_PIXEL_POWERSTATS_AOCSTATERESIDENCYDATAPROVIDER_H
+}  // namespace aidl
\ No newline at end of file
diff --git a/powerstats/AocStateResidencyDataProviderAidl.cpp b/powerstats/AocStateResidencyDataProviderAidl.cpp
deleted file mode 100644
index 3759a66..0000000
--- a/powerstats/AocStateResidencyDataProviderAidl.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 "AocStateResidencyDataProviderAidl.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/AocStateResidencyDataProviderAidl.h b/powerstats/AocStateResidencyDataProviderAidl.h
deleted file mode 100644
index 5008912..0000000
--- a/powerstats/AocStateResidencyDataProviderAidl.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/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
index 95289bd..511159e 100644
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ b/powerstats/DvfsStateResidencyDataProvider.cpp
@@ -13,8 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_TAG "libpixelpowerstats"
-
 #include "DvfsStateResidencyDataProvider.h"
 
 #include <android-base/logging.h>
@@ -29,97 +27,90 @@
 using android::base::StartsWith;
 using android::base::Trim;
 
+static const std::string nameSuffix = "-DVFS";
+
+namespace aidl {
 namespace android {
 namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
+namespace power {
+namespace stats {
 
-DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate)
-    : mPath(std::move(path)), mClockRate(clockRate) {}
+DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate,
+        std::vector<Config> cfgs)
+    : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {}
 
-void DvfsStateResidencyDataProvider::addEntity(
-        uint32_t id, std::string name, std::vector<std::pair<std::string, std::string>> states) {
-    mPowerEntities.push_back({id, name, states});
-}
-
-int32_t DvfsStateResidencyDataProvider::matchEntity(char *line) {
-    for (auto const &entity : mPowerEntities) {
-        if (entity.powerEntityName == Trim(std::string(line))) {
-            return entity.powerEntityId;
+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 *line, int32_t entityId) {
-    uint32_t stateId = 0;
-    for (auto const &entity : mPowerEntities) {
-        if (entityId == entity.powerEntityId) {
-            for (auto const &state : entity.states) {
-                if (StartsWith(Trim(std::string(line)), state.second)) {
-                    return stateId;
-                }
-                stateId++;
-            }
-            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 *line, uint64_t &duration, uint64_t &count) {
+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)) {
+    if (!ParseUint(Trim(parts[3]), count)) {
         return false;
     }
-    if (!ParseUint(Trim(parts[6]), &duration)) {
+    if (!ParseUint(Trim(parts[6]), duration)) {
         return false;
     }
     return true;
 }
 
-bool DvfsStateResidencyDataProvider::getResults(
-        std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) {
+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
-                    << " Error = " << strerror(errno);
+        PLOG(ERROR) << __func__ << ":Failed to open file " << mPath;
         return false;
     }
 
-    for (auto const &stateSpace : getStateSpaces()) {
-        PowerEntityStateResidencyResult result = {.powerEntityId = stateSpace.powerEntityId};
-        result.stateResidencyData.resize(stateSpace.states.size());
-        for (uint32_t i = 0; i < result.stateResidencyData.size(); i++) {
-            result.stateResidencyData[i].powerEntityStateId =
-                    stateSpace.states[i].powerEntityStateId;
+    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;
         }
-        results.insert(std::make_pair(stateSpace.powerEntityId, result));
+        residencies->emplace(powerEntity.powerEntityName + nameSuffix, stateResidency);
     }
 
     size_t len = 0;
     char *line = nullptr;
 
-    int32_t temp = -1, entityId = -1, stateId = -1;
+    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 entityId only when a new valid entity is encountered.
+        // Assign new index only when a new valid entity is encountered.
         if (temp >= 0) {
-            entityId = temp;
+            powerEntityIndex = temp;
+            it = residencies->find(mPowerEntities[powerEntityIndex].powerEntityName + nameSuffix);
         }
-        if (entityId >= 0) {
-            stateId = matchState(line, entityId);
+
+        if (it != residencies->end()) {
+            stateId = matchState(line, mPowerEntities[powerEntityIndex]);
+
             if (stateId >= 0) {
-                if (parseState(line, duration, count)) {
-                    results[entityId].stateResidencyData[stateId].totalTimeInStateMs =
+                if (parseState(line, &duration, &count)) {
+                    it->second[stateId].totalTimeInStateMs =
                             duration / mClockRate;
-                    results[entityId].stateResidencyData[stateId].totalStateEntryCount = count;
+                    it->second[stateId].totalStateEntryCount = count;
                 } else {
                     LOG(ERROR) << "Failed to parse duration and count from [" << std::string(line)
                                << "]";
@@ -134,25 +125,25 @@
     return true;
 }
 
-std::vector<PowerEntityStateSpace> DvfsStateResidencyDataProvider::getStateSpaces() {
-    std::vector<PowerEntityStateSpace> stateSpaces;
-    stateSpaces.reserve(mPowerEntities.size());
+std::unordered_map<std::string, std::vector<State>> DvfsStateResidencyDataProvider::getInfo() {
+    std::unordered_map<std::string, std::vector<State>> info;
     for (auto const &entity : mPowerEntities) {
-        PowerEntityStateSpace s = {.powerEntityId = entity.powerEntityId};
-        s.states.resize(entity.states.size());
-        uint32_t stateId = 0;
+        std::vector<State> stateInfo(entity.states.size());
+        int32_t stateId = 0;
         for (auto const &state : entity.states) {
-            s.states[stateId] = {.powerEntityStateId = stateId,
-                                 .powerEntityStateName = state.first};
+            stateInfo[stateId] = State{
+                .id = stateId,
+                .name = state.first
+            };
             stateId++;
         }
-        stateSpaces.emplace_back(s);
+        info.emplace(entity.powerEntityName + nameSuffix, stateInfo);
     }
-    return stateSpaces;
+    return info;
 }
 
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
+}  // namespace stats
+}  // namespace power
 }  // namespace hardware
 }  // namespace android
+}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.h b/powerstats/DvfsStateResidencyDataProvider.h
index ffa1414..ca8ab22 100644
--- a/powerstats/DvfsStateResidencyDataProvider.h
+++ b/powerstats/DvfsStateResidencyDataProvider.h
@@ -13,71 +13,56 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef HARDWARE_GOOGLE_PIXEL_POWERSTATS_DVFSSTATERESIDENCYDATAPROVIDER_H
-#define HARDWARE_GOOGLE_PIXEL_POWERSTATS_DVFSSTATERESIDENCYDATAPROVIDER_H
+#pragma once
 
-#include <pixelpowerstats/PowerStats.h>
+#include <PowerStatsAidl.h>
 
+namespace aidl {
 namespace android {
 namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
+namespace power {
+namespace stats {
 
-class DvfsStateResidencyDataProvider : public IStateResidencyDataProvider {
+class DvfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
   public:
-    /*
-     * path - path to dvfs sysfs node.
-     * clockRate - clock rate in KHz.
-     */
-    DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate);
-    ~DvfsStateResidencyDataProvider() = default;
-
-    /*
-     * id - the power entity id
-     * name - the power entity name to parse from sysfs node
-     * frequencies - list of pairs (frequency display name, frequency in sysfs
-     *               node).
-     */
-    void addEntity(uint32_t id, std::string name,
-                   std::vector<std::pair<std::string, std::string>> frequencies);
-
-    /*
-     * See IStateResidencyDataProvider::getResults.
-     */
-    bool getResults(
-            std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) override;
-
-    /*
-     * See IStateResidencyDataProvider::getStateSpaces.
-     */
-    std::vector<PowerEntityStateSpace> getStateSpaces() override;
-
-  private:
-    int32_t matchEntity(char *line);
-    int32_t matchState(char *line, int32_t entityId);
-    bool parseState(char *line, uint64_t &duration, uint64_t &count);
-
-    const std::string mPath;
-    const uint64_t mClockRate;
-
-    struct config {
-        // Power entity id.
-        uint32_t powerEntityId;
-
+    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;
     };
-    std::vector<config> mPowerEntities;
+    /*
+     * 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 powerstats
-}  // namespace pixel
-}  // namespace google
+}  // namespace stats
+}  // namespace power
 }  // namespace hardware
 }  // namespace android
-
-#endif  // HARDWARE_GOOGLE_PIXEL_POWERSTATS_DVFSSTATERESIDENCYDATAPROVIDER_H
+}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProviderAidl.cpp b/powerstats/DvfsStateResidencyDataProviderAidl.cpp
deleted file mode 100644
index ca6ea9a..0000000
--- a/powerstats/DvfsStateResidencyDataProviderAidl.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 "DvfsStateResidencyDataProviderAidl.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/DvfsStateResidencyDataProviderAidl.h b/powerstats/DvfsStateResidencyDataProviderAidl.h
deleted file mode 100644
index ca8ab22..0000000
--- a/powerstats/DvfsStateResidencyDataProviderAidl.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/RailDataProvider.cpp b/powerstats/RailDataProvider.cpp
deleted file mode 100644
index d0efc17..0000000
--- a/powerstats/RailDataProvider.cpp
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "libpixelpowerstats"
-
-#include "RailDataProvider.h"
-
-#include <android-base/file.h>
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <android-base/stringprintf.h>
-#include <android-base/strings.h>
-#include <inttypes.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <exception>
-#include <thread>
-
-namespace android {
-namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
-
-#define MAX_FILE_PATH_LEN 128
-#define MAX_DEVICE_NAME_LEN 64
-#define MAX_QUEUE_SIZE 8192
-
-constexpr char kIioDirRoot[] = "/sys/bus/iio/devices/";
-const char *const kDeviceNames[] = {"s2mpg10-odpm", "s2mpg11-odpm"};
-constexpr char kDeviceType[] = "iio:device";
-constexpr uint32_t MAX_SAMPLING_RATE = 10;
-constexpr uint64_t WRITE_TIMEOUT_NS = 1000000000;
-
-#define MAX_RAIL_NAME_LEN 50
-#define STR(s) #s
-#define XSTR(s) STR(s)
-
-void RailDataProvider::findIioPowerMonitorNodes() {
-    struct dirent *ent;
-    int fd;
-    char devName[MAX_DEVICE_NAME_LEN];
-    char filePath[MAX_FILE_PATH_LEN];
-    DIR *iioDir = opendir(kIioDirRoot);
-    if (!iioDir) {
-        ALOGE("Error opening directory: %s, error: %d", kIioDirRoot, errno);
-        return;
-    }
-    while (ent = readdir(iioDir), ent) {
-        if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0 &&
-                strlen(ent->d_name) > strlen(kDeviceType) &&
-                strncmp(ent->d_name, kDeviceType, strlen(kDeviceType)) == 0) {
-            snprintf(filePath, MAX_FILE_PATH_LEN, "%s/%s", ent->d_name, "name");
-            fd = openat(dirfd(iioDir), filePath, O_RDONLY);
-            if (fd < 0) {
-                ALOGW("Failed to open directory: %s, error: %d", filePath, errno);
-                continue;
-            }
-            if (read(fd, devName, MAX_DEVICE_NAME_LEN) < 0) {
-                ALOGW("Failed to read device name from file: %s(%d)", filePath, fd);
-                close(fd);
-                continue;
-            }
-
-            for (const auto &kDeviceName : kDeviceNames) {
-                if (strncmp(devName, kDeviceName, strlen(kDeviceName)) == 0) {
-                    snprintf(filePath, MAX_FILE_PATH_LEN, "%s/%s", kIioDirRoot, ent->d_name);
-                    mOdpm.devicePaths.push_back(filePath);
-                }
-            }
-            close(fd);
-        }
-    }
-    closedir(iioDir);
-    return;
-}
-
-size_t RailDataProvider::parsePowerRails() {
-    std::string data;
-    std::string railFileName;
-    std::string spsFileName;
-    uint32_t index = 0;
-    uint32_t samplingRate;
-    for (const auto &path : mOdpm.devicePaths) {
-        railFileName = path + "/enabled_rails";
-        spsFileName = path + "/sampling_rate";
-        if (!android::base::ReadFileToString(spsFileName, &data)) {
-            ALOGW("Error reading file: %s", spsFileName.c_str());
-            continue;
-        }
-        samplingRate = strtoul(data.c_str(), NULL, 10);
-        if (!samplingRate || samplingRate == ULONG_MAX) {
-            ALOGE("Error parsing: %s", spsFileName.c_str());
-            break;
-        }
-        if (!android::base::ReadFileToString(railFileName, &data)) {
-            ALOGW("Error reading file: %s", railFileName.c_str());
-            continue;
-        }
-        std::istringstream railNames(data);
-        std::string line;
-        while (std::getline(railNames, line)) {
-            std::vector<std::string> words = android::base::Split(line, ":][");
-            if (words.size() == 4) {
-                const std::string channelName = words[1];
-                if (mOdpm.railsInfo.count(channelName) == 0) {
-                    const std::string subsysName = words[3];
-                    mOdpm.railsInfo.emplace(channelName, RailData{.devicePath = path,
-                                                            .index = index,
-                                                            .subsysName = subsysName,
-                                                            .samplingRate = samplingRate});
-                    index++;
-                } else {
-                    ALOGW("There exists rails with the same name (not supported): %s." \
-                        " Only the last occurrence of rail energy will be provided.",
-                        channelName.c_str());
-                }
-            } else {
-                ALOGW("Unexpected format in file: %s", railFileName.c_str());
-            }
-        }
-    }
-    return index;
-}
-
-int RailDataProvider::parseIioEnergyNodeString(const std::string &contents, OnDeviceMmt &odpm) {
-    std::istringstream energyData(contents);
-    std::string line;
-
-    int ret = 0;
-    uint64_t timestamp = 0;
-    bool timestampRead = false;
-
-    while (std::getline(energyData, line)) {
-        bool parseLineSuccess = false;
-
-        if (timestampRead == false) {
-            /* Read timestamp from boot (ms) */
-            if (sscanf(line.c_str(), "t=%" PRIu64, &timestamp) == 1) {
-                if (timestamp == 0 || timestamp == ULLONG_MAX) {
-                    ALOGW("Potentially wrong timestamp: %" PRIu64, timestamp);
-                }
-                timestampRead = true;
-                parseLineSuccess = true;
-            }
-
-        } else {
-            /* Read rail energy */
-            uint64_t energy = 0;
-            char railNameRaw[MAX_RAIL_NAME_LEN + 1];
-            if (sscanf(line.c_str(),
-                       "CH%*d(T=%*" PRIu64 ")[%" XSTR(MAX_RAIL_NAME_LEN) "[^]]], %" PRIu64,
-                       railNameRaw, &energy) == 2) {
-                std::string railName(railNameRaw);
-
-                /* If the count == 0, the rail may not be enabled */
-                /* The count cannot be > 1; mChannelIds is a map */
-                if (odpm.railsInfo.count(railName) == 1) {
-                    size_t index = odpm.railsInfo[railName].index;
-                    odpm.reading[index].index = index;
-                    odpm.reading[index].timestamp = timestamp;
-                    odpm.reading[index].energy = energy;
-                    if (odpm.reading[index].energy == ULLONG_MAX) {
-                        ALOGW("Potentially wrong energy value on rail: %s", railName.c_str());
-                    }
-                }
-                parseLineSuccess = true;
-            }
-        }
-
-        if (parseLineSuccess == false) {
-            ret = -1;
-            break;
-        }
-    }
-
-    return ret;
-}
-
-int RailDataProvider::parseIioEnergyNode(std::string devName) {
-    int ret;
-    std::string data;
-    std::string fileName = devName + "/energy_value";
-    if (!android::base::ReadFileToString(fileName, &data)) {
-        ALOGE("Error reading file: %s", fileName.c_str());
-        return -1;
-    }
-
-    ret = parseIioEnergyNodeString(data, mOdpm);
-    if (ret != 0) {
-        ALOGW("Unexpected format in file: %s", fileName.c_str());
-    }
-    return ret;
-}
-
-Status RailDataProvider::parseIioEnergyNodes() {
-    Status ret = Status::SUCCESS;
-    if (mOdpm.hwEnabled == false) {
-        return Status::NOT_SUPPORTED;
-    }
-
-    for (const auto &devicePath : mOdpm.devicePaths) {
-        if (parseIioEnergyNode(devicePath) < 0) {
-            ALOGE("Error in parsing power stats");
-            ret = Status::FILESYSTEM_ERROR;
-            break;
-        }
-    }
-    return ret;
-}
-
-RailDataProvider::RailDataProvider() {
-    findIioPowerMonitorNodes();
-    size_t numRails = parsePowerRails();
-    if (mOdpm.devicePaths.empty() || numRails == 0) {
-        mOdpm.hwEnabled = false;
-    } else {
-        mOdpm.hwEnabled = true;
-        mOdpm.reading.resize(numRails);
-    }
-}
-
-Return<void> RailDataProvider::getRailInfo(IPowerStats::getRailInfo_cb _hidl_cb) {
-    hidl_vec<RailInfo> rInfo;
-    Status ret = Status::SUCCESS;
-    size_t index;
-    std::lock_guard<std::mutex> _lock(mOdpm.mLock);
-    if (mOdpm.hwEnabled == false) {
-        ALOGI("getRailInfo not supported");
-        _hidl_cb(rInfo, Status::NOT_SUPPORTED);
-        return Void();
-    }
-    rInfo.resize(mOdpm.railsInfo.size());
-    for (const auto &railData : mOdpm.railsInfo) {
-        index = railData.second.index;
-        rInfo[index].railName = railData.first;
-        rInfo[index].subsysName = railData.second.subsysName;
-        rInfo[index].index = index;
-        rInfo[index].samplingRate = railData.second.samplingRate;
-    }
-    _hidl_cb(rInfo, ret);
-    return Void();
-}
-
-Return<void> RailDataProvider::getEnergyData(const hidl_vec<uint32_t> &railIndices,
-                                             IPowerStats::getEnergyData_cb _hidl_cb) {
-    hidl_vec<EnergyData> eVal;
-    std::lock_guard<std::mutex> _lock(mOdpm.mLock);
-    Status ret = parseIioEnergyNodes();
-
-    if (ret != Status::SUCCESS) {
-        ALOGE("Failed to getEnergyData");
-        _hidl_cb(eVal, ret);
-        return Void();
-    }
-
-    if (railIndices.size() == 0) {
-        eVal.resize(mOdpm.railsInfo.size());
-        memcpy(&eVal[0], &mOdpm.reading[0], mOdpm.reading.size() * sizeof(EnergyData));
-    } else {
-        eVal.resize(railIndices.size());
-        int i = 0;
-        for (const auto &railIndex : railIndices) {
-            if (railIndex >= mOdpm.reading.size()) {
-                ret = Status::INVALID_INPUT;
-                eVal.resize(0);
-                break;
-            }
-            memcpy(&eVal[i], &mOdpm.reading[railIndex], sizeof(EnergyData));
-            i++;
-        }
-    }
-    _hidl_cb(eVal, ret);
-    return Void();
-}
-
-Return<void> RailDataProvider::streamEnergyData(uint32_t timeMs, uint32_t samplingRate,
-                                                IPowerStats::streamEnergyData_cb _hidl_cb) {
-    std::lock_guard<std::mutex> _lock(mOdpm.mLock);
-    if (mOdpm.fmqSynchronized != nullptr) {
-        _hidl_cb(MessageQueueSync::Descriptor(), 0, 0, Status::INSUFFICIENT_RESOURCES);
-        return Void();
-    }
-    uint32_t sps = std::min(samplingRate, MAX_SAMPLING_RATE);
-    uint32_t numSamples = timeMs * sps / 1000;
-    mOdpm.fmqSynchronized.reset(new (std::nothrow) MessageQueueSync(MAX_QUEUE_SIZE, true));
-    if (mOdpm.fmqSynchronized == nullptr || mOdpm.fmqSynchronized->isValid() == false) {
-        mOdpm.fmqSynchronized = nullptr;
-        _hidl_cb(MessageQueueSync::Descriptor(), 0, 0, Status::INSUFFICIENT_RESOURCES);
-        return Void();
-    }
-    std::thread pollThread = std::thread([this, sps, numSamples]() {
-        uint64_t sleepTimeUs = 1000000 / sps;
-        uint32_t currSamples = 0;
-        while (currSamples < numSamples) {
-            mOdpm.mLock.lock();
-            if (parseIioEnergyNodes() == Status::SUCCESS) {
-                mOdpm.fmqSynchronized->writeBlocking(&mOdpm.reading[0], mOdpm.reading.size(),
-                                                     WRITE_TIMEOUT_NS);
-                mOdpm.mLock.unlock();
-                currSamples++;
-                if (usleep(sleepTimeUs) < 0) {
-                    ALOGW("Sleep interrupted");
-                    break;
-                }
-            } else {
-                mOdpm.mLock.unlock();
-                break;
-            }
-        }
-        mOdpm.mLock.lock();
-        mOdpm.fmqSynchronized = nullptr;
-        mOdpm.mLock.unlock();
-        return;
-    });
-    pollThread.detach();
-    _hidl_cb(*(mOdpm.fmqSynchronized)->getDesc(), numSamples, mOdpm.reading.size(),
-             Status::SUCCESS);
-    return Void();
-}
-
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
-}  // namespace hardware
-}  // namespace android
diff --git a/powerstats/RailDataProvider.h b/powerstats/RailDataProvider.h
deleted file mode 100644
index 61313e2..0000000
--- a/powerstats/RailDataProvider.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H
-#define ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H
-
-#include <fmq/MessageQueue.h>
-#include <pixelpowerstats/PowerStats.h>
-
-namespace android {
-namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
-
-typedef MessageQueue<EnergyData, kSynchronizedReadWrite> MessageQueueSync;
-struct RailData {
-    std::string devicePath;
-    uint32_t index;
-    std::string subsysName;
-    uint32_t samplingRate;
-};
-
-struct OnDeviceMmt {
-    std::mutex mLock;
-    bool hwEnabled;
-    std::vector<std::string> devicePaths;
-    std::map<std::string, RailData> railsInfo;
-    std::vector<EnergyData> reading;
-    std::unique_ptr<MessageQueueSync> fmqSynchronized;
-};
-
-class RailDataProvider : public IRailDataProvider {
-public:
-    RailDataProvider();
-    // Methods from ::android::hardware::power::stats::V1_0::IPowerStats follow.
-    Return<void> getRailInfo(IPowerStats::getRailInfo_cb _hidl_cb) override;
-    Return<void> getEnergyData(const hidl_vec<uint32_t>& railIndices,
-                        IPowerStats::getEnergyData_cb _hidl_cb) override;
-    Return<void> streamEnergyData(uint32_t timeMs, uint32_t samplingRate,
-                        IPowerStats::streamEnergyData_cb _hidl_cb) override;
- private:
-     OnDeviceMmt mOdpm;
-     void findIioPowerMonitorNodes();
-     size_t parsePowerRails();
-     int parseIioEnergyNodeString(const std::string &contents,
-                    OnDeviceMmt &odpm);
-     int parseIioEnergyNode(std::string devName);
-     Status parseIioEnergyNodes();
-};
-
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
-}  // namespace hardware
-}  // namespace android
-
-#endif  // ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H
diff --git a/powerstats/UfsStateResidencyDataProvider.cpp b/powerstats/UfsStateResidencyDataProvider.cpp
deleted file mode 100644
index 7ca6f3b..0000000
--- a/powerstats/UfsStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,90 +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 "libpixelpowerstats"
-
-#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::ParseUint;
-using android::base::Split;
-using android::base::StartsWith;
-using android::base::Trim;
-
-namespace android {
-namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
-
-const uint32_t HIBERNATE_STATE_ID = 0;
-
-UfsStateResidencyDataProvider::UfsStateResidencyDataProvider(uint32_t powerEntityId)
-    : mPowerEntityId(powerEntityId) {}
-
-bool UfsStateResidencyDataProvider::getResults(
-        std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) {
-    PowerEntityStateResidencyResult result = {
-            .powerEntityId = mPowerEntityId,
-            .stateResidencyData = {{.powerEntityStateId = HIBERNATE_STATE_ID}}};
-
-    // The transform function converts microseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
-
-    std::string prefix = "/sys/bus/platform/devices/14700000.ufs/ufs_stats/";
-
-    result.stateResidencyData[0].totalTimeInStateMs =
-            usecToMs(readStat(prefix + "hibern8_total_us"));
-    result.stateResidencyData[0].totalStateEntryCount = readStat(prefix + "hibern8_exit_cnt");
-    result.stateResidencyData[0].lastEntryTimestampMs =
-            usecToMs(readStat(prefix + "last_hibern8_enter_time"));
-    results.insert(std::make_pair(mPowerEntityId, result));
-    return true;
-}
-
-std::vector<PowerEntityStateSpace> UfsStateResidencyDataProvider::getStateSpaces() {
-    return {{.powerEntityId = mPowerEntityId,
-             .states = {{.powerEntityStateId = HIBERNATE_STATE_ID,
-                         .powerEntityStateName = "HIBERN8"}}}};
-}
-
-uint64_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());
-    uint64_t ret;
-    if (!ParseUint(Trim(std::string(buf)), &ret)) {
-        LOG(ERROR) << "Failed to parse uint64 from [" << std::string(buf) << "]";
-    }
-    return ret;
-}
-
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
-}  // namespace hardware
-}  // namespace android
diff --git a/powerstats/UfsStateResidencyDataProvider.h b/powerstats/UfsStateResidencyDataProvider.h
deleted file mode 100644
index 8d1ea73..0000000
--- a/powerstats/UfsStateResidencyDataProvider.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef HARDWARE_GOOGLE_PIXEL_POWERSTATS_UFSSTATERESIDENCYDATAPROVIDER_H
-#define HARDWARE_GOOGLE_PIXEL_POWERSTATS_UFSSTATERESIDENCYDATAPROVIDER_H
-
-#include <pixelpowerstats/PowerStats.h>
-
-namespace android {
-namespace hardware {
-namespace google {
-namespace pixel {
-namespace powerstats {
-
-class UfsStateResidencyDataProvider : public IStateResidencyDataProvider {
-  public:
-    /*
-     * powerEntityId - id for the UFS power entity.
-     */
-    UfsStateResidencyDataProvider(uint32_t powerEntityId);
-    ~UfsStateResidencyDataProvider() = default;
-
-    /*
-     * See IStateResidencyDataProvider::getResults.
-     */
-    bool getResults(
-            std::unordered_map<uint32_t, PowerEntityStateResidencyResult> &results) override;
-
-    /*
-     * See IStateResidencyDataProvider::getStateSpaces.
-     */
-    std::vector<PowerEntityStateSpace> getStateSpaces() override;
-
-  private:
-    uint64_t readStat(std::string path);
-
-    uint32_t mPowerEntityId;
-};
-
-}  // namespace powerstats
-}  // namespace pixel
-}  // namespace google
-}  // namespace hardware
-}  // namespace android
-
-#endif  // HARDWARE_GOOGLE_PIXEL_POWERSTATS_UFSSTATERESIDENCYDATAPROVIDER_H
diff --git a/powerstats/android.hardware.power.stats@1.0-service.gs101.rc b/powerstats/android.hardware.power.stats@1.0-service.gs101.rc
deleted file mode 100644
index afc3580..0000000
--- a/powerstats/android.hardware.power.stats@1.0-service.gs101.rc
+++ /dev/null
@@ -1,5 +0,0 @@
-service vendor.power.stats-hal-1-0 /vendor/bin/hw/android.hardware.power.stats@1.0-service.gs101
-    interface android.hardware.power.stats@1.0::IPowerStats default
-    class hal
-    user system
-    group system
diff --git a/powerstats/android.hardware.power.stats@1.0-service.gs101.xml b/powerstats/android.hardware.power.stats@1.0-service.gs101.xml
deleted file mode 100644
index 2e9956f..0000000
--- a/powerstats/android.hardware.power.stats@1.0-service.gs101.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest version="1.0" type="device">
-    <hal format="hidl">
-        <name>android.hardware.power.stats</name>
-        <transport>hwbinder</transport>
-        <version>1.0</version>
-        <interface>
-           <name>IPowerStats</name>
-           <instance>default</instance>
-        </interface>
-    </hal>
-</manifest>
diff --git a/powerstats/service.cpp b/powerstats/service.cpp
index 4cf1f35..acf4b8a 100644
--- a/powerstats/service.cpp
+++ b/powerstats/service.cpp
@@ -14,313 +14,174 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "android.hardware.power.stats@1.0-service.gs101"
+#define LOG_TAG "android.hardware.power.stats-service.pixel"
 
-#include <android/log.h>
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
-#include <binder/ProcessState.h>
-#include <hidl/HidlTransportSupport.h>
-#include <pixelpowerstats/AidlStateResidencyDataProvider.h>
-#include <pixelpowerstats/GenericStateResidencyDataProvider.h>
-#include <pixelpowerstats/PowerStats.h>
-
+#include <PowerStatsAidl.h>
 #include "AocStateResidencyDataProvider.h"
 #include "DvfsStateResidencyDataProvider.h"
-#include "RailDataProvider.h"
-#include "UfsStateResidencyDataProvider.h"
+#include <dataproviders/DisplayStateResidencyDataProvider.h>
+#include <dataproviders/GenericStateResidencyDataProvider.h>
+#include <dataproviders/IioEnergyMeterDataProvider.h>
+#include <dataproviders/PowerStatsEnergyConsumer.h>
+#include <dataproviders/PowerStatsEnergyAttribution.h>
+#include <dataproviders/PixelStateResidencyDataProvider.h>
 
-using android::OK;
-using android::sp;
-using android::status_t;
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <log/log.h>
 
-// libhwbinder:
-using android::hardware::configureRpcThreadpool;
-using android::hardware::joinRpcThreadpool;
+using aidl::android::hardware::power::stats::AocStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DisplayStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::EnergyConsumerType;
+using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
+using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::PowerStats;
+using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
 
-// Generated HIDL files
-using android::hardware::power::stats::V1_0::IPowerStats;
-using android::hardware::power::stats::V1_0::PowerEntityType;
-using android::hardware::power::stats::V1_0::implementation::PowerStats;
+constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev";
 
-// Pixel specific
-using android::hardware::google::pixel::powerstats::AidlStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::AocStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::DvfsStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::generateGenericStateResidencyConfigs;
-using android::hardware::google::pixel::powerstats::GenericStateResidencyDataProvider;
-using android::hardware::google::pixel::powerstats::PowerEntityConfig;
-using android::hardware::google::pixel::powerstats::RailDataProvider;
-using android::hardware::google::pixel::powerstats::StateResidencyConfig;
-using android::hardware::google::pixel::powerstats::UfsStateResidencyDataProvider;
-
-// A constant to represnt the number of nanoseconds in one millisecond.
-static const int NS_TO_MS = 1000000;
-
-void addAoCStats(PowerStats *const service) {
+void addAoC(std::shared_ptr<PowerStats> p) {
     std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
 
     // Add AoC cores (a32, ff1, hf0, and hf1)
-    std::vector<std::pair<uint32_t, std::string>> coreIds = {
-            {service->addPowerEntity("AoC-A32", PowerEntityType::SUBSYSTEM), prefix + "a32_"},
-            {service->addPowerEntity("AoC-FF1", PowerEntityType::SUBSYSTEM), prefix + "ff1_"},
-            {service->addPowerEntity("AoC-HF1", PowerEntityType::SUBSYSTEM), prefix + "hf1_"},
-            {service->addPowerEntity("AoC-HF0", PowerEntityType::SUBSYSTEM), prefix + "hf0_"},
+    std::vector<std::pair<std::string, std::string>> coreIds = {
+            {"AoC-A32", prefix + "a32_"},
+            {"AoC-FF1", prefix + "ff1_"},
+            {"AoC-HF1", prefix + "hf1_"},
+            {"AoC-HF0", prefix + "hf0_"},
     };
     std::vector<std::pair<std::string, std::string>> coreStates = {
             {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
-    service->addStateResidencyDataProvider(new AocStateResidencyDataProvider(coreIds, coreStates));
+    p->addStateResidencyDataProvider(std::make_shared<AocStateResidencyDataProvider>(coreIds,
+            coreStates));
 
     // Add AoC voltage stats
-    std::vector<std::pair<uint32_t, std::string>> voltageIds = {
-            {service->addPowerEntity("AoC-Voltage", PowerEntityType::SUBSYSTEM),
-             prefix + "voltage_"},
+    std::vector<std::pair<std::string, std::string>> voltageIds = {
+            {"AoC-Voltage", prefix + "voltage_"},
     };
     std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
                                                                       {"SUD", "super_underdrive"},
                                                                       {"UUD", "ultra_underdrive"},
                                                                       {"UD", "underdrive"}};
-    service->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(voltageIds, voltageStates));
+    p->addStateResidencyDataProvider(
+            std::make_shared<AocStateResidencyDataProvider>(voltageIds, voltageStates));
 
     // Add AoC monitor mode
-    std::vector<std::pair<uint32_t, std::string>> monitorIds = {
-            {service->addPowerEntity("AoC", PowerEntityType::SUBSYSTEM), prefix + "monitor_"},
+    std::vector<std::pair<std::string, std::string>> monitorIds = {
+            {"AoC", prefix + "monitor_"},
     };
     std::vector<std::pair<std::string, std::string>> monitorStates = {
             {"MON", "mode"},
     };
-    service->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(monitorIds, monitorStates));
+    p->addStateResidencyDataProvider(
+            std::make_shared<AocStateResidencyDataProvider>(monitorIds, monitorStates));
 }
 
-void addCpuCStateStats(PowerStats *const service) {
-    // CPU stats are reported in nanoseconds. The transform function
-    // converts nanoseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> cpuNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
-    StateResidencyConfig cStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "down_count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "total_down_time_ns:",
-            .totalTimeTransform = cpuNsToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_down_time_ns:",
-            .lastEntryTransform = cpuNsToMs,
-    };
+void addDvfsStats(std::shared_ptr<PowerStats> p) {
+    // A constant to represent the number of nanoseconds in one millisecond
+    const int NS_TO_MS = 1000000;
 
-    sp<GenericStateResidencyDataProvider> cStateSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/1742048c.acpm_stats/core_stats");
-    for (std::string state :
-         {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11", "CORE20", "CORE21"}) {
-        cStateSdp->addEntity(service->addPowerEntity(state, PowerEntityType::SUBSYSTEM),
-                             PowerEntityConfig("CORES:", generateGenericStateResidencyConfigs(
-                                                                 cStateConfig,
-                                                                 {std::make_pair("DOWN", state)})));
-    }
-    for (std::string state : {"CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
-        cStateSdp->addEntity(
-                service->addPowerEntity(state, PowerEntityType::SUBSYSTEM),
-                PowerEntityConfig("CLUSTERS:",
-                                  generateGenericStateResidencyConfigs(
-                                          cStateConfig, {std::make_pair("DOWN", state)})));
-    }
-    service->addStateResidencyDataProvider(cStateSdp);
+    std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
+
+    cfgs.push_back({"MIF", {
+        std::make_pair("3172KHz", "3172000"),
+        std::make_pair("2730KHz", "2730000"),
+        std::make_pair("2535KHz", "2535000"),
+        std::make_pair("2288KHz", "2288000"),
+        std::make_pair("2028KHz", "2028000"),
+        std::make_pair("1716KHz", "1716000"),
+        std::make_pair("1539KHz", "1539000"),
+        std::make_pair("1352KHz", "1352000"),
+        std::make_pair("1014KHz", "1014000"),
+        std::make_pair("845KHz", "845000"),
+        std::make_pair("676KHz", "676000"),
+        std::make_pair("546KHz", "546000"),
+        std::make_pair("421KHz", "421000"),
+        std::make_pair("0KHz", "0"),
+    }});
+
+    cfgs.push_back({"CL0", {
+        std::make_pair("2024KHz", "2024000"),
+        std::make_pair("1950KHz", "1950000"),
+        std::make_pair("1868KHz", "1868000"),
+        std::make_pair("1803KHz", "1803000"),
+        std::make_pair("1745KHz", "1745000"),
+        std::make_pair("1704KHz", "1704000"),
+        std::make_pair("1598KHz", "1598000"),
+        std::make_pair("1459KHz", "1459000"),
+        std::make_pair("1401KHz", "1401000"),
+        std::make_pair("1328KHz", "1328000"),
+        std::make_pair("1197KHz", "1197000"),
+        std::make_pair("1098KHz", "1098000"),
+        std::make_pair("930KHz", "930000"),
+        std::make_pair("889KHz", "889000"),
+        std::make_pair("738KHz", "738000"),
+        std::make_pair("574KHz", "574000"),
+        std::make_pair("300KHz", "300000"),
+        std::make_pair("0KHz", "0"),
+    }});
+
+    cfgs.push_back({"CL1", {
+        std::make_pair("2253KHz", "2253000"),
+        std::make_pair("2130KHz", "2130000"),
+        std::make_pair("1999KHz", "1999000"),
+        std::make_pair("1836KHz", "1836000"),
+        std::make_pair("1663KHz", "1663000"),
+        std::make_pair("1491KHz", "1491000"),
+        std::make_pair("1328KHz", "1328000"),
+        std::make_pair("1197KHz", "1197000"),
+        std::make_pair("1024KHz", "1024000"),
+        std::make_pair("910KHz", "910000"),
+        std::make_pair("799KHz", "799000"),
+        std::make_pair("696KHz", "696000"),
+        std::make_pair("533KHz", "533000"),
+        std::make_pair("400KHz", "400000"),
+        std::make_pair("0KHz", "0"),
+    }});
+
+    cfgs.push_back({"CL2", {
+        std::make_pair("2630KHz", "2630000"),
+        std::make_pair("2507KHz", "2507000"),
+        std::make_pair("2401KHz", "2401000"),
+        std::make_pair("2302KHz", "2302000"),
+        std::make_pair("2252KHz", "2252000"),
+        std::make_pair("2188KHz", "2188000"),
+        std::make_pair("2048KHz", "2048000"),
+        std::make_pair("1901KHz", "1901000"),
+        std::make_pair("1826KHz", "1826000"),
+        std::make_pair("1745KHz", "1745000"),
+        std::make_pair("1582KHz", "1582000"),
+        std::make_pair("1426KHz", "1426000"),
+        std::make_pair("1277KHz", "1277000"),
+        std::make_pair("1237KHz", "1237000"),
+        std::make_pair("1106KHz", "1106000"),
+        std::make_pair("984KHz", "984000"),
+        std::make_pair("851KHz", "851000"),
+        std::make_pair("848KHz", "848000"),
+        std::make_pair("500KHz", "500000"),
+        std::make_pair("0KHz", "0"),
+    }});
+
+    cfgs.push_back({"TPU", {
+        std::make_pair("1066MHz", "1066000000"),
+    }});
+
+    p->addStateResidencyDataProvider(std::make_shared<DvfsStateResidencyDataProvider>(
+            "/sys/devices/platform/acpm_stats/fvp_stats", NS_TO_MS, cfgs));
 }
 
-void addDvfsStats(PowerStats *const service) {
-    sp<DvfsStateResidencyDataProvider> dvfsSdp = new DvfsStateResidencyDataProvider(
-            "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS);
+void addSoC(std::shared_ptr<PowerStats> p) {
+    // A constant to represent the number of nanoseconds in one millisecond.
+    const int NS_TO_MS = 1000000;
 
-    dvfsSdp->addEntity(service->addPowerEntity("MIF-DVFS", PowerEntityType::SUBSYSTEM), "MIF",
-                       {
-                               std::make_pair("3172KHz", "3172000"),
-                               std::make_pair("2730KHz", "2730000"),
-                               std::make_pair("2535KHz", "2535000"),
-                               std::make_pair("2288KHz", "2288000"),
-                               std::make_pair("2028KHz", "2028000"),
-                               std::make_pair("1716KHz", "1716000"),
-                               std::make_pair("1539KHz", "1539000"),
-                               std::make_pair("1352KHz", "1352000"),
-                               std::make_pair("1014KHz", "1014000"),
-                               std::make_pair("845KHz", "845000"),
-                               std::make_pair("676KHz", "676000"),
-                               std::make_pair("546KHz", "546000"),
-                               std::make_pair("421KHz", "421000"),
-                               std::make_pair("0KHz", "0"),
-                       });
-
-    dvfsSdp->addEntity(service->addPowerEntity("CL0-DVFS", PowerEntityType::SUBSYSTEM), "CL0",
-                       {
-                               std::make_pair("2196KHz", "2196000"),
-                               std::make_pair("2098KHz", "2098000"),
-                               std::make_pair("2024KHz", "2024000"),
-                               std::make_pair("1950KHz", "1950000"),
-                               std::make_pair("1868KHz", "1868000"),
-                               std::make_pair("1745KHz", "1745000"),
-                               std::make_pair("1598KHz", "1598000"),
-                               std::make_pair("1459KHz", "1459000"),
-                               std::make_pair("1328KHz", "1328000"),
-                               std::make_pair("1197KHz", "1197000"),
-                               std::make_pair("1098KHz", "1098000"),
-                               std::make_pair("889KHz", "889000"),
-                               std::make_pair("738KHz", "738000"),
-                               std::make_pair("574KHz", "574000"),
-                               std::make_pair("300KHz", "300000"),
-                               std::make_pair("0KHz", "0"),
-                       });
-
-    dvfsSdp->addEntity(service->addPowerEntity("CL1-DVFS", PowerEntityType::SUBSYSTEM), "CL1",
-                       {
-                               std::make_pair("2466KHz", "2466000"),
-                               std::make_pair("2393KHz", "2393000"),
-                               std::make_pair("2348KHz", "2348000"),
-                               std::make_pair("2253KHz", "2253000"),
-                               std::make_pair("2130KHz", "2130000"),
-                               std::make_pair("1999KHz", "1999000"),
-                               std::make_pair("1836KHz", "1836000"),
-                               std::make_pair("1663KHz", "1663000"),
-                               std::make_pair("1491KHz", "1491000"),
-                               std::make_pair("1328KHz", "1328000"),
-                               std::make_pair("1197KHz", "1197000"),
-                               std::make_pair("1024KHz", "1024000"),
-                               std::make_pair("910KHz", "910000"),
-                               std::make_pair("799KHz", "799000"),
-                               std::make_pair("696KHz", "696000"),
-                               std::make_pair("533KHz", "533000"),
-                               std::make_pair("400KHz", "400000"),
-                               std::make_pair("0KHz", "0"),
-                       });
-
-    dvfsSdp->addEntity(service->addPowerEntity("CL2-DVFS", PowerEntityType::SUBSYSTEM), "CL2",
-                       {
-                               std::make_pair("3195KHz", "3195000"),
-                               std::make_pair("3097KHz", "3097000"),
-                               std::make_pair("2999KHz", "2999000"),
-                               std::make_pair("2900KHz", "2900000"),
-                               std::make_pair("2802KHz", "2802000"),
-                               std::make_pair("2704KHz", "2704000"),
-                               std::make_pair("2630KHz", "2630000"),
-                               std::make_pair("2507KHz", "2507000"),
-                               std::make_pair("2401KHz", "2401000"),
-                               std::make_pair("2302KHz", "2302000"),
-                               std::make_pair("2188KHz", "2188000"),
-                               std::make_pair("2048KHz", "2048000"),
-                               std::make_pair("1901KHz", "1901000"),
-                               std::make_pair("1745KHz", "1745000"),
-                               std::make_pair("1582KHz", "1582000"),
-                               std::make_pair("1426KHz", "1426000"),
-                               std::make_pair("1237KHz", "1237000"),
-                               std::make_pair("1106KHz", "1106000"),
-                               std::make_pair("984KHz", "984000"),
-                               std::make_pair("848KHz", "848000"),
-                               std::make_pair("500KHz", "500000"),
-                               std::make_pair("0KHz", "0"),
-                       });
-
-    // TODO(sujee): Complete frequency table for TPU.
-    dvfsSdp->addEntity(service->addPowerEntity("TPU-DVFS", PowerEntityType::SUBSYSTEM), "TPU",
-                       {
-                               std::make_pair("1066MHz", "1066000000"),
-                       });
-
-    service->addStateResidencyDataProvider(dvfsSdp);
-}
-
-void addGPUStats(PowerStats *const service) {
-    StateResidencyConfig gpuStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "count = ",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "total_time = ",
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_entry_time = ",
-    };
-
-    sp<GenericStateResidencyDataProvider> gpu = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/1c500000.mali/power_stats");
-
-    PowerEntityConfig onOffConfig("Summary stats: (times in ms)",
-                                  generateGenericStateResidencyConfigs(
-                                          gpuStateConfig, {{"DOWN", "OFF:"}, {"UP", "ON:"}}));
-    gpu->addEntity(service->addPowerEntity("GPU", PowerEntityType::SUBSYSTEM), onOffConfig);
-
-    PowerEntityConfig DVFSConfig(
-            "DVFS stats: (times in ms)",
-            generateGenericStateResidencyConfigs(gpuStateConfig, {{"996MHz", "996000:"},
-                                                                  {"885MHz", "885000:"},
-                                                                  {"750MHz", "750000:"},
-                                                                  {"434MHz", "434000:"},
-                                                                  {"302MHz", "302000:"},
-                                                                  {"151MHz", "151000:"}}));
-    gpu->addEntity(service->addPowerEntity("GPU-DVFS", PowerEntityType::SUBSYSTEM), DVFSConfig);
-    service->addStateResidencyDataProvider(gpu);
-}
-
-void addNFCStats(PowerStats *const service) {
-    StateResidencyConfig nfcStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "Cumulative count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "Cumulative duration msec:",
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "Last entry timestamp msec:",
-    };
-    std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
-            std::make_pair("IDLE", "Idle mode:"),
-            std::make_pair("ACTIVE", "Active mode:"),
-            std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
-    };
-
-    sp<GenericStateResidencyDataProvider> nfcSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/10960000.hsi2c/i2c-4/4-0008/power_stats");
-    nfcSdp->addEntity(service->addPowerEntity("NFC", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("NFC subsystem", generateGenericStateResidencyConfigs(
-                                                                 nfcStateConfig, nfcStateHeaders)));
-    service->addStateResidencyDataProvider(nfcSdp);
-}
-
-void addPCIeStats(PowerStats *const service) {
-    // Add PCIe power entities for Modem and WiFi
-    StateResidencyConfig pcieStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "Cumulative count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "Cumulative duration msec:",
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "Last entry timestamp msec:",
-    };
-    std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
-            std::make_pair("UP", "Link up:"),
-            std::make_pair("DOWN", "Link down:"),
-    };
-
-    // Add PCIe - Modem
-    sp<GenericStateResidencyDataProvider> pcieModemSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/11920000.pcie/power_stats");
-    uint32_t pcieModemId = service->addPowerEntity("PCIe-Modem", PowerEntityType::SUBSYSTEM);
-    pcieModemSdp->addEntity(
-            pcieModemId,
-            PowerEntityConfig("Version: 1", generateGenericStateResidencyConfigs(
-                                                    pcieStateConfig, pcieStateHeaders)));
-    service->addStateResidencyDataProvider(pcieModemSdp);
-
-    // Add PCIe - WiFi
-    sp<GenericStateResidencyDataProvider> pcieWifiSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/14520000.pcie/power_stats");
-    uint32_t pcieWifiId = service->addPowerEntity("PCIe-WiFi", PowerEntityType::SUBSYSTEM);
-    pcieWifiSdp->addEntity(
-            pcieWifiId,
-            PowerEntityConfig("Version: 1", generateGenericStateResidencyConfigs(
-                                                    pcieStateConfig, pcieStateHeaders)));
-    service->addStateResidencyDataProvider(pcieWifiSdp);
-}
-
-void addSocStats(PowerStats *const service) {
     // ACPM stats are reported in nanoseconds. The transform function
     // converts nanoseconds to milliseconds.
     std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
-    StateResidencyConfig lpmStateConfig = {
+    const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
             .entryCountSupported = true,
             .entryCountPrefix = "success_count:",
             .totalTimeSupported = true,
@@ -330,7 +191,7 @@
             .lastEntryPrefix = "last_entry_time_ns:",
             .lastEntryTransform = acpmNsToMs,
     };
-    StateResidencyConfig downStateConfig = {
+    const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
             .entryCountSupported = true,
             .entryCountPrefix = "down_count:",
             .totalTimeSupported = true,
@@ -340,7 +201,7 @@
             .lastEntryPrefix = "last_down_time_ns:",
             .lastEntryTransform = acpmNsToMs,
     };
-    StateResidencyConfig reqStateConfig = {
+    const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
             .entryCountSupported = true,
             .entryCountPrefix = "req_up_count:",
             .totalTimeSupported = true,
@@ -351,141 +212,343 @@
             .lastEntryTransform = acpmNsToMs,
 
     };
-    std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+    const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
             std::make_pair("SICD", "SICD"),
             std::make_pair("SLEEP", "SLEEP"),
             std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
             std::make_pair("STOP", "STOP"),
     };
-    std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
+    const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
             std::make_pair("AOC", "AOC"),
             std::make_pair("GSA", "GSA"),
     };
-    std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
+    const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
             std::make_pair("AOC", "AOC"),
     };
 
-    sp<GenericStateResidencyDataProvider> socSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/1742048c.acpm_stats/soc_stats");
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
+            "LPM", "LPM:");
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+            "MIF", "MIF:");
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
+            "MIF-REQ", "MIF_REQ:");
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+            "SLC", "SLC:");
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
+            "SLC-REQ", "SLC_REQ:");
 
-    socSdp->addEntity(service->addPowerEntity("LPM", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("LPM:", generateGenericStateResidencyConfigs(
-                                                        lpmStateConfig, powerStateHeaders)));
-    socSdp->addEntity(service->addPowerEntity("MIF", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("MIF:", generateGenericStateResidencyConfigs(
-                                                        downStateConfig, powerStateHeaders)));
-    socSdp->addEntity(service->addPowerEntity("MIF-REQ", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("MIF_REQ:", generateGenericStateResidencyConfigs(
-                                                            reqStateConfig, mifReqStateHeaders)));
-    socSdp->addEntity(service->addPowerEntity("SLC", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("SLC:", generateGenericStateResidencyConfigs(
-                                                        downStateConfig, powerStateHeaders)));
-    socSdp->addEntity(service->addPowerEntity("SLC-REQ", PowerEntityType::SUBSYSTEM),
-                      PowerEntityConfig("SLC_REQ:", generateGenericStateResidencyConfigs(
-                                                            reqStateConfig, slcReqStateHeaders)));
+    auto socSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/acpm_stats/soc_stats", cfgs);
 
-    service->addStateResidencyDataProvider(socSdp);
+    p->addStateResidencyDataProvider(socSdp);
 }
 
-void addUfsStats(PowerStats *const service) {
-    sp<UfsStateResidencyDataProvider> ufsSdp = new UfsStateResidencyDataProvider(
-            service->addPowerEntity("UFS", PowerEntityType::SUBSYSTEM));
-    service->addStateResidencyDataProvider(ufsSdp);
+void setEnergyMeter(std::shared_ptr<PowerStats> p) {
+    std::vector<const std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" };
+    p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
 }
 
-void addWifiStats(PowerStats *const service) {
-    sp<GenericStateResidencyDataProvider> wifiSdp =
-            new GenericStateResidencyDataProvider("/sys/wifi/power_stats");
+void addDisplay(std::shared_ptr<PowerStats> p) {
+    // Add display residency stats
 
-    // The transform function converts microseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
-    StateResidencyConfig stateConfig = {
+    /*
+     * TODO(b/167216667): Add complete set of display states here. Must account
+     * for ALL devices built using this source
+     */
+    std::vector<std::string> states = {
+        "Off",
+        "LP: 1440x3040@30",
+        "On: 1440x3040@60",
+        "On: 1440x3040@90",
+        "HBM: 1440x3040@60",
+        "HBM: 1440x3040@90"};
+
+    auto displaySdp =
+        std::make_shared<DisplayStateResidencyDataProvider>("Display",
+            "/sys/class/backlight/panel0-backlight/state",
+            states);
+    p->addStateResidencyDataProvider(displaySdp);
+
+    // Add display energy consumer
+    /*
+     * TODO(b/167216667): Add correct display power model here. Must read from display rail
+     * and include proper coefficients for display states. Must account for ALL devices built
+     * using this source.
+     */
+    auto displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
+            EnergyConsumerType::DISPLAY, "display", {"PPVAR_VSYS_PWR_DISP"}, "Display",
+            {{"LP: 1440x3040@30", 1},
+             {"On: 1440x3040@60", 2},
+             {"On: 1440x3040@90", 3}});
+
+    p->addEnergyConsumer(displayConsumer);
+}
+
+void addCPUclusters(std::shared_ptr<PowerStats> p) {
+    // A constant to represent the number of nanoseconds in one millisecond.
+    const int NS_TO_MS = 1000000;
+
+    std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
+    const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
+            .entryCountSupported = true,
+            .entryCountPrefix = "down_count:",
+            .totalTimeSupported = true,
+            .totalTimePrefix = "total_down_time_ns:",
+            .totalTimeTransform = acpmNsToMs,
+            .lastEntrySupported = true,
+            .lastEntryPrefix = "last_down_time_ns:",
+            .lastEntryTransform = acpmNsToMs,
+    };
+
+    const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
+            std::make_pair("DOWN", ""),
+    };
+
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    for (std::string name : {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11",
+                                "CORE20", "CORE21", "CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
+        cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
+            name, name);
+    }
+
+    auto cpuSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/acpm_stats/core_stats", cfgs);
+
+    p->addStateResidencyDataProvider(cpuSdp);
+
+    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+            EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
+    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+            EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
+    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+            EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
+}
+
+void addGPU(std::shared_ptr<PowerStats> p) {
+    // Add gpu energy consumer
+    std::map<std::string, int32_t> stateCoeffs;
+    const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
+
+    // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC
+    if (socRev >= 2) {
+        stateCoeffs = {
+            {"151000",  10},
+            {"202000",  20},
+            {"251000",  30},
+            {"302000",  40},
+            {"351000",  50},
+            {"400000",  60},
+            {"471000",  70},
+            {"510000",  80},
+            {"572000",  90},
+            {"701000", 100},
+            {"762000", 110},
+            {"848000", 120}};
+    } else {
+        stateCoeffs = {
+            {"151000",  10},
+            {"302000",  20},
+            {"455000",  30},
+            {"572000",  40},
+            {"670000",  50}};
+    }
+
+    auto gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+            EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
+            {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
+            stateCoeffs);
+
+    p->addEnergyConsumer(gpuConsumer);
+}
+
+void addMobileRadio(std::shared_ptr<PowerStats> p)
+{
+    // A constant to represent the number of microseconds in one millisecond.
+    const int US_TO_MS = 1000;
+
+    // modem power_stats are reported in microseconds. The transform function
+    // converts microseconds to milliseconds.
+    std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
+    const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
             .entryCountSupported = true,
             .entryCountPrefix = "count:",
             .totalTimeSupported = true,
             .totalTimePrefix = "duration_usec:",
-            .totalTimeTransform = usecToMs,
+            .totalTimeTransform = modemUsToMs,
             .lastEntrySupported = true,
             .lastEntryPrefix = "last_entry_timestamp_usec:",
-            .lastEntryTransform = usecToMs,
+            .lastEntryTransform = modemUsToMs,
     };
-    StateResidencyConfig pcieStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "duration_usec:",
-            .totalTimeTransform = usecToMs,
+    const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+            std::make_pair("SLEEP", "SLEEP:"),
     };
 
-    std::vector<std::pair<std::string, std::string>> stateHeaders = {
-            std::make_pair("AWAKE", "AWAKE:"),
-            std::make_pair("ASLEEP", "ASLEEP:"),
-    };
-    std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
-            std::make_pair("L0", "L0:"),     std::make_pair("L1", "L1:"),
-            std::make_pair("L1_1", "L1_1:"), std::make_pair("L1_2", "L1_2:"),
-            std::make_pair("L2", "L2:"),
-    };
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
+            "MODEM", "");
 
-    wifiSdp->addEntity(
-            service->addPowerEntity("WIFI", PowerEntityType::SUBSYSTEM),
-            PowerEntityConfig(generateGenericStateResidencyConfigs(stateConfig, stateHeaders)));
-    wifiSdp->addEntity(service->addPowerEntity("WIFI-PCIE", PowerEntityType::SUBSYSTEM),
-                       PowerEntityConfig(generateGenericStateResidencyConfigs(pcieStateConfig,
-                                                                              pcieStateHeaders)));
+    p->addStateResidencyDataProvider(std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/cpif/modem/power_stats", cfgs));
 
-    service->addStateResidencyDataProvider(wifiSdp);
+    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+            EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
 }
 
-int main(int /* argc */, char ** /* argv */) {
-    ALOGI("power.stats service 1.0 is starting.");
+void addGNSS(std::shared_ptr<PowerStats> p)
+{
+    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+            EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
+}
 
-    PowerStats *service = new PowerStats();
+void addNFC(std::shared_ptr<PowerStats> p) {
+    const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "Cumulative count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "Cumulative duration msec:",
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "Last entry timestamp msec:",
+    };
+    const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
+        std::make_pair("IDLE", "Idle mode:"),
+        std::make_pair("ACTIVE", "Active mode:"),
+        std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
+    };
 
-    // Add rail data provider
-    service->setRailDataProvider(std::make_unique<RailDataProvider>());
+    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+    cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
+            "NFC", "NFC subsystem");
 
-    addAoCStats(service);
-    addCpuCStateStats(service);
-    addDvfsStats(service);
-    addGPUStats(service);
-    addNFCStats(service);
-    addPCIeStats(service);
-    addSocStats(service);
-    addUfsStats(service);
-    addWifiStats(service);
+    auto nfcSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/10960000.hsi2c/i2c-3/3-0008/power_stats", cfgs);
 
-    // Add Power Entities that require the Aidl data provider
-    sp<AidlStateResidencyDataProvider> aidlSdp = new AidlStateResidencyDataProvider();
-    uint32_t bluetoothId = service->addPowerEntity("Bluetooth", PowerEntityType::SUBSYSTEM);
-    aidlSdp->addEntity(bluetoothId, "Bluetooth", {"Idle", "Active", "Tx", "Rx"});
-    uint32_t citadelId = service->addPowerEntity("Citadel", PowerEntityType::SUBSYSTEM);
-    aidlSdp->addEntity(citadelId, "Citadel", {"Last-Reset", "Active", "Deep-Sleep"});
-    service->addStateResidencyDataProvider(aidlSdp);
+    p->addStateResidencyDataProvider(nfcSdp);
+}
 
-    auto serviceStatus = android::defaultServiceManager()->addService(
-            android::String16("power.stats-vendor"), aidlSdp);
-    if (serviceStatus != android::OK) {
-        ALOGE("Unable to register power.stats-vendor service %d", serviceStatus);
-        return 1;
-    }
+void addPCIe(std::shared_ptr<PowerStats> p) {
+    // Add PCIe power entities for Modem and WiFi
+    const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "Cumulative count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "Cumulative duration msec:",
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "Last entry timestamp msec:",
+    };
+    const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+        std::make_pair("UP", "Link up:"),
+        std::make_pair("DOWN", "Link down:"),
+    };
 
-    sp<android::ProcessState> ps{android::ProcessState::self()};  // Create non-HW binder threadpool
-    ps->startThreadPool();
+    // Add PCIe - Modem
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
+                "Version: 1"}
+    };
+    auto pcieModemSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs);
+    p->addStateResidencyDataProvider(pcieModemSdp);
 
-    // Configure the threadpool
-    configureRpcThreadpool(1, true /*callerWillJoin*/);
+    // Add PCIe - WiFi
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
+            "PCIe-WiFi", "Version: 1"}
+    };
+    auto pcieWifiSdp = std::make_shared<GenericStateResidencyDataProvider>(
+            "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs);
+    p->addStateResidencyDataProvider(pcieWifiSdp);
+}
 
-    status_t status = service->registerAsService();
-    if (status != OK) {
-        ALOGE("Could not register service for power.stats HAL Iface (%d), exiting.", status);
-        return 1;
-    }
+void addWifi(std::shared_ptr<PowerStats> p) {
+    // The transform function converts microseconds to milliseconds.
+    std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
+    const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "duration_usec:",
+        .totalTimeTransform = usecToMs,
+        .lastEntrySupported = true,
+        .lastEntryPrefix = "last_entry_timestamp_usec:",
+        .lastEntryTransform = usecToMs,
+    };
+    const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+        .entryCountSupported = true,
+        .entryCountPrefix = "count:",
+        .totalTimeSupported = true,
+        .totalTimePrefix = "duration_usec:",
+        .totalTimeTransform = usecToMs,
+        .lastEntrySupported = false,
+    };
 
-    ALOGI("power.stats service is ready");
-    joinRpcThreadpool();
+    const std::vector<std::pair<std::string, std::string>> stateHeaders = {
+        std::make_pair("AWAKE", "AWAKE:"),
+        std::make_pair("ASLEEP", "ASLEEP:"),
 
-    // In normal operation, we don't expect the thread pool to exit
-    ALOGE("power.stats service is shutting down");
-    return 1;
+    };
+    const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+        std::make_pair("L0", "L0:"),
+        std::make_pair("L1", "L1:"),
+        std::make_pair("L1_1", "L1_1:"),
+        std::make_pair("L1_2", "L1_2:"),
+        std::make_pair("L2", "L2:"),
+    };
+
+    const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
+        {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
+        {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
+                "WIFI-PCIE"}
+    };
+
+    auto wifiSdp = std::make_shared<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
+            cfgs);
+    p->addStateResidencyDataProvider(wifiSdp);
+}
+
+/**
+ * Unlike other data providers, which source power entity state residency data from the kernel,
+ * this data provider acts as a general-purpose channel for state residency data providers
+ * that live in user space. Entities are defined here and user space clients of this provider's
+ * vendor service register callbacks to provide state residency data for their given pwoer entity.
+ */
+void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
+    std::shared_ptr<PixelStateResidencyDataProvider> pixelSdp =
+            ndk::SharedRefBase::make<PixelStateResidencyDataProvider>();
+
+    pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
+
+    pixelSdp->start();
+    p->addStateResidencyDataProvider(pixelSdp);
+}
+
+int main() {
+    LOG(INFO) << "Pixel PowerStats HAL AIDL Service is starting.";
+
+    // single thread
+    ABinderProcess_setThreadPoolMaxThreadCount(0);
+
+    std::shared_ptr<PowerStats> p = ndk::SharedRefBase::make<PowerStats>();
+
+    setEnergyMeter(p);
+
+    addPixelStateResidencyDataProvider(p);
+    addAoC(p);
+    addDisplay(p);
+    addDvfsStats(p);
+    addSoC(p);
+    addCPUclusters(p);
+    addGPU(p);
+    addMobileRadio(p);
+    addGNSS(p);
+    addNFC(p);
+    addPCIe(p);
+    addWifi(p);
+
+    const std::string instance = std::string() + PowerStats::descriptor + "/default";
+    binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());
+    LOG_ALWAYS_FATAL_IF(status != STATUS_OK);
+
+    ABinderProcess_joinThreadPool();
+    return EXIT_FAILURE;  // should not reach
 }
diff --git a/powerstats/serviceaidl.cpp b/powerstats/serviceaidl.cpp
deleted file mode 100644
index 25eb6ea..0000000
--- a/powerstats/serviceaidl.cpp
+++ /dev/null
@@ -1,392 +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.power.stats-service.pixel"
-
-#include <PowerStatsAidl.h>
-#include "AocStateResidencyDataProviderAidl.h"
-#include "DvfsStateResidencyDataProviderAidl.h"
-#include <dataproviders/DisplayStateResidencyDataProvider.h>
-#include <dataproviders/GenericStateResidencyDataProvider.h>
-#include <dataproviders/IioEnergyMeterDataProvider.h>
-#include <dataproviders/PowerStatsEnergyConsumer.h>
-#include <dataproviders/PowerStatsEnergyAttribution.h>
-
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <android/binder_manager.h>
-#include <android/binder_process.h>
-#include <log/log.h>
-
-using aidl::android::hardware::power::stats::AocStateResidencyDataProvider;
-using aidl::android::hardware::power::stats::DisplayStateResidencyDataProvider;
-using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
-using aidl::android::hardware::power::stats::EnergyConsumerType;
-using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
-using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
-using aidl::android::hardware::power::stats::PowerStats;
-using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
-
-constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev";
-
-void addAoC(std::shared_ptr<PowerStats> p) {
-    std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
-
-    // Add AoC cores (a32, ff1, hf0, and hf1)
-    std::vector<std::pair<std::string, std::string>> coreIds = {
-            {"AoC-A32", prefix + "a32_"},
-            {"AoC-FF1", prefix + "ff1_"},
-            {"AoC-HF1", prefix + "hf1_"},
-            {"AoC-HF0", prefix + "hf0_"},
-    };
-    std::vector<std::pair<std::string, std::string>> coreStates = {
-            {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
-    p->addStateResidencyDataProvider(new AocStateResidencyDataProvider(coreIds, coreStates));
-
-    // Add AoC voltage stats
-    std::vector<std::pair<std::string, std::string>> voltageIds = {
-            {"AoC-Voltage", prefix + "voltage_"},
-    };
-    std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
-                                                                      {"SUD", "super_underdrive"},
-                                                                      {"UUD", "ultra_underdrive"},
-                                                                      {"UD", "underdrive"}};
-    p->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(voltageIds, voltageStates));
-
-    // Add AoC monitor mode
-    std::vector<std::pair<std::string, std::string>> monitorIds = {
-            {"AoC", prefix + "monitor_"},
-    };
-    std::vector<std::pair<std::string, std::string>> monitorStates = {
-            {"MON", "mode"},
-    };
-    p->addStateResidencyDataProvider(
-            new AocStateResidencyDataProvider(monitorIds, monitorStates));
-}
-
-void addDvfsStats(std::shared_ptr<PowerStats> p) {
-    // A constant to represent the number of nanoseconds in one millisecond
-    const int NS_TO_MS = 1000000;
-
-    std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
-
-    cfgs.push_back({"MIF", {
-        std::make_pair("3172KHz", "3172000"),
-        std::make_pair("2730KHz", "2730000"),
-        std::make_pair("2535KHz", "2535000"),
-        std::make_pair("2288KHz", "2288000"),
-        std::make_pair("2028KHz", "2028000"),
-        std::make_pair("1716KHz", "1716000"),
-        std::make_pair("1539KHz", "1539000"),
-        std::make_pair("1352KHz", "1352000"),
-        std::make_pair("1014KHz", "1014000"),
-        std::make_pair("845KHz", "845000"),
-        std::make_pair("676KHz", "676000"),
-        std::make_pair("546KHz", "546000"),
-        std::make_pair("421KHz", "421000"),
-        std::make_pair("0KHz", "0"),
-    }});
-
-    cfgs.push_back({"CL0", {
-        std::make_pair("2024KHz", "2024000"),
-        std::make_pair("1950KHz", "1950000"),
-        std::make_pair("1868KHz", "1868000"),
-        std::make_pair("1803KHz", "1803000"),
-        std::make_pair("1745KHz", "1745000"),
-        std::make_pair("1704KHz", "1704000"),
-        std::make_pair("1598KHz", "1598000"),
-        std::make_pair("1459KHz", "1459000"),
-        std::make_pair("1401KHz", "1401000"),
-        std::make_pair("1328KHz", "1328000"),
-        std::make_pair("1197KHz", "1197000"),
-        std::make_pair("1098KHz", "1098000"),
-        std::make_pair("930KHz", "930000"),
-        std::make_pair("889KHz", "889000"),
-        std::make_pair("738KHz", "738000"),
-        std::make_pair("574KHz", "574000"),
-        std::make_pair("300KHz", "300000"),
-        std::make_pair("0KHz", "0"),
-    }});
-
-    cfgs.push_back({"CL1", {
-        std::make_pair("2253KHz", "2253000"),
-        std::make_pair("2130KHz", "2130000"),
-        std::make_pair("1999KHz", "1999000"),
-        std::make_pair("1836KHz", "1836000"),
-        std::make_pair("1663KHz", "1663000"),
-        std::make_pair("1491KHz", "1491000"),
-        std::make_pair("1328KHz", "1328000"),
-        std::make_pair("1197KHz", "1197000"),
-        std::make_pair("1024KHz", "1024000"),
-        std::make_pair("910KHz", "910000"),
-        std::make_pair("799KHz", "799000"),
-        std::make_pair("696KHz", "696000"),
-        std::make_pair("533KHz", "533000"),
-        std::make_pair("400KHz", "400000"),
-        std::make_pair("0KHz", "0"),
-    }});
-
-    cfgs.push_back({"CL2", {
-        std::make_pair("2630KHz", "2630000"),
-        std::make_pair("2507KHz", "2507000"),
-        std::make_pair("2401KHz", "2401000"),
-        std::make_pair("2302KHz", "2302000"),
-        std::make_pair("2252KHz", "2252000"),
-        std::make_pair("2188KHz", "2188000"),
-        std::make_pair("2048KHz", "2048000"),
-        std::make_pair("1901KHz", "1901000"),
-        std::make_pair("1826KHz", "1826000"),
-        std::make_pair("1745KHz", "1745000"),
-        std::make_pair("1582KHz", "1582000"),
-        std::make_pair("1426KHz", "1426000"),
-        std::make_pair("1277KHz", "1277000"),
-        std::make_pair("1237KHz", "1237000"),
-        std::make_pair("1106KHz", "1106000"),
-        std::make_pair("984KHz", "984000"),
-        std::make_pair("851KHz", "851000"),
-        std::make_pair("848KHz", "848000"),
-        std::make_pair("500KHz", "500000"),
-        std::make_pair("0KHz", "0"),
-    }});
-
-    cfgs.push_back({"TPU", {
-        std::make_pair("1066MHz", "1066000000"),
-    }});
-
-    p->addStateResidencyDataProvider(new DvfsStateResidencyDataProvider(
-            "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS, cfgs));
-}
-
-void addSoC(std::shared_ptr<PowerStats> p) {
-    // A constant to represent the number of nanoseconds in one millisecond.
-    const int NS_TO_MS = 1000000;
-
-    // ACPM stats are reported in nanoseconds. The transform function
-    // converts nanoseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
-    const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "success_count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "total_time_ns:",
-            .totalTimeTransform = acpmNsToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_entry_time_ns:",
-            .lastEntryTransform = acpmNsToMs,
-    };
-    const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "down_count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "total_down_time_ns:",
-            .totalTimeTransform = acpmNsToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_down_time_ns:",
-            .lastEntryTransform = acpmNsToMs,
-    };
-    const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "req_up_count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "total_req_up_time_ns:",
-            .totalTimeTransform = acpmNsToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_req_up_time_ns:",
-            .lastEntryTransform = acpmNsToMs,
-
-    };
-    const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
-            std::make_pair("SICD", "SICD"),
-            std::make_pair("SLEEP", "SLEEP"),
-            std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
-            std::make_pair("STOP", "STOP"),
-    };
-    const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
-            std::make_pair("AOC", "AOC"),
-            std::make_pair("GSA", "GSA"),
-    };
-    const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
-            std::make_pair("AOC", "AOC"),
-    };
-
-    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
-            "LPM", "LPM:");
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
-            "MIF", "MIF:");
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
-            "MIF-REQ", "MIF_REQ:");
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
-            "SLC", "SLC:");
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
-            "SLC-REQ", "SLC_REQ:");
-
-    android::sp<GenericStateResidencyDataProvider> socSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/1742048c.acpm_stats/soc_stats", cfgs);
-
-    p->addStateResidencyDataProvider(socSdp);
-}
-
-void setEnergyMeter(std::shared_ptr<PowerStats> p) {
-    std::vector<const std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" };
-    p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
-}
-
-void addDisplay(std::shared_ptr<PowerStats> p) {
-    // Add display residency stats
-    android::sp<DisplayStateResidencyDataProvider> displaySdp =
-        new DisplayStateResidencyDataProvider("Display",
-            "/sys/class/backlight/panel0-backlight/state",
-            /*
-             * TODO(b/167216667): Add complete set of display states here. Must account
-             * for ALL devices built using this source
-             */
-            {"Off", "LP: 1440x3040@30", "On: 1440x3040@60", "On: 1440x3040@90", "HBM: 1440x3040@60",
-            "HBM: 1440x3040@90"});
-    p->addStateResidencyDataProvider(displaySdp);
-
-    // Add display energy consumer
-    android::sp<PowerStatsEnergyConsumer> displayConsumer;
-    /*
-     * TODO(b/167216667): Add correct display power model here. Must read from display rail
-     * and include proper coefficients for display states. Must account for ALL devices built
-     * using this source.
-     */
-    displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
-            EnergyConsumerType::DISPLAY, "display", {"PPVAR_VSYS_PWR_DISP"}, "Display",
-            {{"LP: 1440x3040@30", 1},
-             {"On: 1440x3040@60", 2},
-             {"On: 1440x3040@90", 3}});
-
-    p->addEnergyConsumer(displayConsumer);
-}
-
-void addCPUclusters(std::shared_ptr<PowerStats> p)
-{
-    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
-            EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
-    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
-            EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
-    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
-            EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
-}
-
-void addGPU(std::shared_ptr<PowerStats> p) {
-    // Add gpu energy consumer
-    android::sp<PowerStatsEnergyConsumer> gpuConsumer;
-    std::map<std::string, int32_t> stateCoeffs;
-    const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
-
-    // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC
-    if (socRev >= 2) {
-        stateCoeffs = {
-            {"151000",  10},
-            {"202000",  20},
-            {"251000",  30},
-            {"302000",  40},
-            {"351000",  50},
-            {"400000",  60},
-            {"471000",  70},
-            {"510000",  80},
-            {"572000",  90},
-            {"701000", 100},
-            {"762000", 110},
-            {"848000", 120}};
-    } else {
-        stateCoeffs = {
-            {"151000",  10},
-            {"302000",  20},
-            {"455000",  30},
-            {"572000",  40},
-            {"670000",  50}};
-    }
-
-    gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
-            EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
-            {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
-            stateCoeffs);
-
-    p->addEnergyConsumer(gpuConsumer);
-}
-
-void addMobileRadio(std::shared_ptr<PowerStats> p)
-{
-    // A constant to represent the number of microseconds in one millisecond.
-    const int US_TO_MS = 1000;
-
-    // modem power_stats are reported in microseconds. The transform function
-    // converts microseconds to milliseconds.
-    std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
-    const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
-            .entryCountSupported = true,
-            .entryCountPrefix = "count:",
-            .totalTimeSupported = true,
-            .totalTimePrefix = "duration_usec:",
-            .totalTimeTransform = modemUsToMs,
-            .lastEntrySupported = true,
-            .lastEntryPrefix = "last_entry_timestamp_usec:",
-            .lastEntryTransform = modemUsToMs,
-    };
-    const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
-            std::make_pair("SLEEP", "SLEEP:"),
-    };
-
-    std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
-    cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
-            "MODEM", "");
-
-    android::sp<GenericStateResidencyDataProvider> modemSdp = new GenericStateResidencyDataProvider(
-            "/sys/devices/platform/cpif/modem/power_stats", cfgs);
-
-    p->addStateResidencyDataProvider(modemSdp);
-
-    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
-            EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
-}
-
-void addGNSS(std::shared_ptr<PowerStats> p)
-{
-    p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
-            EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
-}
-
-int main() {
-    LOG(INFO) << "Pixel PowerStats HAL AIDL Service is starting.";
-
-    // single thread
-    ABinderProcess_setThreadPoolMaxThreadCount(0);
-
-    std::shared_ptr<PowerStats> p = ndk::SharedRefBase::make<PowerStats>();
-
-    setEnergyMeter(p);
-
-    addAoC(p);
-    addDisplay(p);
-    addDvfsStats(p);
-    addSoC(p);
-    addCPUclusters(p);
-    addGPU(p);
-    addMobileRadio(p);
-    addGNSS(p);
-
-    const std::string instance = std::string() + PowerStats::descriptor + "/default";
-    binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str());
-    LOG_ALWAYS_FATAL_IF(status != STATUS_OK);
-
-    ABinderProcess_joinThreadPool();
-    return EXIT_FAILURE;  // should not reach
-}
diff --git a/rro_overlays/WifiOverlay/res/values/config.xml b/rro_overlays/WifiOverlay/res/values/config.xml
index e958aec..de8766d 100644
--- a/rro_overlays/WifiOverlay/res/values/config.xml
+++ b/rro_overlays/WifiOverlay/res/values/config.xml
@@ -114,4 +114,7 @@
 
     <!-- Enable concurrent STA + Bridged access point (AP) support -->
     <bool translatable="false" name="config_wifiStaWithBridgedSoftApConcurrencySupported">true</bool>
+
+    <!-- Enable aggregation of Wifi link layer radio stats from all radios -->
+    <bool translatable="false" name="config_config_wifiLinkLayerAllRadiosStatsAggregationEnabled">true</bool>
 </resources>
