diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp
index 9c771bd..ece0b1c 100644
--- a/chassis_state_manager.cpp
+++ b/chassis_state_manager.cpp
@@ -15,22 +15,22 @@
 using namespace phosphor::logging;
 
 constexpr auto CHASSIS_STATE_POWEROFF_TGT = "obmc-chassis-poweroff@0.target";
-constexpr auto CHASSIS_STATE_HARD_POWEROFF_TGT = "obmc-chassis-hard-poweroff@0.target";
+constexpr auto CHASSIS_STATE_HARD_POWEROFF_TGT =
+    "obmc-chassis-hard-poweroff@0.target";
 constexpr auto CHASSIS_STATE_POWERON_TGT = "obmc-chassis-poweron@0.target";
 
 constexpr auto ACTIVE_STATE = "active";
 constexpr auto ACTIVATING_STATE = "activating";
 
 /* Map a transition to it's systemd target */
-const std::map<server::Chassis::Transition,std::string> SYSTEMD_TARGET_TABLE =
-{
+const std::map<server::Chassis::Transition, std::string> SYSTEMD_TARGET_TABLE =
+    {
         // Use the hard off target to ensure we shutdown immediately
         {server::Chassis::Transition::Off, CHASSIS_STATE_HARD_POWEROFF_TGT},
-        {server::Chassis::Transition::On, CHASSIS_STATE_POWERON_TGT}
-};
+        {server::Chassis::Transition::On, CHASSIS_STATE_POWERON_TGT}};
 
-constexpr auto SYSTEMD_SERVICE   = "org.freedesktop.systemd1";
-constexpr auto SYSTEMD_OBJ_PATH  = "/org/freedesktop/systemd1";
+constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
+constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
 constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
 
 constexpr auto SYSTEMD_PROPERTY_IFACE = "org.freedesktop.DBus.Properties";
@@ -38,10 +38,8 @@
 
 void Chassis::subscribeToSystemdSignals()
 {
-    auto method = this->bus.new_method_call(SYSTEMD_SERVICE,
-                                            SYSTEMD_OBJ_PATH,
-                                            SYSTEMD_INTERFACE,
-                                            "Subscribe");
+    auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
+                                            SYSTEMD_INTERFACE, "Subscribe");
     this->bus.call_noreply(method);
 
     return;
@@ -53,16 +51,15 @@
 void Chassis::determineInitialState()
 {
     sdbusplus::message::variant<int> pgood = -1;
-    auto method = this->bus.new_method_call("org.openbmc.control.Power",
-                                            "/org/openbmc/control/power0",
-                                            "org.freedesktop.DBus.Properties",
-                                            "Get");
+    auto method = this->bus.new_method_call(
+        "org.openbmc.control.Power", "/org/openbmc/control/power0",
+        "org.freedesktop.DBus.Properties", "Get");
 
     method.append("org.openbmc.control.Power", "pgood");
     auto reply = this->bus.call(method);
     reply.read(pgood);
 
-    if(pgood == 1)
+    if (pgood == 1)
     {
         log<level::INFO>("Initial Chassis State will be On",
                          entry("CHASSIS_CURRENT_POWER_STATE=%s",
@@ -86,10 +83,8 @@
 {
     auto sysdTarget = SYSTEMD_TARGET_TABLE.find(tranReq)->second;
 
-    auto method = this->bus.new_method_call(SYSTEMD_SERVICE,
-                                            SYSTEMD_OBJ_PATH,
-                                            SYSTEMD_INTERFACE,
-                                            "StartUnit");
+    auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
+                                            SYSTEMD_INTERFACE, "StartUnit");
 
     method.append(sysdTarget);
     method.append("replace");
@@ -104,16 +99,14 @@
     sdbusplus::message::variant<std::string> currentState;
     sdbusplus::message::object_path unitTargetPath;
 
-    auto method = this->bus.new_method_call(SYSTEMD_SERVICE,
-                                            SYSTEMD_OBJ_PATH,
-                                            SYSTEMD_INTERFACE,
-                                            "GetUnit");
+    auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
+                                            SYSTEMD_INTERFACE, "GetUnit");
 
     method.append(target);
     auto result = this->bus.call(method);
 
-    //Check that the bus call didn't result in an error
-    if(result.is_method_error())
+    // Check that the bus call didn't result in an error
+    if (result.is_method_error())
     {
         log<level::ERR>("Error in bus call - could not resolve GetUnit for:",
                         entry(" %s", SYSTEMD_INTERFACE));
@@ -122,17 +115,16 @@
 
     result.read(unitTargetPath);
 
-    method = this->bus.new_method_call(SYSTEMD_SERVICE,
-                                       static_cast<const std::string&>
-                                           (unitTargetPath).c_str(),
-                                       SYSTEMD_PROPERTY_IFACE,
-                                       "Get");
+    method = this->bus.new_method_call(
+        SYSTEMD_SERVICE,
+        static_cast<const std::string&>(unitTargetPath).c_str(),
+        SYSTEMD_PROPERTY_IFACE, "Get");
 
     method.append(SYSTEMD_INTERFACE_UNIT, "ActiveState");
     result = this->bus.call(method);
 
-    //Check that the bus call didn't result in an error
-    if(result.is_method_error())
+    // Check that the bus call didn't result in an error
+    if (result.is_method_error())
     {
         log<level::ERR>("Error in bus call - could not resolve Get for:",
                         entry(" %s", SYSTEMD_PROPERTY_IFACE));
@@ -141,40 +133,38 @@
 
     result.read(currentState);
 
-    if(currentState != ACTIVE_STATE && currentState != ACTIVATING_STATE)
+    if (currentState != ACTIVE_STATE && currentState != ACTIVATING_STATE)
     {
-        //False - not active
+        // False - not active
         return false;
     }
-    //True - active
+    // True - active
     return true;
-
 }
 
 int Chassis::sysStateChange(sdbusplus::message::message& msg)
 {
-    uint32_t newStateID {};
+    uint32_t newStateID{};
     sdbusplus::message::object_path newStateObjPath;
     std::string newStateUnit{};
     std::string newStateResult{};
 
-    //Read the msg and populate each variable
+    // Read the msg and populate each variable
     msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
 
-    if((newStateUnit == CHASSIS_STATE_POWEROFF_TGT) &&
-       (newStateResult == "done") &&
-       (!stateActive(CHASSIS_STATE_POWERON_TGT)))
+    if ((newStateUnit == CHASSIS_STATE_POWEROFF_TGT) &&
+        (newStateResult == "done") && (!stateActive(CHASSIS_STATE_POWERON_TGT)))
     {
         log<level::INFO>("Received signal that power OFF is complete");
         this->currentPowerState(server::Chassis::PowerState::Off);
     }
-    else if((newStateUnit == CHASSIS_STATE_POWERON_TGT) &&
-            (newStateResult == "done") &&
-            (stateActive(CHASSIS_STATE_POWERON_TGT)))
-     {
-         log<level::INFO>("Received signal that power ON is complete");
-         this->currentPowerState(server::Chassis::PowerState::On);
-     }
+    else if ((newStateUnit == CHASSIS_STATE_POWERON_TGT) &&
+             (newStateResult == "done") &&
+             (stateActive(CHASSIS_STATE_POWERON_TGT)))
+    {
+        log<level::INFO>("Received signal that power ON is complete");
+        this->currentPowerState(server::Chassis::PowerState::On);
+    }
 
     return 0;
 }
