diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index a844b61..c9d4eb8 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -204,8 +204,8 @@
                                 const LDAPConfigData& confData,
                                 const std::string& ldapType)
 {
-    std::string service =
-        (ldapType == "LDAP") ? "LDAPService" : "ActiveDirectoryService";
+    std::string service = (ldapType == "LDAP") ? "LDAPService"
+                                               : "ActiveDirectoryService";
 
     nlohmann::json& ldap = jsonResponse[ldapType];
 
@@ -265,9 +265,8 @@
                         messages::internalError(asyncResp->res);
                         return;
                     }
-                    asyncResp->res
-                        .jsonValue[serverType]["RemoteRoleMapping"][index] =
-                        nullptr;
+                    asyncResp->res.jsonValue[serverType]["RemoteRoleMapping"]
+                                            [index] = nullptr;
                     },
                     ldapDbusService, roleMapObjData[index].first,
                     "xyz.openbmc_project.Object.Delete", "Delete");
@@ -361,8 +360,8 @@
             {
                 BMCWEB_LOG_DEBUG
                     << "setRoleMappingProperties: Creating new Object";
-                std::string pathString =
-                    "RemoteRoleMapping/" + std::to_string(index);
+                std::string pathString = "RemoteRoleMapping/" +
+                                         std::to_string(index);
 
                 if (!localRole)
                 {
@@ -423,7 +422,6 @@
 inline void getLDAPConfigData(const std::string& ldapType,
                               CallbackFunc&& callback)
 {
-
     constexpr std::array<std::string_view, 2> interfaces = {
         ldapEnableInterface, ldapConfigInterface};
 
@@ -509,7 +507,6 @@
                     }
                     else if (interface.first == ldapConfigInterfaceStr)
                     {
-
                         for (const auto& property : interface.second)
                         {
                             const std::string* strValue =
@@ -712,9 +709,8 @@
             messages::internalError(asyncResp->res);
             return;
         }
-        asyncResp->res
-            .jsonValue[ldapServerElementName]["Authentication"]["Username"] =
-            username;
+        asyncResp->res.jsonValue[ldapServerElementName]["Authentication"]
+                                ["Username"] = username;
         BMCWEB_LOG_DEBUG << "Updated the username";
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
@@ -745,9 +741,8 @@
             messages::internalError(asyncResp->res);
             return;
         }
-        asyncResp->res
-            .jsonValue[ldapServerElementName]["Authentication"]["Password"] =
-            "";
+        asyncResp->res.jsonValue[ldapServerElementName]["Authentication"]
+                                ["Password"] = "";
         BMCWEB_LOG_DEBUG << "Updated the password";
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
@@ -1588,8 +1583,8 @@
             if (userCanSeeAllAccounts || (thisUser == user && userCanSeeSelf))
             {
                 nlohmann::json::object_t member;
-                member["@odata.id"] =
-                    "/redfish/v1/AccountService/Accounts/" + user;
+                member["@odata.id"] = "/redfish/v1/AccountService/Accounts/" +
+                                      user;
                 memberArray.push_back(std::move(member));
             }
         }
@@ -2016,7 +2011,6 @@
 
 inline void requestAccountServiceRoutes(App& app)
 {
-
     BMCWEB_ROUTE(app, "/redfish/v1/AccountService/")
         .privileges(redfish::privileges::headAccountService)
         .methods(boost::beast::http::verb::head)(
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index cdeb210..3cb6a3f 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -24,23 +24,23 @@
 {
 namespace certs
 {
-constexpr char const* certInstallIntf = "xyz.openbmc_project.Certs.Install";
-constexpr char const* certReplaceIntf = "xyz.openbmc_project.Certs.Replace";
-constexpr char const* objDeleteIntf = "xyz.openbmc_project.Object.Delete";
-constexpr char const* certPropIntf = "xyz.openbmc_project.Certs.Certificate";
-constexpr char const* dbusPropIntf = "org.freedesktop.DBus.Properties";
-constexpr char const* dbusObjManagerIntf = "org.freedesktop.DBus.ObjectManager";
-constexpr char const* httpsServiceName =
+constexpr const char* certInstallIntf = "xyz.openbmc_project.Certs.Install";
+constexpr const char* certReplaceIntf = "xyz.openbmc_project.Certs.Replace";
+constexpr const char* objDeleteIntf = "xyz.openbmc_project.Object.Delete";
+constexpr const char* certPropIntf = "xyz.openbmc_project.Certs.Certificate";
+constexpr const char* dbusPropIntf = "org.freedesktop.DBus.Properties";
+constexpr const char* dbusObjManagerIntf = "org.freedesktop.DBus.ObjectManager";
+constexpr const char* httpsServiceName =
     "xyz.openbmc_project.Certs.Manager.Server.Https";
-constexpr char const* ldapServiceName =
+constexpr const char* ldapServiceName =
     "xyz.openbmc_project.Certs.Manager.Client.Ldap";
-constexpr char const* authorityServiceName =
+constexpr const char* authorityServiceName =
     "xyz.openbmc_project.Certs.Manager.Authority.Ldap";
-constexpr char const* baseObjectPath = "/xyz/openbmc_project/certs";
-constexpr char const* httpsObjectPath =
+constexpr const char* baseObjectPath = "/xyz/openbmc_project/certs";
+constexpr const char* httpsObjectPath =
     "/xyz/openbmc_project/certs/server/https";
-constexpr char const* ldapObjectPath = "/xyz/openbmc_project/certs/client/ldap";
-constexpr char const* authorityObjectPath =
+constexpr const char* ldapObjectPath = "/xyz/openbmc_project/certs/client/ldap";
+constexpr const char* authorityObjectPath =
     "/xyz/openbmc_project/certs/authority/ldap";
 } // namespace certs
 
@@ -517,8 +517,8 @@
                                        "bmc", "NetworkProtocol", "HTTPS",
                                        "Certificates", std::ref(id)))
     {
-        objectPath =
-            sdbusplus::message::object_path(certs::httpsObjectPath) / id;
+        objectPath = sdbusplus::message::object_path(certs::httpsObjectPath) /
+                     id;
         name = "HTTPS certificate";
         service = certs::httpsServiceName;
     }
@@ -526,8 +526,8 @@
                                             "AccountService", "LDAP",
                                             "Certificates", std::ref(id)))
     {
-        objectPath =
-            sdbusplus::message::object_path(certs::ldapObjectPath) / id;
+        objectPath = sdbusplus::message::object_path(certs::ldapObjectPath) /
+                     id;
         name = "LDAP certificate";
         service = certs::ldapServiceName;
     }
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 9563290..e4e7b5a 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -429,8 +429,8 @@
                     const dbus::utility::ManagedObjectType& dbusData,
                     boost::container::flat_set<IPv6AddressData>& ipv6Config)
 {
-    const std::string ipPathStart =
-        "/xyz/openbmc_project/network/" + ethifaceId;
+    const std::string ipPathStart = "/xyz/openbmc_project/network/" +
+                                    ethifaceId;
 
     // Since there might be several IPv6 configurations aligned with
     // single ethernet interface, loop over all of them
@@ -527,8 +527,8 @@
                   const dbus::utility::ManagedObjectType& dbusData,
                   boost::container::flat_set<IPv4AddressData>& ipv4Config)
 {
-    const std::string ipPathStart =
-        "/xyz/openbmc_project/network/" + ethifaceId;
+    const std::string ipPathStart = "/xyz/openbmc_project/network/" +
+                                    ethifaceId;
 
     // Since there might be several IPv4 configurations aligned with
     // single ethernet interface, loop over all of them
@@ -917,8 +917,8 @@
     handleMTUSizePatch(const std::string& ifaceId, const size_t mtuSize,
                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-    sdbusplus::message::object_path objPath =
-        "/xyz/openbmc_project/network/" + ifaceId;
+    sdbusplus::message::object_path objPath = "/xyz/openbmc_project/network/" +
+                                              ifaceId;
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code& ec) {
         if (ec)
@@ -1263,8 +1263,8 @@
 
     for (nlohmann::json& thisJson : input)
     {
-        std::string pathString =
-            "IPv4StaticAddresses/" + std::to_string(entryIdx);
+        std::string pathString = "IPv4StaticAddresses/" +
+                                 std::to_string(entryIdx);
 
         if (!thisJson.is_null() && !thisJson.empty())
         {
@@ -1379,8 +1379,8 @@
                 deleteAndCreateIPAddress(IpVersion::IpV4, ifaceId,
                                          nicIpEntry->id, prefixLength, *gw,
                                          *addr, asyncResp);
-                nicIpEntry =
-                    getNextStaticIpEntry(++nicIpEntry, ipv4Data.cend());
+                nicIpEntry = getNextStaticIpEntry(++nicIpEntry,
+                                                  ipv4Data.cend());
             }
             else
             {
@@ -1415,8 +1415,8 @@
             }
             if (nicIpEntry != ipv4Data.cend())
             {
-                nicIpEntry =
-                    getNextStaticIpEntry(++nicIpEntry, ipv4Data.cend());
+                nicIpEntry = getNextStaticIpEntry(++nicIpEntry,
+                                                  ipv4Data.cend());
             }
             entryIdx++;
         }
@@ -1461,8 +1461,8 @@
         getNextStaticIpEntry(ipv6Data.cbegin(), ipv6Data.cend());
     for (const nlohmann::json& thisJson : input)
     {
-        std::string pathString =
-            "IPv6StaticAddresses/" + std::to_string(entryIdx);
+        std::string pathString = "IPv6StaticAddresses/" +
+                                 std::to_string(entryIdx);
 
         if (!thisJson.is_null() && !thisJson.empty())
         {
@@ -1522,8 +1522,8 @@
                 deleteAndCreateIPAddress(IpVersion::IpV6, ifaceId,
                                          nicIpEntry->id, prefix, "", *addr,
                                          asyncResp);
-                nicIpEntry =
-                    getNextStaticIpEntry(++nicIpEntry, ipv6Data.cend());
+                nicIpEntry = getNextStaticIpEntry(++nicIpEntry,
+                                                  ipv6Data.cend());
             }
             else
             {
@@ -1557,8 +1557,8 @@
             }
             if (nicIpEntry != ipv6Data.cend())
             {
-                nicIpEntry =
-                    getNextStaticIpEntry(++nicIpEntry, ipv6Data.cend());
+                nicIpEntry = getNextStaticIpEntry(++nicIpEntry,
+                                                  ipv6Data.cend());
             }
             entryIdx++;
         }
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index c418504..82004e0 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -162,7 +162,6 @@
 
 inline void requestRoutesSubmitTestEvent(App& app)
 {
-
     BMCWEB_ROUTE(
         app, "/redfish/v1/EventService/Actions/EventService.SubmitTestEvent/")
         .privileges(redfish::privileges::postEventService)
@@ -210,8 +209,8 @@
         for (const std::string& id : subscripIds)
         {
             nlohmann::json::object_t member;
-            member["@odata.id"] =
-                "/redfish/v1/EventService/Subscriptions/" + id;
+            member["@odata.id"] = "/redfish/v1/EventService/Subscriptions/" +
+                                  id;
             memberArray.push_back(std::move(member));
         }
         });
diff --git a/redfish-core/lib/fabric_adapters.hpp b/redfish-core/lib/fabric_adapters.hpp
index 1799159..be89fbc 100644
--- a/redfish-core/lib/fabric_adapters.hpp
+++ b/redfish-core/lib/fabric_adapters.hpp
@@ -25,7 +25,6 @@
                                crow::Response& res,
                                const std::string& adapterId)
 {
-
     if (ec.value() == boost::system::errc::io_error)
     {
         messages::resourceNotFound(res, "#FabricAdapter.v1_4_0.FabricAdapter",
diff --git a/redfish-core/lib/health.hpp b/redfish-core/lib/health.hpp
index 643ce7f..ef858a1 100644
--- a/redfish-core/lib/health.hpp
+++ b/redfish-core/lib/health.hpp
@@ -82,7 +82,6 @@
             // managers inventory is all the inventory, don't skip any
             if (!isManagersHealth && !isSelf)
             {
-
                 // We only want to look at this association if either the path
                 // of this association is an inventory item, or one of the
                 // endpoints in this association is a child
diff --git a/redfish-core/lib/hypervisor_system.hpp b/redfish-core/lib/hypervisor_system.hpp
index 1c27223..e524145 100644
--- a/redfish-core/lib/hypervisor_system.hpp
+++ b/redfish-core/lib/hypervisor_system.hpp
@@ -327,8 +327,8 @@
             return;
         }
 
-        bool found =
-            extractHypervisorInterfaceData(ethIfaceId, resp, ethData, ipv4Data);
+        bool found = extractHypervisorInterfaceData(ethIfaceId, resp, ethData,
+                                                    ipv4Data);
         if (!found)
         {
             BMCWEB_LOG_INFO << "Hypervisor Interface not found";
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 5159ae1..aeb1d19 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -56,14 +56,14 @@
 namespace redfish
 {
 
-constexpr char const* crashdumpObject = "com.intel.crashdump";
-constexpr char const* crashdumpPath = "/com/intel/crashdump";
-constexpr char const* crashdumpInterface = "com.intel.crashdump";
-constexpr char const* deleteAllInterface =
+constexpr const char* crashdumpObject = "com.intel.crashdump";
+constexpr const char* crashdumpPath = "/com/intel/crashdump";
+constexpr const char* crashdumpInterface = "com.intel.crashdump";
+constexpr const char* deleteAllInterface =
     "xyz.openbmc_project.Collection.DeleteAll";
-constexpr char const* crashdumpOnDemandInterface =
+constexpr const char* crashdumpOnDemandInterface =
     "com.intel.crashdump.OnDemand";
-constexpr char const* crashdumpTelemetryInterface =
+constexpr const char* crashdumpTelemetryInterface =
     "com.intel.crashdump.Telemetry";
 
 enum class DumpCreationProgress
@@ -274,8 +274,8 @@
         }
     }
     // Timestamp has no index
-    auto [ptr, ec] =
-        std::from_chars(tsStr.data(), tsStr.data() + tsStr.size(), timestamp);
+    auto [ptr, ec] = std::from_chars(tsStr.data(), tsStr.data() + tsStr.size(),
+                                     timestamp);
     if (ec != std::errc())
     {
         messages::resourceNotFound(asyncResp->res, "LogEntry", entryID);
@@ -489,8 +489,8 @@
             "#LogEntryCollection.LogEntryCollection";
         asyncResp->res.jsonValue["@odata.id"] = std::move(odataIdStr);
         asyncResp->res.jsonValue["Name"] = dumpType + " Dump Entries";
-        asyncResp->res.jsonValue["Description"] =
-            "Collection of " + dumpType + " Dump Entries";
+        asyncResp->res.jsonValue["Description"] = "Collection of " + dumpType +
+                                                  " Dump Entries";
 
         nlohmann::json& entriesArray = asyncResp->res.jsonValue["Members"];
         entriesArray = nlohmann::json::array();
@@ -552,16 +552,16 @@
             if (dumpType == "BMC")
             {
                 thisEntry["DiagnosticDataType"] = "Manager";
-                thisEntry["AdditionalDataURI"] =
-                    entriesPath + entryID + "/attachment";
+                thisEntry["AdditionalDataURI"] = entriesPath + entryID +
+                                                 "/attachment";
                 thisEntry["AdditionalDataSizeBytes"] = size;
             }
             else if (dumpType == "System")
             {
                 thisEntry["DiagnosticDataType"] = "OEM";
                 thisEntry["OEMDiagnosticDataType"] = "System";
-                thisEntry["AdditionalDataURI"] =
-                    entriesPath + entryID + "/attachment";
+                thisEntry["AdditionalDataURI"] = entriesPath + entryID +
+                                                 "/attachment";
                 thisEntry["AdditionalDataSizeBytes"] = size;
             }
             entriesArray.push_back(std::move(thisEntry));
@@ -854,8 +854,8 @@
             nlohmann::json retMessage = messages::success();
             taskData->messages.emplace_back(retMessage);
 
-            std::string headerLoc =
-                "Location: " + dumpEntryPath + http_helpers::urlEncode(dumpId);
+            std::string headerLoc = "Location: " + dumpEntryPath +
+                                    http_helpers::urlEncode(dumpId);
             taskData->payload->httpHeaders.emplace_back(std::move(headerLoc));
 
             BMCWEB_LOG_DEBUG << createdObjPath.str
@@ -1424,8 +1424,8 @@
                 firstEntry = false;
 
                 nlohmann::json::object_t bmcLogEntry;
-                LogParseError status =
-                    fillEventLogEntryJson(idStr, logEntry, bmcLogEntry);
+                LogParseError status = fillEventLogEntryJson(idStr, logEntry,
+                                                             bmcLogEntry);
                 if (status == LogParseError::messageIdNotInRegistry)
                 {
                     continue;
@@ -3898,9 +3898,9 @@
             endCount = entryCount + postcode.size();
             if (skip < endCount && (top + skip) > entryCount)
             {
-                uint64_t thisBootSkip =
-                    std::max(static_cast<uint64_t>(skip), entryCount) -
-                    entryCount;
+                uint64_t thisBootSkip = std::max(static_cast<uint64_t>(skip),
+                                                 entryCount) -
+                                        entryCount;
                 uint64_t thisBootTop =
                     std::min(static_cast<uint64_t>(top + skip), endCount) -
                     entryCount;
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 6e1427b..134ecb6 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -163,7 +163,6 @@
  */
 inline void requestRoutesManagerResetToDefaultsAction(App& app)
 {
-
     /**
      * Function handles ResetToDefaults POST method request.
      *
@@ -288,7 +287,6 @@
                      const std::vector<std::string>& supportedProfiles,
                      const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-
     crow::connections::systemBus->async_method_call(
         [asyncResp, currentProfile, supportedProfiles](
             const boost::system::error_code& ec,
@@ -440,7 +438,6 @@
                 // pid and fans are off the same configuration
                 else if (intfPair.first == pidConfigurationIface)
                 {
-
                     if (classPtr == nullptr)
                     {
                         BMCWEB_LOG_ERROR << "Pid Class Field illegal";
@@ -569,7 +566,6 @@
                     if (intfPair.first == pidConfigurationIface ||
                         intfPair.first == stepwiseConfigurationIface)
                     {
-
                         if (propertyPair.first == "Zones")
                         {
                             const std::vector<std::string>* inputs =
@@ -782,7 +778,6 @@
     dbus::utility::DBusPropertiesMap& output, std::string& chassis,
     const std::string& profile)
 {
-
     // common deleter
     if (it.value() == nullptr)
     {
@@ -1027,7 +1022,6 @@
 
         if (chassisContainer)
         {
-
             std::string chassisId;
             if (!redfish::json_util::readJson(*chassisContainer, response->res,
                                               "@odata.id", chassisId))
@@ -1116,7 +1110,6 @@
         {
             for (std::string& value : *inputs)
             {
-
                 std::replace(value.begin(), value.end(), '_', ' ');
             }
             output.emplace_back("Inputs", std::move(*inputs));
@@ -1328,12 +1321,10 @@
 
 struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
 {
-
     SetPIDValues(const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn,
                  nlohmann::json& data) :
         asyncResp(asyncRespIn)
     {
-
         std::optional<nlohmann::json> pidControllers;
         std::optional<nlohmann::json> fanControllers;
         std::optional<nlohmann::json> fanZones;
@@ -1508,12 +1499,12 @@
                 std::replace(dbusObjName.begin(), dbusObjName.end(), ' ', '_');
                 BMCWEB_LOG_DEBUG << "looking for " << name;
 
-                auto pathItr =
-                    std::find_if(managedObj.begin(), managedObj.end(),
-                                 [&dbusObjName](const auto& obj) {
+                auto pathItr = std::find_if(managedObj.begin(),
+                                            managedObj.end(),
+                                            [&dbusObjName](const auto& obj) {
                     return boost::algorithm::ends_with(obj.first.str,
                                                        "/" + dbusObjName);
-                    });
+                });
                 dbus::utility::DBusPropertiesMap output;
 
                 output.reserve(16); // The pid interface length
@@ -2107,7 +2098,6 @@
                 if (interfaceName ==
                     "xyz.openbmc_project.Inventory.Decorator.Asset")
                 {
-
                     sdbusplus::asio::getAllProperties(
                         *crow::connections::systemBus, connectionName, path,
                         "xyz.openbmc_project.Inventory.Decorator.Asset",
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index 4478472..c57d387 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -243,15 +243,14 @@
 
     if (volatileSizeInKiB != nullptr)
     {
-
         aResp->res.jsonValue[jsonPtr]["VolatileSizeMiB"] =
             (*volatileSizeInKiB) >> 10;
     }
 
     if (pmSizeInKiB != nullptr)
     {
-        aResp->res.jsonValue[jsonPtr]["NonVolatileSizeMiB"] =
-            (*pmSizeInKiB) >> 10;
+        aResp->res.jsonValue[jsonPtr]["NonVolatileSizeMiB"] = (*pmSizeInKiB) >>
+                                                              10;
     }
 
     if (cacheSizeInKB != nullptr)
@@ -364,30 +363,26 @@
 
     if (dataLockCapable != nullptr)
     {
-        aResp->res
-            .jsonValue[jsonPtr]["SecurityCapabilities"]["DataLockCapable"] =
-            *dataLockCapable;
+        aResp->res.jsonValue[jsonPtr]["SecurityCapabilities"]
+                            ["DataLockCapable"] = *dataLockCapable;
     }
 
     if (passphraseCapable != nullptr)
     {
-        aResp->res
-            .jsonValue[jsonPtr]["SecurityCapabilities"]["PassphraseCapable"] =
-            *passphraseCapable;
+        aResp->res.jsonValue[jsonPtr]["SecurityCapabilities"]
+                            ["PassphraseCapable"] = *passphraseCapable;
     }
 
     if (maxPassphraseCount != nullptr)
     {
-        aResp->res
-            .jsonValue[jsonPtr]["SecurityCapabilities"]["MaxPassphraseCount"] =
-            *maxPassphraseCount;
+        aResp->res.jsonValue[jsonPtr]["SecurityCapabilities"]
+                            ["MaxPassphraseCount"] = *maxPassphraseCount;
     }
 
     if (passphraseLockLimit != nullptr)
     {
-        aResp->res
-            .jsonValue[jsonPtr]["SecurityCapabilities"]["PassphraseLockLimit"] =
-            *passphraseLockLimit;
+        aResp->res.jsonValue[jsonPtr]["SecurityCapabilities"]
+                            ["PassphraseLockLimit"] = *passphraseLockLimit;
     }
 }
 
@@ -593,9 +588,8 @@
 
     if (locationCode != nullptr)
     {
-        aResp->res
-            .jsonValue[jsonPtr]["Location"]["PartLocation"]["ServiceLabel"] =
-            *locationCode;
+        aResp->res.jsonValue[jsonPtr]["Location"]["PartLocation"]
+                            ["ServiceLabel"] = *locationCode;
     }
 
     getPersistentMemoryProperties(aResp, properties, jsonPtr);
diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index 41464bc..907f6cf 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -115,8 +115,8 @@
     asyncResp->res.jsonValue["@odata.type"] =
         "#MessageRegistryFile.v1_1_0.MessageRegistryFile";
     asyncResp->res.jsonValue["Name"] = registry + " Message Registry File";
-    asyncResp->res.jsonValue["Description"] =
-        dmtf + registry + " Message Registry File Location";
+    asyncResp->res.jsonValue["Description"] = dmtf + registry +
+                                              " Message Registry File Location";
     asyncResp->res.jsonValue["Id"] = header->registryPrefix;
     asyncResp->res.jsonValue["Registry"] = header->id;
     nlohmann::json::array_t languages;
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index 2e97fa0..b184889 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -233,8 +233,8 @@
     {
         const std::vector<std::string>& uris = metric.second;
 
-        std::optional<IncorrectMetricUri> error =
-            getChassisSensorNode(uris, matched);
+        std::optional<IncorrectMetricUri> error = getChassisSensorNode(uris,
+                                                                       matched);
         if (error)
         {
             messages::propertyValueIncorrect(asyncResp->res, error->uri,
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index 2621fd6..d06e21a 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -485,7 +485,6 @@
     App& app, const crow::Request& req,
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-
     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
     {
         return;
diff --git a/redfish-core/lib/pcie.hpp b/redfish-core/lib/pcie.hpp
index 631b5c1..f2acecc 100644
--- a/redfish-core/lib/pcie.hpp
+++ b/redfish-core/lib/pcie.hpp
@@ -31,7 +31,7 @@
 namespace redfish
 {
 
-static constexpr char const* inventoryPath = "/xyz/openbmc_project/inventory";
+static constexpr const char* inventoryPath = "/xyz/openbmc_project/inventory";
 static constexpr std::array<std::string_view, 1> pcieDeviceInterface = {
     "xyz.openbmc_project.Inventory.Item.PCIeDevice"};
 
@@ -430,8 +430,8 @@
     {
         // Check if this function exists by
         // looking for a device ID
-        std::string devIDProperty =
-            "Function" + std::to_string(functionNum) + "DeviceId";
+        std::string devIDProperty = "Function" + std::to_string(functionNum) +
+                                    "DeviceId";
         const std::string* property = nullptr;
         for (const auto& propEntry : pcieDevProperties)
         {
diff --git a/redfish-core/lib/pcie_slots.hpp b/redfish-core/lib/pcie_slots.hpp
index 2b9ef2b..b588ac0 100644
--- a/redfish-core/lib/pcie_slots.hpp
+++ b/redfish-core/lib/pcie_slots.hpp
@@ -124,7 +124,6 @@
 
     if (lanes != nullptr)
     {
-
         slot["Lanes"] = *lanes;
     }
 
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index 5d7bbb7..a0eadf5 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -121,7 +121,6 @@
 }
 inline void requestRoutesPower(App& app)
 {
-
     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/Power/")
         .privileges(redfish::privileges::getPower)
         .methods(boost::beast::http::verb::get)(
@@ -178,8 +177,8 @@
                     len = end - (lastPos + 1);
                 }
 
-                std::string interfaceChassisName =
-                    chassis.substr(lastPos + 1, len);
+                std::string interfaceChassisName = chassis.substr(lastPos + 1,
+                                                                  len);
                 if (interfaceChassisName == sensorAsyncResp->chassisId)
                 {
                     found = true;
diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index 4566e4b..205578c 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -1058,7 +1058,6 @@
 
 inline void requestRoutesOperatingConfigCollection(App& app)
 {
-
     BMCWEB_ROUTE(
         app, "/redfish/v1/Systems/system/Processors/<str>/OperatingConfigs/")
         .privileges(redfish::privileges::getOperatingConfigCollection)
diff --git a/redfish-core/lib/redfish_sessions.hpp b/redfish-core/lib/redfish_sessions.hpp
index 35d5d5c..e55314a 100644
--- a/redfish-core/lib/redfish_sessions.hpp
+++ b/redfish-core/lib/redfish_sessions.hpp
@@ -48,7 +48,6 @@
                       const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                       const std::string& /*sessionId*/)
 {
-
     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
     {
         return;
@@ -138,7 +137,6 @@
     crow::App& app, const crow::Request& req,
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-
     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
     {
         return;
@@ -246,7 +244,6 @@
     crow::App& app, const crow::Request& req,
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-
     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
     {
         return;
diff --git a/redfish-core/lib/redfish_util.hpp b/redfish-core/lib/redfish_util.hpp
index a742ca6..2e4c6e5 100644
--- a/redfish-core/lib/redfish_util.hpp
+++ b/redfish-core/lib/redfish_util.hpp
@@ -160,8 +160,8 @@
                 const std::string& unitState =
                     std::get<NET_PROTO_UNIT_SUB_STATE>(unit);
 
-                bool isProtocolEnabled =
-                    ((unitState == "running") || (unitState == "listening"));
+                bool isProtocolEnabled = ((unitState == "running") ||
+                                          (unitState == "listening"));
 
                 socketData.emplace_back(socketPath, std::string(kv.first),
                                         isProtocolEnabled);
diff --git a/redfish-core/lib/redfish_v1.hpp b/redfish-core/lib/redfish_v1.hpp
index 8ea46d8..a9b81e4 100644
--- a/redfish-core/lib/redfish_v1.hpp
+++ b/redfish-core/lib/redfish_v1.hpp
@@ -110,8 +110,8 @@
     }
 
     nlohmann::json& json = asyncResp->res.jsonValue;
-    json["@odata.id"] =
-        crow::utility::urlFromPieces("redfish", "v1", "JsonSchemas", schema);
+    json["@odata.id"] = crow::utility::urlFromPieces("redfish", "v1",
+                                                     "JsonSchemas", schema);
     json["@odata.type"] = "#JsonSchemaFile.v1_0_2.JsonSchemaFile";
     json["Name"] = schema + " Schema File";
     json["Description"] = schema + " Schema File Location";
@@ -128,8 +128,8 @@
     nlohmann::json::array_t locationArray;
     nlohmann::json::object_t locationEntry;
     locationEntry["Language"] = "en";
-    locationEntry["PublicationUri"] =
-        "http://redfish.dmtf.org/schemas/v1/" + schema + ".json";
+    locationEntry["PublicationUri"] = "http://redfish.dmtf.org/schemas/v1/" +
+                                      schema + ".json";
     locationEntry["Uri"] = crow::utility::urlFromPieces(
         "redfish", "v1", "JsonSchemas", schema, std::string(schema) + ".json");
 
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 0772da5..e04eac6 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -756,8 +756,8 @@
     }
 
     sensorJson["Status"]["State"] = getState(inventoryItem);
-    sensorJson["Status"]["Health"] =
-        getHealth(sensorJson, propertiesDict, inventoryItem);
+    sensorJson["Status"]["Health"] = getHealth(sensorJson, propertiesDict,
+                                               inventoryItem);
 
     // Parameter to set to override the type we get from dbus, and force it to
     // int, regardless of what is available.  This is used for schemas like fan,
@@ -959,7 +959,6 @@
     const dbus::utility::DBusInteracesMap& interfacesDict,
     nlohmann::json& sensorJson, InventoryItem* inventoryItem)
 {
-
     for (const auto& [interface, valuesDict] : interfacesDict)
     {
         objectPropertiesToJson(sensorName, sensorType, chassisSubNode,
@@ -1113,10 +1112,10 @@
                         }
                     }
 
-                    size_t minNumNeeded =
-                        collection->empty()
-                            ? 0
-                            : collection->size() - *allowedFailures;
+                    size_t minNumNeeded = collection->empty()
+                                              ? 0
+                                              : collection->size() -
+                                                    *allowedFailures;
                     nlohmann::json& jResp = sensorsAsyncResp->asyncResp->res
                                                 .jsonValue["Redundancy"];
 
@@ -1262,8 +1261,8 @@
     const std::string& invItemObjPath, const std::string& sensorObjPath)
 {
     // Look for inventory item in vector
-    InventoryItem* inventoryItem =
-        findInventoryItem(inventoryItems, invItemObjPath);
+    InventoryItem* inventoryItem = findInventoryItem(inventoryItems,
+                                                     invItemObjPath);
 
     // If inventory item doesn't exist in vector, add it
     if (inventoryItem == nullptr)
@@ -1456,8 +1455,8 @@
                     static_cast<const std::string&>(objDictEntry.first);
 
                 // If this object path is one of the specified inventory items
-                InventoryItem* inventoryItem =
-                    findInventoryItem(inventoryItems, objPath);
+                InventoryItem* inventoryItem = findInventoryItem(inventoryItems,
+                                                                 objPath);
                 if (inventoryItem != nullptr)
                 {
                     // Store inventory data in InventoryItem
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index 0388ccd..7182317 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -737,7 +737,7 @@
                 asyncResp->res.jsonValue["Members@odata.count"] = resp.size();
                 }); // end association lambda
 
-        } // end Iterate over all retrieved ObjectPaths
+        }           // end Iterate over all retrieved ObjectPaths
         });
 }
 
@@ -755,7 +755,6 @@
                        const boost::system::error_code& ec,
                        const dbus::utility::MapperGetSubTreeResponse& subtree)
 {
-
     if (ec)
     {
         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -803,7 +802,6 @@
                       const std::string& driveName,
                       const std::vector<std::string>& resp)
 {
-
     for (const std::string& drivePath : resp)
     {
         sdbusplus::message::object_path path(drivePath);
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index c9d31d1..19e5e64 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -139,7 +139,6 @@
     const std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>&
         properties)
 {
-
     BMCWEB_LOG_DEBUG << "Got " << properties.size() << " Cpu properties.";
 
     // TODO: Get Model
@@ -185,7 +184,6 @@
                                 const std::string& service,
                                 const std::string& path)
 {
-
     auto getCpuPresenceState = [aResp](const boost::system::error_code& ec3,
                                        const bool cpuPresenceCheck) {
         if (ec3)
@@ -2792,11 +2790,11 @@
  */
 inline void doNMI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
-    constexpr char const* serviceName = "xyz.openbmc_project.Control.Host.NMI";
-    constexpr char const* objectPath = "/xyz/openbmc_project/control/host0/nmi";
-    constexpr char const* interfaceName =
+    constexpr const char* serviceName = "xyz.openbmc_project.Control.Host.NMI";
+    constexpr const char* objectPath = "/xyz/openbmc_project/control/host0/nmi";
+    constexpr const char* interfaceName =
         "xyz.openbmc_project.Control.Host.NMI";
-    constexpr char const* method = "NMI";
+    constexpr const char* method = "NMI";
 
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code& ec) {
@@ -2995,7 +2993,6 @@
  */
 inline void requestRoutesSystems(App& app)
 {
-
     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/")
         .privileges(redfish::privileges::headComputerSystem)
         .methods(boost::beast::http::verb::head)(
diff --git a/redfish-core/lib/task.hpp b/redfish-core/lib/task.hpp
index 4edfe18..167a0c7 100644
--- a/redfish-core/lib/task.hpp
+++ b/redfish-core/lib/task.hpp
@@ -198,8 +198,8 @@
 
     static void sendTaskEvent(std::string_view state, size_t index)
     {
-        std::string origin =
-            "/redfish/v1/TaskService/Tasks/" + std::to_string(index);
+        std::string origin = "/redfish/v1/TaskService/Tasks/" +
+                             std::to_string(index);
         std::string resType = "Task";
         // TaskState enums which should send out an event are:
         // "Starting" = taskResumed
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index 650ba95..59b2b3b 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -212,7 +212,6 @@
                             iface ==
                             "xyz.openbmc_project.Software.ActivationProgress")
                         {
-
                             const uint8_t* progress = nullptr;
                             for (const auto& property : values)
                             {
@@ -538,8 +537,8 @@
     std::ofstream out(filepath, std::ofstream::out | std::ofstream::binary |
                                     std::ofstream::trunc);
     // set the permission of the file to 640
-    std::filesystem::perms permission =
-        std::filesystem::perms::owner_read | std::filesystem::perms::group_read;
+    std::filesystem::perms permission = std::filesystem::perms::owner_read |
+                                        std::filesystem::perms::group_read;
     std::filesystem::permissions(filepath, permission);
     out << body;
 
@@ -616,7 +615,7 @@
             continue;
         }
 
-        for (auto const& param :
+        for (const auto& param :
              boost::beast::http::param_list{it->value().substr(index)})
         {
             if (param.first != "name" || param.second.empty())
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index 96fd037..373881e 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -794,7 +794,6 @@
                           const std::string& service, const std::string& name,
                           bool legacy)
 {
-
     // Legacy mount requires parameter with image
     if (legacy)
     {
@@ -952,7 +951,6 @@
 
             for (const auto& object : subtree)
             {
-
                 VmMode mode = parseObjectPathAndGetMode(object.first, resName);
                 if (mode != VmMode::Invalid)
                 {
