diff --git a/inc/power_button.hpp b/inc/power_button.hpp
index 283b149..bef2662 100644
--- a/inc/power_button.hpp
+++ b/inc/power_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/Power/server.hpp"
@@ -25,159 +27,45 @@
 #include <chrono>
 #include <phosphor-logging/elog-errors.hpp>
 
-const static constexpr char* POWER_BUTTON = "POWER_BUTTON";
+static constexpr std::string_view POWER_BUTTON = "POWER_BUTTON";
 
-struct PowerButton
-    : sdbusplus::server::object::object<
-          sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Power>
+class PowerButton
+    : public sdbusplus::server::object::object<
+          sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Power>,
+      public ButtonIface
 {
-
+  public:
     PowerButton(sdbusplus::bus::bus& bus, const char* path, EventPtr& event,
-                buttonConfig& buttonCfg,
-                sd_event_io_handler_t handler = PowerButton::EventHandler) :
+                buttonConfig& buttonCfg) :
         sdbusplus::server::object::object<
             sdbusplus::xyz::openbmc_project::Chassis::Buttons::server::Power>(
             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>(
-                "POWER_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>(
-                "POWER_BUTTON: failed to add to event loop");
-            ::closeGpio(fd);
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
+        init();
     }
 
     ~PowerButton()
     {
-        ::closeGpio(fd);
+
+        deInit();
     }
 
     void simPress() override;
     void simLongPress() override;
 
-    static const std::string getGpioName()
+    static constexpr std::string_view getFormFactorName()
     {
         return POWER_BUTTON;
     }
-
-    void updatePressedTime()
+    static constexpr const char* getDbusObjectPath()
     {
-        pressedTime = std::chrono::steady_clock::now();
+        return POWER_DBUS_OBJECT_NAME;
     }
+    void updatePressedTime();
+    auto getPressTime() const;
+    void handleEvent(sd_event_source* es, int fd, uint32_t revents) override;
 
-    auto getPressTime() const
-    {
-        return pressedTime;
-    }
-
-    static int EventHandler(sd_event_source* es, int fd, uint32_t revents,
-                            void* userdata)
-    {
-
-        int n = -1;
-        char buf = '0';
-
-        if (!userdata)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "POWER_BUTTON: userdata null!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        PowerButton* powerButton = static_cast<PowerButton*>(userdata);
-
-        if (!powerButton)
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(
-                "POWER_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>(
-                "POWER_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>(
-                "POWER_BUTTON: read error!");
-            throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
-                IOError();
-        }
-
-        if (buf == '0')
-        {
-            phosphor::logging::log<phosphor::logging::level::DEBUG>(
-                "POWER_BUTTON: pressed");
-
-            powerButton->updatePressedTime();
-            // emit pressed signal
-            powerButton->pressed();
-        }
-        else
-        {
-            phosphor::logging::log<phosphor::logging::level::DEBUG>(
-                "POWER_BUTTON: released");
-
-            auto now = std::chrono::steady_clock::now();
-            auto d = std::chrono::duration_cast<std::chrono::milliseconds>(
-                now - powerButton->getPressTime());
-
-            if (d > std::chrono::milliseconds(LONG_PRESS_TIME_MS))
-            {
-                powerButton->pressedLong();
-            }
-            else
-            {
-                // released
-                powerButton->released();
-            }
-        }
-
-        return 0;
-    }
-
-  private:
-    int fd;
-    buttonConfig buttonIFConfig; // button iface io details
-    sdbusplus::bus::bus& bus;
-    EventPtr& event;
-    sd_event_io_handler_t callbackHandler;
+  protected:
     decltype(std::chrono::steady_clock::now()) pressedTime;
 };
