diff --git a/sol/sol_context.cpp b/sol/sol_context.cpp
index 7165c61..21632a4 100644
--- a/sol/sol_context.cpp
+++ b/sol/sol_context.cpp
@@ -17,18 +17,16 @@
 Context::Context(std::shared_ptr<boost::asio::io_context> io,
                  uint8_t maxRetryCount, uint8_t sendThreshold, uint8_t instance,
                  session::SessionID sessionID) :
-    accumulateTimer(*io),
-    retryTimer(*io), maxRetryCount(maxRetryCount), retryCounter(maxRetryCount),
-    sendThreshold(sendThreshold), payloadInstance(instance),
-    sessionID(sessionID)
+    accumulateTimer(*io), retryTimer(*io), maxRetryCount(maxRetryCount),
+    retryCounter(maxRetryCount), sendThreshold(sendThreshold),
+    payloadInstance(instance), sessionID(sessionID)
 {
     session = session::Manager::get().getSession(sessionID);
 }
 
-std::shared_ptr<Context>
-    Context::makeContext(std::shared_ptr<boost::asio::io_context> io,
-                         uint8_t maxRetryCount, uint8_t sendThreshold,
-                         uint8_t instance, session::SessionID sessionID)
+std::shared_ptr<Context> Context::makeContext(
+    std::shared_ptr<boost::asio::io_context> io, uint8_t maxRetryCount,
+    uint8_t sendThreshold, uint8_t instance, session::SessionID sessionID)
 {
     auto ctx = std::make_shared<Context>(io, maxRetryCount, sendThreshold,
                                          instance, sessionID);
@@ -66,12 +64,12 @@
         std::weak_ptr<Context> weakRef = weak_from_this();
         accumulateTimer.async_wait(
             [weakRef](const boost::system::error_code& ec) {
-            std::shared_ptr<Context> self = weakRef.lock();
-            if (!ec && self)
-            {
-                self->charAccTimerHandler();
-            }
-        });
+                std::shared_ptr<Context> self = weakRef.lock();
+                if (!ec && self)
+                {
+                    self->charAccTimerHandler();
+                }
+            });
     }
     else
     {
diff --git a/sol/sol_context.hpp b/sol/sol_context.hpp
index e4045c8..981360e 100644
--- a/sol/sol_context.hpp
+++ b/sol/sol_context.hpp
@@ -174,10 +174,9 @@
      *  @param[in] instance - SOL payload instance.
      *  @param[in] sessionID - BMC session ID.
      */
-    static std::shared_ptr<Context>
-        makeContext(std::shared_ptr<boost::asio::io_context> io,
-                    uint8_t maxRetryCount, uint8_t sendThreshold,
-                    uint8_t instance, session::SessionID sessionID);
+    static std::shared_ptr<Context> makeContext(
+        std::shared_ptr<boost::asio::io_context> io, uint8_t maxRetryCount,
+        uint8_t sendThreshold, uint8_t instance, session::SessionID sessionID);
 
     /** @brief Context Constructor.
      *
diff --git a/sol/sol_manager.cpp b/sol/sol_manager.cpp
index 76e1a15..8fabeeb 100644
--- a/sol/sol_manager.cpp
+++ b/sol/sol_manager.cpp
@@ -56,8 +56,8 @@
     }
     std::vector<uint8_t> buffer(readSize);
     ec.clear();
-    size_t readDataLen = consoleSocket->read_some(boost::asio::buffer(buffer),
-                                                  ec);
+    size_t readDataLen =
+        consoleSocket->read_some(boost::asio::buffer(buffer), ec);
     if (ec)
     {
         lg2::error("Reading from host console socket failed: {ERROR}", "ERROR",
@@ -101,12 +101,12 @@
 
     consoleSocket->async_wait(boost::asio::socket_base::wait_read,
                               [this](const boost::system::error_code& ec) {
-        if (!ec)
-        {
-            consoleInputHandler();
-            startHostConsole();
-        }
-    });
+                                  if (!ec)
+                                  {
+                                      consoleInputHandler();
+                                      startHostConsole();
+                                  }
+                              });
 } // namespace sol
 
 void Manager::stopHostConsole()
@@ -130,8 +130,8 @@
     {
         try
         {
-            solService = ipmi::getService(dbus, solInterface,
-                                          solPathWitheEthName);
+            solService =
+                ipmi::getService(dbus, solInterface, solPathWitheEthName);
         }
         catch (const std::runtime_error& e)
         {
@@ -251,22 +251,22 @@
                     type::signal() + member("PropertiesChanged") +
                     interface("org.freedesktop.DBus.Properties"),
                 [](sdbusplus::message_t& msg) {
-                std::string intfName;
-                std::map<std::string, std::variant<bool>> properties;
-                msg.read(intfName, properties);
+                    std::string intfName;
+                    std::map<std::string, std::variant<bool>> properties;
+                    msg.read(intfName, properties);
 
-                const auto it = properties.find("Enabled");
-                if (it != properties.end())
-                {
-                    const bool* state = std::get_if<bool>(&it->second);
-
-                    if (state != nullptr && *state == false)
+                    const auto it = properties.find("Enabled");
+                    if (it != properties.end())
                     {
-                        // Stop all the payload session.
-                        sol::Manager::get().stopAllPayloadInstance();
+                        const bool* state = std::get_if<bool>(&it->second);
+
+                        if (state != nullptr && *state == false)
+                        {
+                            // Stop all the payload session.
+                            sol::Manager::get().stopAllPayloadInstance();
+                        }
                     }
-                }
-            });
+                });
         }
     }
     catch (const sdbusplus::exception_t& e)
@@ -335,8 +335,8 @@
         }
         else if (prop.first == "RetryIntervalMS")
         {
-            sol::Manager::get().retryInterval = std::get<uint8_t>(prop.second) *
-                                                sol::retryIntervalFactor * 1ms;
+            sol::Manager::get().retryInterval =
+                std::get<uint8_t>(prop.second) * sol::retryIntervalFactor * 1ms;
         }
     }
 }
