diff --git a/command/payload_cmds.cpp b/command/payload_cmds.cpp
index 2215046..8030b92 100644
--- a/command/payload_cmds.cpp
+++ b/command/payload_cmds.cpp
@@ -1,10 +1,13 @@
-#include <host-ipmid/ipmid-api.h>
-#include <phosphor-logging/log.hpp>
-#include "main.hpp"
 #include "payload_cmds.hpp"
+
+#include "main.hpp"
 #include "sol/sol_manager.hpp"
 #include "sol_cmds.hpp"
 
+#include <host-ipmid/ipmid-api.h>
+
+#include <phosphor-logging/log.hpp>
+
 namespace sol
 {
 
@@ -17,10 +20,10 @@
                                      const message::Handler& handler)
 {
     std::vector<uint8_t> outPayload(sizeof(ActivatePayloadResponse));
-    auto request = reinterpret_cast<const ActivatePayloadRequest*>
-                   (inPayload.data());
-    auto response = reinterpret_cast<ActivatePayloadResponse*>
-                    (outPayload.data());
+    auto request =
+        reinterpret_cast<const ActivatePayloadRequest*>(inPayload.data());
+    auto response =
+        reinterpret_cast<ActivatePayloadResponse*>(outPayload.data());
 
     response->completionCode = IPMI_CC_OK;
 
@@ -44,8 +47,9 @@
         return outPayload;
     }
 
-    auto session = (std::get<session::Manager&>(singletonPool).getSession(
-                       handler.sessionID)).lock();
+    auto session = (std::get<session::Manager&>(singletonPool)
+                        .getSession(handler.sessionID))
+                       .lock();
 
     if (!request->encryption && session->isCryptAlgoEnabled())
     {
@@ -53,8 +57,8 @@
         return outPayload;
     }
 
-    auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
-            request->payloadInstance);
+    auto status = std::get<sol::Manager&>(singletonPool)
+                      .isPayloadActive(request->payloadInstance);
     if (status)
     {
         response->completionCode = IPMI_CC_PAYLOAD_ALREADY_ACTIVE;
@@ -67,9 +71,8 @@
     // Start the SOL payload
     try
     {
-        std::get<sol::Manager&>(singletonPool).startPayloadInstance(
-                request->payloadInstance,
-                handler.sessionID);
+        std::get<sol::Manager&>(singletonPool)
+            .startPayloadInstance(request->payloadInstance, handler.sessionID);
     }
     catch (std::exception& e)
     {
@@ -92,10 +95,10 @@
                                        const message::Handler& handler)
 {
     std::vector<uint8_t> outPayload(sizeof(DeactivatePayloadResponse));
-    auto request = reinterpret_cast<const DeactivatePayloadRequest*>
-            (inPayload.data());
-    auto response = reinterpret_cast<DeactivatePayloadResponse*>
-            (outPayload.data());
+    auto request =
+        reinterpret_cast<const DeactivatePayloadRequest*>(inPayload.data());
+    auto response =
+        reinterpret_cast<DeactivatePayloadResponse*>(outPayload.data());
 
     response->completionCode = IPMI_CC_OK;
 
@@ -113,8 +116,8 @@
         return outPayload;
     }
 
-    auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
-            request->payloadInstance);
+    auto status = std::get<sol::Manager&>(singletonPool)
+                      .isPayloadActive(request->payloadInstance);
     if (!status)
     {
         response->completionCode = IPMI_CC_PAYLOAD_DEACTIVATED;
@@ -123,12 +126,12 @@
 
     try
     {
-        auto& context = std::get<sol::Manager&>(singletonPool).getContext
-                (request->payloadInstance);
+        auto& context = std::get<sol::Manager&>(singletonPool)
+                            .getContext(request->payloadInstance);
         auto sessionID = context.sessionID;
 
-        std::get<sol::Manager&>(singletonPool).stopPayloadInstance(
-                request->payloadInstance);
+        std::get<sol::Manager&>(singletonPool)
+            .stopPayloadInstance(request->payloadInstance);
 
         try
         {
@@ -146,8 +149,8 @@
             return outPayload;
         }
 
-        auto check = std::get<session::Manager&>(singletonPool).stopSession
-                (sessionID);
+        auto check =
+            std::get<session::Manager&>(singletonPool).stopSession(sessionID);
         if (!check)
         {
             response->completionCode = IPMI_CC_UNSPECIFIED_ERROR;
@@ -167,10 +170,10 @@
                                       const message::Handler& handler)
 {
     std::vector<uint8_t> outPayload(sizeof(GetPayloadStatusResponse));
-    auto request = reinterpret_cast<const GetPayloadStatusRequest*>
-                   (inPayload.data());
-    auto response = reinterpret_cast<GetPayloadStatusResponse*>
-                    (outPayload.data());
+    auto request =
+        reinterpret_cast<const GetPayloadStatusRequest*>(inPayload.data());
+    auto response =
+        reinterpret_cast<GetPayloadStatusResponse*>(outPayload.data());
 
     // SOL is the payload currently supported for payload status
     if (static_cast<uint8_t>(message::PayloadType::SOL) != request->payloadType)
@@ -184,7 +187,7 @@
 
     // Currently we support only one SOL session
     response->instance1 =
-            std::get<sol::Manager&>(singletonPool).isPayloadActive(1);
+        std::get<sol::Manager&>(singletonPool).isPayloadActive(1);
 
     return outPayload;
 }
@@ -193,22 +196,23 @@
                                     const message::Handler& handler)
 {
     std::vector<uint8_t> outPayload(sizeof(GetPayloadInfoResponse));
-    auto request = reinterpret_cast<const GetPayloadInfoRequest*>
-                   (inPayload.data());
-    auto response = reinterpret_cast<GetPayloadInfoResponse*>
-                    (outPayload.data());
+    auto request =
+        reinterpret_cast<const GetPayloadInfoRequest*>(inPayload.data());
+    auto response =
+        reinterpret_cast<GetPayloadInfoResponse*>(outPayload.data());
 
     // SOL is the payload currently supported for payload status & only one
     // instance of SOL is supported.
-    if (static_cast<uint8_t>(message::PayloadType::SOL) != request->payloadType
-        || request->payloadInstance != 1)
+    if (static_cast<uint8_t>(message::PayloadType::SOL) !=
+            request->payloadType ||
+        request->payloadInstance != 1)
     {
         response->completionCode = IPMI_CC_INVALID_FIELD_REQUEST;
         return outPayload;
     }
 
-    auto status = std::get<sol::Manager&>(singletonPool).isPayloadActive(
-            request->payloadInstance);
+    auto status = std::get<sol::Manager&>(singletonPool)
+                      .isPayloadActive(request->payloadInstance);
 
     if (!status)
     {
@@ -216,8 +220,8 @@
         return outPayload;
     }
 
-    auto& context = std::get<sol::Manager&>(singletonPool).getContext
-            (request->payloadInstance);
+    auto& context = std::get<sol::Manager&>(singletonPool)
+                        .getContext(request->payloadInstance);
     response->sessionID = context.sessionID;
 
     return outPayload;
