diff --git a/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
new file mode 100644
index 0000000..28b076c
--- /dev/null
+++ b/powerstats/AdaptiveDvfsStateResidencyDataProvider.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "AdaptiveDvfsStateResidencyDataProvider.h"
+
+#include <android-base/logging.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+
+#include <string>
+#include <utility>
+
+using android::base::Split;
+using android::base::Trim;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+AdaptiveDvfsStateResidencyDataProvider::AdaptiveDvfsStateResidencyDataProvider(
+        std::string path,
+        uint64_t clockRate,
+        std::string powerEntityName,
+        std::string freqPath)
+    : DvfsStateResidencyDataProvider(path, clockRate, {}) {
+    std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(freqPath.c_str(), "r"), fclose);
+    if (!fp) {
+        PLOG(ERROR) << __func__ << ":Failed to open file " << freqPath;
+        return;
+    }
+
+    size_t len = 0;
+    char *line = nullptr;
+    std::string suffix = "MHz";
+    std::vector<std::pair<std::string, std::string>> states = {};
+    std::vector<std::string> parts;
+    std::string freqStr;
+
+    while (getline(&line, &len, fp.get()) != -1) {
+        parts = Split(line, " ");
+        if (parts.size() > 0) {
+            freqStr = Trim(parts[0]);
+            states.push_back(std::make_pair(
+                    freqStr.substr(0, freqStr.length() - 3) + suffix,
+                    freqStr));
+        }
+    }
+
+    mPowerEntities.push_back({powerEntityName, std::move(states)});
+}
+
+bool AdaptiveDvfsStateResidencyDataProvider::getStateResidencies(
+        std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
+    return DvfsStateResidencyDataProvider::getStateResidencies(residencies);
+}
+
+std::unordered_map<std::string, std::vector<State>>
+        AdaptiveDvfsStateResidencyDataProvider::getInfo() {
+    return DvfsStateResidencyDataProvider::getInfo();
+}
+
+}  // namespace stats
+}  // namespace power
+}  // namespace hardware
+}  // namespace android
+}  // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
index 511159e..c7561d6 100644
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ b/powerstats/DvfsStateResidencyDataProvider.cpp
@@ -37,7 +37,7 @@
 
 DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate,
         std::vector<Config> cfgs)
-    : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {}
+    : mPowerEntities(std::move(cfgs)), mPath(std::move(path)), mClockRate(clockRate) {}
 
 int32_t DvfsStateResidencyDataProvider::matchEntity(char const *line) {
     for (int32_t i = 0; i < mPowerEntities.size(); i++) {
diff --git a/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
new file mode 100644
index 0000000..661b940
--- /dev/null
+++ b/powerstats/include/AdaptiveDvfsStateResidencyDataProvider.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "DvfsStateResidencyDataProvider.h"
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace power {
+namespace stats {
+
+class AdaptiveDvfsStateResidencyDataProvider : public DvfsStateResidencyDataProvider {
+  public:
+    /*
+     * path - path to dvfs sysfs node.
+     * clockRate - clock rate in KHz.
+     * powerEntityName - power entity name to parse.
+     * freqPath - path to frequency table.
+     */
+    AdaptiveDvfsStateResidencyDataProvider(
+        std::string path,
+        uint64_t clockRate,
+        std::string powerEntityName,
+        std::string freqPath);
+    ~AdaptiveDvfsStateResidencyDataProvider() = 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;
+};
+
+}  // namespace stats
+}  // namespace power
+}  // namespace hardware
+}  // namespace android
+}  // namespace aidl
diff --git a/powerstats/include/DvfsStateResidencyDataProvider.h b/powerstats/include/DvfsStateResidencyDataProvider.h
index ca8ab22..0aeafb7 100644
--- a/powerstats/include/DvfsStateResidencyDataProvider.h
+++ b/powerstats/include/DvfsStateResidencyDataProvider.h
@@ -51,6 +51,9 @@
      */
     std::unordered_map<std::string, std::vector<State>> getInfo() override;
 
+  protected:
+    std::vector<Config> mPowerEntities;
+
   private:
     int32_t matchEntity(char const *line);
     int32_t matchState(char const *line, const Config& powerEntity);
@@ -58,7 +61,6 @@
 
     const std::string mPath;
     const uint64_t mClockRate;
-    std::vector<Config> mPowerEntities;
 };
 
 }  // namespace stats
