diff --git a/i2c-vr/i2cvr_software_manager.cpp b/i2c-vr/i2cvr_software_manager.cpp
new file mode 100644
index 0000000..4c9d398
--- /dev/null
+++ b/i2c-vr/i2cvr_software_manager.cpp
@@ -0,0 +1,115 @@
+#include "i2cvr_software_manager.hpp"
+
+#include "common/include/dbus_helper.hpp"
+#include "common/include/software_manager.hpp"
+#include "i2cvr_device.hpp"
+#include "vr.hpp"
+
+#include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/async.hpp>
+#include <sdbusplus/bus.hpp>
+#include <xyz/openbmc_project/ObjectMapper/client.hpp>
+
+#include <cstdint>
+
+PHOSPHOR_LOG2_USING;
+
+namespace VR = phosphor::software::VR;
+namespace I2CDevice = phosphor::software::i2c_vr::device;
+namespace SoftwareInf = phosphor::software;
+namespace ManagerInf = phosphor::software::manager;
+
+const std::string configDBusName = "I2CVR";
+const std::vector<std::string> emConfigTypes = {"XDPE1X2XXFirmware",
+                                                "DummyDeviceFirmware"};
+
+I2CVRSoftwareManager::I2CVRSoftwareManager(sdbusplus::async::context& ctx) :
+    ManagerInf::SoftwareManager(ctx, configDBusName)
+{}
+
+void I2CVRSoftwareManager::start()
+{
+    std::vector<std::string> configIntfs;
+    configIntfs.reserve(emConfigTypes.size());
+    for (auto& name : emConfigTypes)
+    {
+        configIntfs.push_back("xyz.openbmc_project.Configuration." + name);
+    }
+
+    ctx.spawn(initDevices(configIntfs));
+    ctx.run();
+}
+
+// NOLINTBEGIN(readability-static-accessed-through-instance)
+sdbusplus::async::task<bool> I2CVRSoftwareManager::initDevice(
+    const std::string& service, const std::string& path, SoftwareConfig& config)
+// NOLINTEND(readability-static-accessed-through-instance)
+{
+    std::string configIface =
+        "xyz.openbmc_project.Configuration." + config.configType;
+
+    std::optional<uint64_t> busNum = co_await dbusGetRequiredProperty<uint64_t>(
+        ctx, service, path, configIface, "Bus");
+    std::optional<uint64_t> address =
+        co_await dbusGetRequiredProperty<uint64_t>(ctx, service, path,
+                                                   configIface, "Address");
+    std::optional<std::string> vrChipType =
+        co_await dbusGetRequiredProperty<std::string>(ctx, service, path,
+                                                      configIface, "Type");
+
+    if (!busNum.has_value() || !address.has_value() || !vrChipType.has_value())
+    {
+        error("missing config property");
+        co_return false;
+    }
+
+    VR::VRType vrType;
+    if (!VR::stringToEnum(vrChipType.value(), vrType))
+    {
+        error("unknown voltage regulator type: {TYPE}", "TYPE",
+              vrChipType.value());
+        co_return false;
+    }
+
+    lg2::debug(
+        "[config] Voltage regulator device type: {TYPE} on Bus: {BUS} at Address: {ADDR}",
+        "TYPE", vrChipType.value(), "BUS", busNum.value(), "ADDR",
+        address.value());
+
+    auto i2cDevice = std::make_unique<I2CDevice::I2CVRDevice>(
+        ctx, vrType, static_cast<uint16_t>(busNum.value()),
+        static_cast<uint16_t>(address.value()), config, this);
+
+    std::unique_ptr<SoftwareInf::Software> software =
+        std::make_unique<SoftwareInf::Software>(ctx, *i2cDevice);
+
+    uint32_t sum;
+    if (!(co_await i2cDevice->getVersion(&sum)))
+    {
+        error("unable to obtain Version/CRC from voltage regulator");
+        co_return false;
+    }
+
+    software->setVersion(std::to_string(sum));
+
+    std::set<RequestedApplyTimes> allowedApplyTime = {
+        RequestedApplyTimes::Immediate, RequestedApplyTimes::OnReset};
+
+    software->enableUpdate(allowedApplyTime);
+
+    i2cDevice->softwareCurrent = std::move(software);
+
+    devices.insert({config.objectPath, std::move(i2cDevice)});
+
+    co_return true;
+}
+
+int main()
+{
+    sdbusplus::async::context ctx;
+
+    I2CVRSoftwareManager i2cVRSoftwareManager(ctx);
+
+    i2cVRSoftwareManager.start();
+    return 0;
+}
