diff --git a/phosphor-regulators/src/interfaces/manager_interface.cpp b/phosphor-regulators/src/interfaces/manager_interface.cpp
new file mode 100644
index 0000000..f4df124
--- /dev/null
+++ b/phosphor-regulators/src/interfaces/manager_interface.cpp
@@ -0,0 +1,119 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * 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 "manager_interface.hpp"
+
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/exception.hpp>
+#include <sdbusplus/sdbus.hpp>
+#include <sdbusplus/server.hpp>
+
+#include <string>
+#include <tuple>
+
+namespace phosphor
+{
+namespace power
+{
+namespace regulators
+{
+namespace interface
+{
+
+ManagerInterface::ManagerInterface(sdbusplus::bus::bus& bus, const char* path) :
+    _serverInterface(bus, path, interface, _vtable, this)
+{
+}
+
+int ManagerInterface::callbackConfigure(sd_bus_message* msg, void* context,
+                                        sd_bus_error* error)
+{
+    if (msg != nullptr && context != nullptr)
+    {
+        try
+        {
+            auto m = sdbusplus::message::message(msg);
+
+            auto mgrObj = static_cast<ManagerInterface*>(context);
+            mgrObj->configure();
+
+            auto reply = m.new_method_return();
+
+            reply.method_return();
+        }
+        catch (sdbusplus::internal_exception_t& e)
+        {
+            return sd_bus_error_set(error, e.name(), e.description());
+        }
+    }
+    else
+    {
+        // The message or context were null
+        using namespace phosphor::logging;
+        log<level::ERR>("Unable to service Configure method callback");
+        return -1;
+    }
+
+    return 1;
+}
+
+int ManagerInterface::callbackMonitor(sd_bus_message* msg, void* context,
+                                      sd_bus_error* error)
+{
+    if (msg != nullptr && context != nullptr)
+    {
+        try
+        {
+            bool enable{};
+            auto m = sdbusplus::message::message(msg);
+
+            m.read(enable);
+
+            auto mgrObj = static_cast<ManagerInterface*>(context);
+            mgrObj->monitor(enable);
+
+            auto reply = m.new_method_return();
+
+            reply.method_return();
+        }
+        catch (sdbusplus::internal_exception_t& e)
+        {
+            return sd_bus_error_set(error, e.name(), e.description());
+        }
+    }
+    else
+    {
+        // The message or context were null
+        using namespace phosphor::logging;
+        log<level::ERR>("Unable to service Monitor method callback");
+        return -1;
+    }
+
+    return 1;
+}
+
+const sdbusplus::vtable::vtable_t ManagerInterface::_vtable[] = {
+    sdbusplus::vtable::start(),
+    // No configure method parameters and returns void
+    sdbusplus::vtable::method("Configure", "", "", callbackConfigure),
+    // Monitor method takes a boolean parameter and returns void
+    sdbusplus::vtable::method("Monitor", "b", "", callbackMonitor),
+    sdbusplus::vtable::end()};
+
+} // namespace interface
+} // namespace regulators
+} // namespace power
+} // namespace phosphor
