diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 0b87555..3fc4133 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -245,8 +245,8 @@
         return -1;
     }
 
-    std::string msg =
-        redfish::registries::fillMessageArgs(messageArgs, message->message);
+    std::string msg = redfish::registries::fillMessageArgs(messageArgs,
+                                                           message->message);
     if (msg.empty())
     {
         return -1;
@@ -440,8 +440,8 @@
         msg["Name"] = "Event Log";
         msg["Events"] = logEntryArray;
 
-        std::string strMsg =
-            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+        std::string strMsg = msg.dump(2, ' ', true,
+                                      nlohmann::json::error_handler_t::replace);
         return this->sendEvent(strMsg);
     }
 
@@ -509,8 +509,8 @@
         msg["Name"] = "Event Log";
         msg["Events"] = logEntryArray;
 
-        std::string strMsg =
-            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+        std::string strMsg = msg.dump(2, ' ', true,
+                                      nlohmann::json::error_handler_t::replace);
         this->sendEvent(strMsg);
     }
 #endif
@@ -549,8 +549,8 @@
             msg["Context"] = customText;
         }
 
-        std::string strMsg =
-            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+        std::string strMsg = msg.dump(2, ' ', true,
+                                      nlohmann::json::error_handler_t::replace);
         this->sendEvent(strMsg);
     }
 
@@ -883,7 +883,6 @@
     std::string addSubscription(const std::shared_ptr<Subscription>& subValue,
                                 const bool updateFile = true)
     {
-
         std::uniform_int_distribution<uint32_t> dist(0);
         bmcweb::OpenSSLGenerator gen;
 
@@ -1317,8 +1316,8 @@
         }
 
         // Watch redfish event log file for modifications.
-        fileWatchDesc =
-            inotify_add_watch(inotifyFd, redfishEventLogFile, IN_MODIFY);
+        fileWatchDesc = inotify_add_watch(inotifyFd, redfishEventLogFile,
+                                          IN_MODIFY);
         if (fileWatchDesc == -1)
         {
             BMCWEB_LOG_ERROR
diff --git a/redfish-core/include/gzfile.hpp b/redfish-core/include/gzfile.hpp
index 844932a..34bc151 100644
--- a/redfish-core/include/gzfile.hpp
+++ b/redfish-core/include/gzfile.hpp
@@ -97,8 +97,8 @@
 
         while (pos != std::string::npos)
         {
-            std::string logEntry =
-                bufferStr.substr(initialPos, pos - initialPos);
+            std::string logEntry = bufferStr.substr(initialPos,
+                                                    pos - initialPos);
             // Since there might be consecutive delimiters like "\r\n", we need
             // to filter empty strings.
             if (!logEntry.empty())
diff --git a/redfish-core/include/redfish_aggregator.hpp b/redfish-core/include/redfish_aggregator.hpp
index 9168cc5..896eb4a 100644
--- a/redfish-core/include/redfish_aggregator.hpp
+++ b/redfish-core/include/redfish_aggregator.hpp
@@ -815,8 +815,8 @@
         if (boost::iequals(contentType, "application/json") ||
             boost::iequals(contentType, "application/json; charset=utf-8"))
         {
-            nlohmann::json jsonVal =
-                nlohmann::json::parse(resp.body(), nullptr, false);
+            nlohmann::json jsonVal = nlohmann::json::parse(resp.body(), nullptr,
+                                                           false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR << "Error parsing satellite response as JSON";
@@ -879,8 +879,8 @@
         if (boost::iequals(contentType, "application/json") ||
             boost::iequals(contentType, "application/json; charset=utf-8"))
         {
-            nlohmann::json jsonVal =
-                nlohmann::json::parse(resp.body(), nullptr, false);
+            nlohmann::json jsonVal = nlohmann::json::parse(resp.body(), nullptr,
+                                                           false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR << "Error parsing satellite response as JSON";
@@ -1013,8 +1013,8 @@
             boost::iequals(contentType, "application/json; charset=utf-8"))
         {
             bool addedLinks = false;
-            nlohmann::json jsonVal =
-                nlohmann::json::parse(resp.body(), nullptr, false);
+            nlohmann::json jsonVal = nlohmann::json::parse(resp.body(), nullptr,
+                                                           false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR << "Error parsing satellite response as JSON";
diff --git a/redfish-core/include/utils/json_utils.hpp b/redfish-core/include/utils/json_utils.hpp
index 26b9a8a..774ab7c 100644
--- a/redfish-core/include/utils/json_utils.hpp
+++ b/redfish-core/include/utils/json_utils.hpp
@@ -505,8 +505,7 @@
     return result;
 }
 
-inline void packVariant(std::span<PerUnpack> /*toPack*/)
-{}
+inline void packVariant(std::span<PerUnpack> /*toPack*/) {}
 
 template <typename FirstType, typename... UnpackTypes>
 void packVariant(std::span<PerUnpack> toPack, std::string_view key,
diff --git a/redfish-core/include/utils/query_param.hpp b/redfish-core/include/utils/query_param.hpp
index 96885eb..e6ca9d3 100644
--- a/redfish-core/include/utils/query_param.hpp
+++ b/redfish-core/include/utils/query_param.hpp
@@ -916,9 +916,9 @@
             constexpr std::array<std::string_view, 5> reservedProperties = {
                 "@odata.id", "@odata.type", "@odata.context", "@odata.etag",
                 "error"};
-            bool reserved =
-                std::find(reservedProperties.begin(), reservedProperties.end(),
-                          it.key()) != reservedProperties.end();
+            bool reserved = std::find(reservedProperties.begin(),
+                                      reservedProperties.end(),
+                                      it.key()) != reservedProperties.end();
             if (reserved || (nextNode != nullptr && nextNode->isSelected()))
             {
                 it = nextIt;
diff --git a/redfish-core/include/utils/sw_utils.hpp b/redfish-core/include/utils/sw_utils.hpp
index 90048dd..7c746a0 100644
--- a/redfish-core/include/utils/sw_utils.hpp
+++ b/redfish-core/include/utils/sw_utils.hpp
@@ -110,7 +110,6 @@
                                      std::string, std::vector<std::string>>>>&
                      obj : subtree)
             {
-
                 sdbusplus::message::object_path path(obj.first);
                 std::string swId = path.filename();
                 if (swId.empty())
diff --git a/redfish-core/include/utils/time_utils.hpp b/redfish-core/include/utils/time_utils.hpp
index f4fb0c0..cb018ef 100644
--- a/redfish-core/include/utils/time_utils.hpp
+++ b/redfish-core/include/utils/time_utils.hpp
@@ -261,8 +261,8 @@
     z += 719468;
     IntType era = (z >= 0 ? z : z - 146096) / 146097;
     unsigned doe = static_cast<unsigned>(z - era * 146097); // [0, 146096]
-    unsigned yoe =
-        (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; // [0, 399]
+    unsigned yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) /
+                   365;                                     // [0, 399]
     IntType y = static_cast<IntType>(yoe) + era * 400;
     unsigned doy = doe - (365 * yoe + yoe / 4 - yoe / 100); // [0, 365]
     unsigned mp = (5 * doy + 2) / 153;                      // [0, 11]
