diff --git a/i2c-vr/vr.hpp b/i2c-vr/vr.hpp
new file mode 100644
index 0000000..670dc9f
--- /dev/null
+++ b/i2c-vr/vr.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include <sdbusplus/async.hpp>
+
+#include <cstdint>
+#include <memory>
+#include <string>
+
+namespace phosphor::software::VR
+{
+
+enum class VRType
+{
+    XDPE1X2XX,
+};
+
+class VoltageRegulator
+{
+  public:
+    explicit VoltageRegulator(sdbusplus::async::context& ctx) : ctx(ctx) {}
+    virtual ~VoltageRegulator() = default;
+
+    VoltageRegulator(VoltageRegulator& vr) = delete;
+    VoltageRegulator& operator=(VoltageRegulator other) = delete;
+    VoltageRegulator(VoltageRegulator&& other) = delete;
+    VoltageRegulator& operator=(VoltageRegulator&& other) = delete;
+
+    // @brief Parses the firmware image into the configuration structure
+    //        and verifies its correctness.
+    // @return sdbusplus::async::task<bool> true indicates success.
+    virtual sdbusplus::async::task<bool> verifyImage(const uint8_t* image,
+                                                     size_t imageSize) = 0;
+
+    // @brief Applies update to the voltage regulator
+    // @return sdbusplus::async::task<bool> true indicates success.
+    virtual sdbusplus::async::task<bool> updateFirmware(bool force) = 0;
+
+    // @brief resets the voltage regulator for the update to take effect.
+    // @return sdbusplus::async::task<bool> true indicates success.
+    virtual sdbusplus::async::task<bool> reset() = 0;
+
+    // @brief Requests the CRC value of the voltage regulator over I2C.
+    // @param pointer to write the result to.
+    // @returns < 0 on error
+    virtual sdbusplus::async::task<bool> getCRC(uint32_t* checksum) = 0;
+
+    // @brief This function returns true if the voltage regulator supports
+    //        force of updates.
+    virtual bool forcedUpdateAllowed() = 0;
+
+  protected:
+    sdbusplus::async::context& ctx;
+};
+
+std::unique_ptr<VoltageRegulator> create(sdbusplus::async::context& ctx,
+                                         enum VRType vrType, uint16_t bus,
+                                         uint16_t address);
+
+bool stringToEnum(std::string& vrStr, VRType& vrType);
+
+} // namespace phosphor::software::VR
