diff --git a/dump/create_pel.cpp b/dump/create_pel.cpp
index d92e570..90a7ea7 100644
--- a/dump/create_pel.cpp
+++ b/dump/create_pel.cpp
@@ -70,11 +70,11 @@
     }
     try
     {
-        auto service = util::getService(bus, opLoggingInterface,
-                                        loggingObjectPath);
-        auto method = bus.new_method_call(service.c_str(), loggingObjectPath,
-                                          opLoggingInterface,
-                                          "CreatePELWithFFDCFiles");
+        auto service =
+            util::getService(bus, opLoggingInterface, loggingObjectPath);
+        auto method =
+            bus.new_method_call(service.c_str(), loggingObjectPath,
+                                opLoggingInterface, "CreatePELWithFFDCFiles");
         auto level =
             sdbusplus::xyz::openbmc_project::Logging::server::convertForMessage(
                 severity);
diff --git a/dump/dump_collect_main.cpp b/dump/dump_collect_main.cpp
index dc6562b..319309a 100644
--- a/dump/dump_collect_main.cpp
+++ b/dump/dump_collect_main.cpp
@@ -30,9 +30,9 @@
 
     app.add_option("--type, -t", type, "Type of the dump")
         ->required()
-        ->check(CLI::IsMember({SBE_DUMP_TYPE_HARDWARE, SBE_DUMP_TYPE_HOSTBOOT,
-                               SBE_DUMP_TYPE_SBE, SBE_DUMP_TYPE_PERFORMANCE,
-                               SBE_DUMP_TYPE_MSBE}));
+        ->check(CLI::IsMember(
+            {SBE_DUMP_TYPE_HARDWARE, SBE_DUMP_TYPE_HOSTBOOT, SBE_DUMP_TYPE_SBE,
+             SBE_DUMP_TYPE_PERFORMANCE, SBE_DUMP_TYPE_MSBE}));
 
     app.add_option("--id, -i", id, "ID of the dump")->required();
 
diff --git a/dump/dump_monitor.cpp b/dump/dump_monitor.cpp
index 0afe7ca..4a9a357 100644
--- a/dump/dump_monitor.cpp
+++ b/dump/dump_monitor.cpp
@@ -28,8 +28,8 @@
 
     uint32_t dumpId = std::strtoul(dumpIdStr.c_str(), nullptr, 16);
     int dumpType = getDumpTypeFromId(dumpId);
-    std::filesystem::path dumpPath = std::filesystem::path(dumpOutPath) /
-                                     dumpIdStr;
+    std::filesystem::path dumpPath =
+        std::filesystem::path(dumpOutPath) / dumpIdStr;
 
     // Add type, ID, and dump path to args
     args.push_back("-t");
diff --git a/dump/dump_utils.cpp b/dump/dump_utils.cpp
index 18c1d3f..74ec563 100644
--- a/dump/dump_utils.cpp
+++ b/dump/dump_utils.cpp
@@ -23,25 +23,25 @@
         sdbusplus::bus::match::rules::propertiesChanged(
             path, "xyz.openbmc_project.Common.Progress"),
         [&](sdbusplus::message_t& msg) {
-        std::string interface;
-        std::map<std::string, std::variant<std::string, uint8_t>> property;
-        msg.read(interface, property);
+            std::string interface;
+            std::map<std::string, std::variant<std::string, uint8_t>> property;
+            msg.read(interface, property);
 
-        const auto dumpStatus = property.find("Status");
-        if (dumpStatus != property.end())
-        {
-            const std::string* status =
-                std::get_if<std::string>(&(dumpStatus->second));
-            if (status &&
-                *status !=
-                    "xyz.openbmc_project.Common.Progress.OperationStatus.InProgress")
+            const auto dumpStatus = property.find("Status");
+            if (dumpStatus != property.end())
             {
-                lg2::info("Dump status({STATUS}) : path={PATH}", "STATUS",
-                          status->c_str(), "PATH", path.c_str());
-                inProgress = false;
+                const std::string* status =
+                    std::get_if<std::string>(&(dumpStatus->second));
+                if (status &&
+                    *status !=
+                        "xyz.openbmc_project.Common.Progress.OperationStatus.InProgress")
+                {
+                    lg2::info("Dump status({STATUS}) : path={PATH}", "STATUS",
+                              status->c_str(), "PATH", path.c_str());
+                    inProgress = false;
+                }
             }
-        }
-    });
+        });
 
     // Timeout management
     for (uint32_t secondsCount = 0; inProgress && secondsCount < timeout;
@@ -74,8 +74,8 @@
     {
         auto bus = sdbusplus::bus::new_default();
         auto service = getService(bus, interface, path);
-        auto method = bus.new_method_call(service.c_str(), path, interface,
-                                          function);
+        auto method =
+            bus.new_method_call(service.c_str(), path, interface, function);
 
         std::unordered_map<std::string, std::variant<std::string, uint64_t>>
             createParams = {
diff --git a/dump/sbe_dump_collector.cpp b/dump/sbe_dump_collector.cpp
index 0a821a0..b0b3c75 100644
--- a/dump/sbe_dump_collector.cpp
+++ b/dump/sbe_dump_collector.cpp
@@ -142,9 +142,10 @@
 
     for (const auto& [procTarget, ocmbTargets] : targetMap)
     {
-        auto future = std::async(std::launch::async,
-                                 [this, procTarget, ocmbTargets, path, id, type,
-                                  cstate, failingUnit]() {
+        auto future = std::async(std::launch::async, [this, procTarget,
+                                                      ocmbTargets, path, id,
+                                                      type, cstate,
+                                                      failingUnit]() {
             try
             {
                 this->collectDumpFromSBE(procTarget, path, id, type, cstate,
@@ -273,11 +274,9 @@
     return isDumpFailure;
 }
 
-void SbeDumpCollector::collectDumpFromSBE(struct pdbg_target* chip,
-                                          const std::filesystem::path& path,
-                                          uint32_t id, uint8_t type,
-                                          uint8_t clockState,
-                                          uint64_t failingUnit)
+void SbeDumpCollector::collectDumpFromSBE(
+    struct pdbg_target* chip, const std::filesystem::path& path, uint32_t id,
+    uint8_t type, uint8_t clockState, uint64_t failingUnit)
 {
     auto chipPos = pdbg_target_index(chip);
     SBETypes sbeType = getSBEType(chip);
diff --git a/dump/sbe_dump_collector.hpp b/dump/sbe_dump_collector.hpp
index b926203..1cb2348 100644
--- a/dump/sbe_dump_collector.hpp
+++ b/dump/sbe_dump_collector.hpp
@@ -152,10 +152,9 @@
      * @return uint8_t - Returns 1 if fastarray collection is needed, 0
      * otherwise.
      */
-    inline uint8_t checkFastarrayCollectionNeeded(const uint8_t clockState,
-                                                  const uint8_t type,
-                                                  uint64_t failingUnit,
-                                                  const uint8_t chipPos) const
+    inline uint8_t checkFastarrayCollectionNeeded(
+        const uint8_t clockState, const uint8_t type, uint64_t failingUnit,
+        const uint8_t chipPos) const
     {
         using namespace openpower::dump::SBE;
 
