diff --git a/bmc/buildjson.hpp b/bmc/buildjson.hpp
index d8f8c80..f064b41 100644
--- a/bmc/buildjson.hpp
+++ b/bmc/buildjson.hpp
@@ -64,7 +64,6 @@
      */
     std::vector<HandlerConfig<T>> buildHandlerConfigs(const char* directory)
     {
-
         std::vector<HandlerConfig<T>> output;
 
         std::vector<std::string> jsonPaths = GetJsonList(directory);
diff --git a/bmc/file_handler.hpp b/bmc/file_handler.hpp
index bf31f40..a0c23af 100644
--- a/bmc/file_handler.hpp
+++ b/bmc/file_handler.hpp
@@ -20,8 +20,7 @@
      * @param[in] filename - file to use for the contents, fully
      * qualified file system path.
      */
-    explicit FileHandler(const std::string& filename) : filename(filename)
-    {}
+    explicit FileHandler(const std::string& filename) : filename(filename) {}
 
     bool open(const std::string& path,
               std::ios_base::openmode mode = std::ios::out) override;
diff --git a/bmc/firmware-handler/firmware_handler.cpp b/bmc/firmware-handler/firmware_handler.cpp
index 9268809..d11702f 100644
--- a/bmc/firmware-handler/firmware_handler.cpp
+++ b/bmc/firmware-handler/firmware_handler.cpp
@@ -57,9 +57,10 @@
 
     std::vector<std::string> blobs;
     blobs.reserve(firmwares.size());
-    std::for_each(
-        firmwares.begin(), firmwares.end(),
-        [&blobs](const auto& blob) { blobs.emplace_back(blob.blobName); });
+    std::for_each(firmwares.begin(), firmwares.end(),
+                  [&blobs](const auto& blob) {
+        blobs.emplace_back(blob.blobName);
+    });
 
     if (0 == std::count(blobs.begin(), blobs.end(), hashBlobId))
     {
@@ -421,8 +422,8 @@
     /* How are they expecting to copy this data? */
     auto d = std::find_if(transports.begin(), transports.end(),
                           [&transportFlag](const auto& iter) {
-                              return (iter.bitmask == transportFlag);
-                          });
+        return (iter.bitmask == transportFlag);
+    });
     if (d == transports.end())
     {
         return false;
@@ -449,9 +450,10 @@
      * firmware handers (and file handlers, like this'll know where to write the
      * tarball, etc).
      */
-    auto h = std::find_if(
-        handlers.begin(), handlers.end(),
-        [&path](const auto& iter) { return (iter.blobName == path); });
+    auto h = std::find_if(handlers.begin(), handlers.end(),
+                          [&path](const auto& iter) {
+        return (iter.blobName == path);
+    });
     if (h == handlers.end())
     {
         return false;
diff --git a/bmc/firmware-handler/firmware_handler.hpp b/bmc/firmware-handler/firmware_handler.hpp
index 505f1a7..4f32b29 100644
--- a/bmc/firmware-handler/firmware_handler.hpp
+++ b/bmc/firmware-handler/firmware_handler.hpp
@@ -192,9 +192,10 @@
 
     void addBlobId(const std::string& blob)
     {
-        auto blobIdMatch = std::find_if(
-            blobIDs.begin(), blobIDs.end(),
-            [&blob](const std::string& iter) { return (iter == blob); });
+        auto blobIdMatch = std::find_if(blobIDs.begin(), blobIDs.end(),
+                                        [&blob](const std::string& iter) {
+            return (iter == blob);
+        });
         if (blobIdMatch == blobIDs.end())
         {
             blobIDs.push_back(blob);
diff --git a/bmc/firmware-handler/mapper_errors.hpp b/bmc/firmware-handler/mapper_errors.hpp
index 7717f4b..28be925 100644
--- a/bmc/firmware-handler/mapper_errors.hpp
+++ b/bmc/firmware-handler/mapper_errors.hpp
@@ -9,8 +9,7 @@
 class MapperException : public std::exception
 {
   public:
-    explicit MapperException(const std::string& message) : message(message)
-    {}
+    explicit MapperException(const std::string& message) : message(message) {}
 
     virtual const char* what() const noexcept override
     {
diff --git a/bmc/firmware-handler/net_handler.hpp b/bmc/firmware-handler/net_handler.hpp
index b107e72..4582e26 100644
--- a/bmc/firmware-handler/net_handler.hpp
+++ b/bmc/firmware-handler/net_handler.hpp
@@ -19,8 +19,7 @@
 class NetDataHandler : public DataInterface
 {
   public:
-    NetDataHandler() : listenFd(std::nullopt), connFd(std::nullopt)
-    {}
+    NetDataHandler() : listenFd(std::nullopt), connFd(std::nullopt) {}
 
     bool open() override;
     bool close() override;
diff --git a/bmc/general_systemd.cpp b/bmc/general_systemd.cpp
index ce16d14..02c3aea 100644
--- a/bmc/general_systemd.cpp
+++ b/bmc/general_systemd.cpp
@@ -141,8 +141,8 @@
                  job->c_str(), result.c_str());
     jobMonitor = std::nullopt;
     job = std::nullopt;
-    currentStatus =
-        result == "done" ? ActionStatus::success : ActionStatus::failed;
+    currentStatus = result == "done" ? ActionStatus::success
+                                     : ActionStatus::failed;
 
     if (cb)
     {
diff --git a/bmc/log-handler/log_handler.cpp b/bmc/log-handler/log_handler.cpp
index 1883128..9a0d296 100644
--- a/bmc/log-handler/log_handler.cpp
+++ b/bmc/log-handler/log_handler.cpp
@@ -36,44 +36,41 @@
         info->handler = std::move(config.handler);
         info->actions->onOpen->setCallback(
             [infoP = info.get()](TriggerableActionInterface& tai) {
-                auto data =
-                    std::make_shared<std::optional<std::vector<uint8_t>>>();
-                do
+            auto data = std::make_shared<std::optional<std::vector<uint8_t>>>();
+            do
+            {
+                if (tai.status() != ActionStatus::success)
                 {
-                    if (tai.status() != ActionStatus::success)
-                    {
-                        fprintf(stderr,
-                                "LogBlobHandler: Log file unit failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    if (!infoP->handler->open("", std::ios::in))
-                    {
-                        fprintf(
-                            stderr,
+                    fprintf(stderr,
+                            "LogBlobHandler: Log file unit failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
+                }
+                if (!infoP->handler->open("", std::ios::in))
+                {
+                    fprintf(stderr,
                             "LogBlobHandler: Opening log file failed for %s\n",
                             infoP->blobId.c_str());
-                        continue;
-                    }
-                    auto d = infoP->handler->read(
-                        0, std::numeric_limits<uint32_t>::max());
-                    infoP->handler->close();
-                    if (!d)
-                    {
-                        fprintf(
-                            stderr,
+                    continue;
+                }
+                auto d = infoP->handler->read(
+                    0, std::numeric_limits<uint32_t>::max());
+                infoP->handler->close();
+                if (!d)
+                {
+                    fprintf(stderr,
                             "LogBlobHandler: Reading log file failed for %s\n",
                             infoP->blobId.c_str());
-                        continue;
-                    }
-                    *data = std::move(d);
-                } while (false);
-                for (auto sessionP : infoP->sessionsToUpdate)
-                {
-                    sessionP->data = data;
+                    continue;
                 }
-                infoP->sessionsToUpdate.clear();
-            });
+                *data = std::move(d);
+            } while (false);
+            for (auto sessionP : infoP->sessionsToUpdate)
+            {
+                sessionP->data = data;
+            }
+            infoP->sessionsToUpdate.clear();
+        });
         if (!blobInfoMap.try_emplace(info->blobId, std::move(info)).second)
         {
             fprintf(stderr,
@@ -211,8 +208,8 @@
     }
     else
     {
-        meta->blobState =
-            blobs::StateFlags::committed | blobs::StateFlags::open_read;
+        meta->blobState = blobs::StateFlags::committed |
+                          blobs::StateFlags::open_read;
         meta->size = (*data)->size();
     }
     return true;
diff --git a/bmc/skip_action.cpp b/bmc/skip_action.cpp
index f1a67e0..dc40932 100644
--- a/bmc/skip_action.cpp
+++ b/bmc/skip_action.cpp
@@ -35,8 +35,7 @@
     return true;
 }
 
-void SkipAction::abort()
-{}
+void SkipAction::abort() {}
 
 ActionStatus SkipAction::status()
 {
diff --git a/bmc/version-handler/version_handler.cpp b/bmc/version-handler/version_handler.cpp
index 0efdcf7..f26884b 100644
--- a/bmc/version-handler/version_handler.cpp
+++ b/bmc/version-handler/version_handler.cpp
@@ -23,39 +23,38 @@
         info->handler = std::move(config.handler);
         info->actions->onOpen->setCallback(
             [infoP = info.get()](TriggerableActionInterface& tai) {
-                auto data =
-                    std::make_shared<std::optional<std::vector<uint8_t>>>();
-                do
+            auto data = std::make_shared<std::optional<std::vector<uint8_t>>>();
+            do
+            {
+                if (tai.status() != ActionStatus::success)
                 {
-                    if (tai.status() != ActionStatus::success)
-                    {
-                        fprintf(stderr, "Version file unit failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    if (!infoP->handler->open("", std::ios::in))
-                    {
-                        fprintf(stderr, "Opening version file failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    auto d = infoP->handler->read(
-                        0, std::numeric_limits<uint32_t>::max());
-                    infoP->handler->close();
-                    if (!d)
-                    {
-                        fprintf(stderr, "Reading version file failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    *data = std::move(d);
-                } while (false);
-                for (auto sessionP : infoP->sessionsToUpdate)
-                {
-                    sessionP->data = data;
+                    fprintf(stderr, "Version file unit failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
                 }
-                infoP->sessionsToUpdate.clear();
-            });
+                if (!infoP->handler->open("", std::ios::in))
+                {
+                    fprintf(stderr, "Opening version file failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
+                }
+                auto d = infoP->handler->read(
+                    0, std::numeric_limits<uint32_t>::max());
+                infoP->handler->close();
+                if (!d)
+                {
+                    fprintf(stderr, "Reading version file failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
+                }
+                *data = std::move(d);
+            } while (false);
+            for (auto sessionP : infoP->sessionsToUpdate)
+            {
+                sessionP->data = data;
+            }
+            infoP->sessionsToUpdate.clear();
+        });
         if (!blobInfoMap.try_emplace(info->blobId, std::move(info)).second)
         {
             fprintf(stderr, "Ignoring duplicate config for %s\n",
@@ -170,8 +169,8 @@
     }
     else
     {
-        meta->blobState =
-            blobs::StateFlags::committed | blobs::StateFlags::open_read;
+        meta->blobState = blobs::StateFlags::committed |
+                          blobs::StateFlags::open_read;
         meta->size = (*data)->size();
     }
     return true;
