diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index fa73e51..07e16f1 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -81,7 +81,6 @@
         "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/serviceaidl.cpp b/powerstats/serviceaidl.cpp
index 3a26065..25eb6ea 100644
--- a/powerstats/serviceaidl.cpp
+++ b/powerstats/serviceaidl.cpp
@@ -24,7 +24,6 @@
 #include <dataproviders/IioEnergyMeterDataProvider.h>
 #include <dataproviders/PowerStatsEnergyConsumer.h>
 #include <dataproviders/PowerStatsEnergyAttribution.h>
-#include <dataproviders/PixelStateResidencyDataProvider.h>
 
 #include <android-base/logging.h>
 #include <android-base/properties.h>
@@ -38,7 +37,6 @@
 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;
 
@@ -56,8 +54,7 @@
     };
     std::vector<std::pair<std::string, std::string>> coreStates = {
             {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
-    p->addStateResidencyDataProvider(std::make_shared<AocStateResidencyDataProvider>(coreIds,
-            coreStates));
+    p->addStateResidencyDataProvider(new AocStateResidencyDataProvider(coreIds, coreStates));
 
     // Add AoC voltage stats
     std::vector<std::pair<std::string, std::string>> voltageIds = {
@@ -68,7 +65,7 @@
                                                                       {"UUD", "ultra_underdrive"},
                                                                       {"UD", "underdrive"}};
     p->addStateResidencyDataProvider(
-            std::make_shared<AocStateResidencyDataProvider>(voltageIds, voltageStates));
+            new AocStateResidencyDataProvider(voltageIds, voltageStates));
 
     // Add AoC monitor mode
     std::vector<std::pair<std::string, std::string>> monitorIds = {
@@ -78,7 +75,7 @@
             {"MON", "mode"},
     };
     p->addStateResidencyDataProvider(
-            std::make_shared<AocStateResidencyDataProvider>(monitorIds, monitorStates));
+            new AocStateResidencyDataProvider(monitorIds, monitorStates));
 }
 
 void addDvfsStats(std::shared_ptr<PowerStats> p) {
@@ -170,7 +167,7 @@
         std::make_pair("1066MHz", "1066000000"),
     }});
 
-    p->addStateResidencyDataProvider(std::make_shared<DvfsStateResidencyDataProvider>(
+    p->addStateResidencyDataProvider(new DvfsStateResidencyDataProvider(
             "/sys/devices/platform/1742048c.acpm_stats/fvp_stats", NS_TO_MS, cfgs));
 }
 
@@ -238,7 +235,7 @@
     cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
             "SLC-REQ", "SLC_REQ:");
 
-    auto socSdp = std::make_shared<GenericStateResidencyDataProvider>(
+    android::sp<GenericStateResidencyDataProvider> socSdp = new GenericStateResidencyDataProvider(
             "/sys/devices/platform/1742048c.acpm_stats/soc_stats", cfgs);
 
     p->addStateResidencyDataProvider(socSdp);
@@ -251,32 +248,25 @@
 
 void addDisplay(std::shared_ptr<PowerStats> p) {
     // Add display residency stats
-
-    /*
-     * 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",
+    android::sp<DisplayStateResidencyDataProvider> displaySdp =
+        new DisplayStateResidencyDataProvider("Display",
             "/sys/class/backlight/panel0-backlight/state",
-            states);
+            /*
+             * 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.
      */
-    auto displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
+    displayConsumer = PowerStatsEnergyConsumer::createMeterAndEntityConsumer(p,
             EnergyConsumerType::DISPLAY, "display", {"PPVAR_VSYS_PWR_DISP"}, "Display",
             {{"LP: 1440x3040@30", 1},
              {"On: 1440x3040@60", 2},
@@ -297,6 +287,7 @@
 
 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);
 
@@ -324,7 +315,7 @@
             {"670000",  50}};
     }
 
-    auto gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+    gpuConsumer = PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
             EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
             {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
             stateCoeffs);
@@ -358,8 +349,10 @@
     cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
             "MODEM", "");
 
-    p->addStateResidencyDataProvider(std::make_shared<GenericStateResidencyDataProvider>(
-            "/sys/devices/platform/cpif/modem/power_stats", cfgs));
+    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"}));
@@ -370,21 +363,6 @@
     p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
             EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
 }
-/**
- * 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.";
@@ -396,7 +374,6 @@
 
     setEnergyMeter(p);
 
-    addPixelStateResidencyDataProvider(p);
     addAoC(p);
     addDisplay(p);
     addDvfsStats(p);
