diff --git a/inc/reset_button.hpp b/inc/reset_button.hpp
index 478628b..8e15740 100644
--- a/inc/reset_button.hpp
+++ b/inc/reset_button.hpp
@@ -15,6 +15,8 @@
 */
 
 #pragma once
+#include "button_factory.hpp"
+#include "button_interface.hpp"
 #include "common.hpp"
 #include "gpio.hpp"
 #include "xyz/openbmc_project/Chassis/Buttons/Reset/server.hpp"
@@ -24,133 +26,40 @@
 
 #include <phosphor-logging/elog-errors.hpp>
 
-const static constexpr char* RESET_BUTTON = "RESET_BUTTON";
+static constexpr std::string_view RESET_BUTTON = "RESET_BUTTON";
 
-struct ResetButton
-    : sdbusplus::server::object::object<
-          sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Reset>
+class ResetButton
+    : public sdbusplus::server::object::object<
+          sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Reset>,
+      public ButtonIface
 {
-
+  public:
     ResetButton(sdbusplus::bus::bus& bus, const char* path, EventPtr& event,
-                buttonConfig& buttonCfg,
-                sd_event_io_handler_t handler = ResetButton::EventHandler) :
+                buttonConfig& buttonCfg) :
         sdbusplus::server::object::object<
             sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Reset>(
             bus, path),
-        fd(-1), buttonIFConfig(buttonCfg), bus(bus), event(event),
-        callbackHandler(handler)
+        ButtonIface(bus, event, buttonCfg)
     {
-
-        int ret = -1;
-
-        // config group gpio based on the gpio defs read from the json file
-        ret = configGroupGpio(bus, buttonIFConfig);
-
-        if (ret < 0)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: failed to config GPIO");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        // initialize the button io fd from the buttonConfig
-        // which has fd stored when configGroupGpio is called
-        fd = buttonIFConfig.gpios[0].fd;
-
-        char buf;
-        ::read(fd, &buf, sizeof(buf));
-
-        ret = sd_event_add_io(event.get(), nullptr, fd, EPOLLPRI,
-                              callbackHandler, this);
-        if (ret < 0)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: failed to add to event loop");
-            ::closeGpio(fd);
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
+        init();
     }
 
     ~ResetButton()
     {
-        ::closeGpio(fd);
+        deInit();
     }
 
     void simPress() override;
 
-    static const std::string getGpioName()
+    static constexpr std::string_view getFormFactorName()
     {
         return RESET_BUTTON;
     }
 
-    static int EventHandler(sd_event_source* es, int fd, uint32_t revents,
-                            void* userdata)
+    static constexpr const char* getDbusObjectPath()
     {
-
-        int n = -1;
-        char buf = '0';
-
-        if (!userdata)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: userdata null!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        ResetButton* resetButton = static_cast<ResetButton*>(userdata);
-
-        if (!resetButton)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: null pointer!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        n = ::lseek(fd, 0, SEEK_SET);
-
-        if (n < 0)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: lseek error!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        n = ::read(fd, &buf, sizeof(buf));
-        if (n < 0)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "RESET_BUTTON: read error!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        if (buf == '0')
-        {
-            phosphor::logging::log<phosphor::logging::level::DEBUG>(
-                "RESET_BUTTON: pressed");
-            // emit pressed signal
-            resetButton->pressed();
-        }
-        else
-        {
-            phosphor::logging::log<phosphor::logging::level::DEBUG>(
-                "RESET_BUTTON: released");
-            // released
-            resetButton->released();
-        }
-
-        return 0;
+        return RESET_DBUS_OBJECT_NAME;
     }
 
-  private:
-    int fd;
-    buttonConfig buttonIFConfig; // button iface io details
-    sdbusplus::bus::bus& bus;
-    EventPtr& event;
-    sd_event_io_handler_t callbackHandler;
+    void handleEvent(sd_event_source* es, int fd, uint32_t revents) override;
 };
