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;
         }
     }
 }
