diff --git a/power-sequencer/runtime_monitor.hpp b/power-sequencer/runtime_monitor.hpp
index fb3dcb1..934aef1 100644
--- a/power-sequencer/runtime_monitor.hpp
+++ b/power-sequencer/runtime_monitor.hpp
@@ -1,10 +1,11 @@
 #pragma once
 
+#include "device.hpp"
+#include "device_monitor.hpp"
+
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server.hpp>
 #include <sdeventplus/event.hpp>
-#include "device.hpp"
-#include "device_monitor.hpp"
 
 namespace witherspoon
 {
@@ -31,83 +32,76 @@
  */
 class RuntimeMonitor : public DeviceMonitor
 {
-    public:
+  public:
+    RuntimeMonitor() = delete;
+    ~RuntimeMonitor() = default;
+    RuntimeMonitor(const RuntimeMonitor&) = delete;
+    RuntimeMonitor& operator=(const RuntimeMonitor&) = delete;
+    RuntimeMonitor(RuntimeMonitor&&) = delete;
+    RuntimeMonitor& operator=(RuntimeMonitor&&) = delete;
 
-        RuntimeMonitor() = delete;
-        ~RuntimeMonitor() = default;
-        RuntimeMonitor(const RuntimeMonitor&) = delete;
-        RuntimeMonitor& operator=(const RuntimeMonitor&) = delete;
-        RuntimeMonitor(RuntimeMonitor&&) = delete;
-        RuntimeMonitor& operator=(RuntimeMonitor&&) = delete;
+    /**
+     * Constructor
+     *
+     * @param[in] d - the device to monitor
+     * @param[in] b - D-Bus bus object
+     * @param[in] e - event object
+     * @param[in] i - poll interval
+     */
+    RuntimeMonitor(std::unique_ptr<witherspoon::power::Device>&& d,
+                   sdbusplus::bus::bus& b, const sdeventplus::Event& e,
+                   std::chrono::milliseconds& i) :
+        DeviceMonitor(std::move(d), e, i),
+        bus(b), match(bus, getMatchString(),
+                      std::bind(std::mem_fn(&RuntimeMonitor::onPowerLost), this,
+                                std::placeholders::_1))
+    {
+    }
 
-        /**
-         * Constructor
-         *
-         * @param[in] d - the device to monitor
-         * @param[in] b - D-Bus bus object
-         * @param[in] e - event object
-         * @param[in] i - poll interval
-         */
-        RuntimeMonitor(std::unique_ptr<witherspoon::power::Device>&& d,
-                sdbusplus::bus::bus& b,
-                const sdeventplus::Event& e,
-                std::chrono::milliseconds& i) :
-            DeviceMonitor(std::move(d), e, i),
-            bus(b),
-            match(bus,
-                  getMatchString(),
-                  std::bind(std::mem_fn(&RuntimeMonitor::onPowerLost),
-                            this, std::placeholders::_1))
-        {
-        }
+    /**
+     * Clears faults and then runs DeviceMonitor::run to
+     * call Device::analyze() on an ongoing interval.
+     *
+     * @return the return value from sd_event_loop()
+     */
+    int run() override;
 
-        /**
-         * Clears faults and then runs DeviceMonitor::run to
-         * call Device::analyze() on an ongoing interval.
-         *
-         * @return the return value from sd_event_loop()
-         */
-        int run() override;
+  private:
+    /**
+     * The PowerLost signal handler.
+     *
+     * After doing an analysis, will issue a power off
+     * as some device has a power fault and needs to be
+     * properly shut down.
+     *
+     * @param[in] msg - D-Bus message for callback
+     */
+    void onPowerLost(sdbusplus::message::message& msg);
 
-    private:
+    /**
+     * Returns the match string for the PowerLost signal
+     */
+    std::string getMatchString()
+    {
+        using namespace sdbusplus::bus::match::rules;
 
-        /**
-         * The PowerLost signal handler.
-         *
-         * After doing an analysis, will issue a power off
-         * as some device has a power fault and needs to be
-         * properly shut down.
-         *
-         * @param[in] msg - D-Bus message for callback
-         */
-        void onPowerLost(sdbusplus::message::message& msg);
+        std::string s = type::signal() + path("/org/openbmc/control/power0") +
+                        interface("org.openbmc.control.Power") +
+                        member("PowerLost");
 
-        /**
-         * Returns the match string for the PowerLost signal
-         */
-        std::string getMatchString()
-        {
-            using namespace sdbusplus::bus::match::rules;
+        return s;
+    }
 
-            std::string s =
-                type::signal() +
-                path("/org/openbmc/control/power0") +
-                interface("org.openbmc.control.Power") +
-                member("PowerLost");
+    /**
+     * The D-Bus object
+     */
+    sdbusplus::bus::bus& bus;
 
-            return s;
-        }
-
-        /**
-         * The D-Bus object
-         */
-        sdbusplus::bus::bus& bus;
-
-        /**
-         * Match object for PowerLost signals
-         */
-        sdbusplus::bus::match_t match;
+    /**
+     * Match object for PowerLost signals
+     */
+    sdbusplus::bus::match_t match;
 };
 
-}
-}
+} // namespace power
+} // namespace witherspoon
