diff --git a/.clang-format b/.clang-format
index 52ac0a1..cab3139 100644
--- a/.clang-format
+++ b/.clang-format
@@ -41,7 +41,7 @@
 BreakBeforeTernaryOperators: true
 BreakConstructorInitializers: AfterColon
 BreakInheritanceList: AfterColon
-BreakStringLiterals: true
+BreakStringLiterals: false
 ColumnLimit:     80
 CommentPragmas:  '^ IWYU pragma:'
 CompactNamespaces: false
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 2ab0a1e..8890ae1 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -146,8 +146,10 @@
     else if ((strcmp(errorMessage,
                      "xyz.openbmc_project.Common.Error.InvalidArgument") ==
               0) ||
-             (strcmp(errorMessage, "xyz.openbmc_project.User.Common.Error."
-                                   "UserNameGroupFail") == 0))
+             (strcmp(
+                  errorMessage,
+                  "xyz.openbmc_project.User.Common.Error.UserNameGroupFail") ==
+              0))
     {
         messages::propertyValueFormatError(asyncResp->res, newUser, "UserName");
     }
@@ -395,9 +397,9 @@
                              const GetObjectType& resp) {
             if (ec || resp.empty())
             {
-                BMCWEB_LOG_ERROR << "DBUS response error during getting of "
-                                    "service name: "
-                                 << ec;
+                BMCWEB_LOG_ERROR
+                    << "DBUS response error during getting of service name: "
+                    << ec;
                 LDAPConfigData empty{};
                 callback(false, empty, ldapType);
                 return;
@@ -420,15 +422,14 @@
 
                     if (ldapType == "LDAP")
                     {
-                        ldapDbusType = "xyz.openbmc_project.User.Ldap.Config."
-                                       "Type.OpenLdap";
+                        ldapDbusType =
+                            "xyz.openbmc_project.User.Ldap.Config.Type.OpenLdap";
                         searchString = "openldap";
                     }
                     else if (ldapType == "ActiveDirectory")
                     {
                         ldapDbusType =
-                            "xyz.openbmc_project.User.Ldap.Config.Type."
-                            "ActiveDirectory";
+                            "xyz.openbmc_project.User.Ldap.Config.Type.ActiveDirectory";
                         searchString = "active_directory";
                     }
                     else
@@ -518,9 +519,9 @@
                                     }
                                 }
                             }
-                            else if (interface.first ==
-                                     "xyz.openbmc_project.User."
-                                     "PrivilegeMapperEntry")
+                            else if (
+                                interface.first ==
+                                "xyz.openbmc_project.User.PrivilegeMapperEntry")
                             {
                                 LDAPRoleMapData roleMapData{};
                                 for (const auto& property : interface.second)
@@ -901,8 +902,8 @@
     {
 #ifndef BMCWEB_ENABLE_BASIC_AUTHENTICATION
         messages::actionNotSupported(
-            asyncResp->res, "Setting BasicAuth when basic-auth feature "
-                            "is disabled");
+            asyncResp->res,
+            "Setting BasicAuth when basic-auth feature is disabled");
         return;
 #endif
         authMethodsConfig.basic = *basicAuth;
@@ -911,9 +912,9 @@
     if (cookie)
     {
 #ifndef BMCWEB_ENABLE_COOKIE_AUTHENTICATION
-        messages::actionNotSupported(asyncResp->res,
-                                     "Setting Cookie when cookie-auth feature "
-                                     "is disabled");
+        messages::actionNotSupported(
+            asyncResp->res,
+            "Setting Cookie when cookie-auth feature is disabled");
         return;
 #endif
         authMethodsConfig.cookie = *cookie;
@@ -923,8 +924,8 @@
     {
 #ifndef BMCWEB_ENABLE_SESSION_AUTHENTICATION
         messages::actionNotSupported(
-            asyncResp->res, "Setting SessionToken when session-auth feature "
-                            "is disabled");
+            asyncResp->res,
+            "Setting SessionToken when session-auth feature is disabled");
         return;
 #endif
         authMethodsConfig.sessionToken = *sessionToken;
@@ -933,9 +934,9 @@
     if (xToken)
     {
 #ifndef BMCWEB_ENABLE_XTOKEN_AUTHENTICATION
-        messages::actionNotSupported(asyncResp->res,
-                                     "Setting XToken when xtoken-auth feature "
-                                     "is disabled");
+        messages::actionNotSupported(
+            asyncResp->res,
+            "Setting XToken when xtoken-auth feature is disabled");
         return;
 #endif
         authMethodsConfig.xtoken = *xToken;
@@ -944,9 +945,9 @@
     if (tls)
     {
 #ifndef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
-        messages::actionNotSupported(asyncResp->res,
-                                     "Setting TLS when mutual-tls-auth feature "
-                                     "is disabled");
+        messages::actionNotSupported(
+            asyncResp->res,
+            "Setting TLS when mutual-tls-auth feature is disabled");
         return;
 #endif
         authMethodsConfig.tls = *tls;
@@ -1798,8 +1799,7 @@
 
                                     asyncResp->res.jsonValue["Links"]["Role"] =
                                         {{"@odata.id",
-                                          "/redfish/v1/AccountService/"
-                                          "Roles/" +
+                                          "/redfish/v1/AccountService/Roles/" +
                                               role}};
                                 }
                                 else if (property.first ==
@@ -1809,9 +1809,8 @@
                                         std::get_if<bool>(&property.second);
                                     if (userPasswordExpired == nullptr)
                                     {
-                                        BMCWEB_LOG_ERROR << "UserPassword"
-                                                            "Expired "
-                                                            "wasn't a bool";
+                                        BMCWEB_LOG_ERROR
+                                            << "UserPasswordExpired wasn't a bool";
                                         messages::internalError(asyncResp->res);
                                         return;
                                     }
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index a316cc5..045426e 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -67,15 +67,16 @@
                     {"@odata.id",
                      "/redfish/v1/CertificateService/CertificateLocations"}};
             }
-            asyncResp->res.jsonValue["Actions"]
-                                    ["#CertificateService.ReplaceCertificate"] =
-                {{"target", "/redfish/v1/CertificateService/Actions/"
-                            "CertificateService.ReplaceCertificate"},
-                 {"CertificateType@Redfish.AllowableValues", {"PEM"}}};
+            asyncResp->res
+                .jsonValue["Actions"]
+                          ["#CertificateService.ReplaceCertificate"] = {
+                {"target",
+                 "/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate"},
+                {"CertificateType@Redfish.AllowableValues", {"PEM"}}};
             asyncResp->res
                 .jsonValue["Actions"]["#CertificateService.GenerateCSR"] = {
-                {"target", "/redfish/v1/CertificateService/Actions/"
-                           "CertificateService.GenerateCSR"}};
+                {"target",
+                 "/redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR"}};
         });
 } // requestRoutesCertificateService
 
@@ -235,184 +236,185 @@
  */
 inline void requestRoutesCertificateActionGenerateCSR(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/CertificateService/Actions/"
-                      "CertificateService.GenerateCSR/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR/")
         // Incorrect Privilege;  Should be ConfigureManager
         //.privileges(redfish::privileges::postCertificateService)
         .privileges({{"ConfigureComponents"}})
-        .methods(boost::beast::http::verb::post)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                static const int rsaKeyBitLength = 2048;
+        .methods(
+            boost::beast::http::verb::
+                post)([](const crow::Request& req,
+                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            static const int rsaKeyBitLength = 2048;
 
-                // Required parameters
-                std::string city;
-                std::string commonName;
-                std::string country;
-                std::string organization;
-                std::string organizationalUnit;
-                std::string state;
-                nlohmann::json certificateCollection;
+            // Required parameters
+            std::string city;
+            std::string commonName;
+            std::string country;
+            std::string organization;
+            std::string organizationalUnit;
+            std::string state;
+            nlohmann::json certificateCollection;
 
-                // Optional parameters
-                std::optional<std::vector<std::string>> optAlternativeNames =
-                    std::vector<std::string>();
-                std::optional<std::string> optContactPerson = "";
-                std::optional<std::string> optChallengePassword = "";
-                std::optional<std::string> optEmail = "";
-                std::optional<std::string> optGivenName = "";
-                std::optional<std::string> optInitials = "";
-                std::optional<int64_t> optKeyBitLength = rsaKeyBitLength;
-                std::optional<std::string> optKeyCurveId = "secp384r1";
-                std::optional<std::string> optKeyPairAlgorithm = "EC";
-                std::optional<std::vector<std::string>> optKeyUsage =
-                    std::vector<std::string>();
-                std::optional<std::string> optSurname = "";
-                std::optional<std::string> optUnstructuredName = "";
-                if (!json_util::readJson(
-                        req, asyncResp->res, "City", city, "CommonName",
-                        commonName, "ContactPerson", optContactPerson,
-                        "Country", country, "Organization", organization,
-                        "OrganizationalUnit", organizationalUnit, "State",
-                        state, "CertificateCollection", certificateCollection,
-                        "AlternativeNames", optAlternativeNames,
-                        "ChallengePassword", optChallengePassword, "Email",
-                        optEmail, "GivenName", optGivenName, "Initials",
-                        optInitials, "KeyBitLength", optKeyBitLength,
-                        "KeyCurveId", optKeyCurveId, "KeyPairAlgorithm",
-                        optKeyPairAlgorithm, "KeyUsage", optKeyUsage, "Surname",
-                        optSurname, "UnstructuredName", optUnstructuredName))
+            // Optional parameters
+            std::optional<std::vector<std::string>> optAlternativeNames =
+                std::vector<std::string>();
+            std::optional<std::string> optContactPerson = "";
+            std::optional<std::string> optChallengePassword = "";
+            std::optional<std::string> optEmail = "";
+            std::optional<std::string> optGivenName = "";
+            std::optional<std::string> optInitials = "";
+            std::optional<int64_t> optKeyBitLength = rsaKeyBitLength;
+            std::optional<std::string> optKeyCurveId = "secp384r1";
+            std::optional<std::string> optKeyPairAlgorithm = "EC";
+            std::optional<std::vector<std::string>> optKeyUsage =
+                std::vector<std::string>();
+            std::optional<std::string> optSurname = "";
+            std::optional<std::string> optUnstructuredName = "";
+            if (!json_util::readJson(
+                    req, asyncResp->res, "City", city, "CommonName", commonName,
+                    "ContactPerson", optContactPerson, "Country", country,
+                    "Organization", organization, "OrganizationalUnit",
+                    organizationalUnit, "State", state, "CertificateCollection",
+                    certificateCollection, "AlternativeNames",
+                    optAlternativeNames, "ChallengePassword",
+                    optChallengePassword, "Email", optEmail, "GivenName",
+                    optGivenName, "Initials", optInitials, "KeyBitLength",
+                    optKeyBitLength, "KeyCurveId", optKeyCurveId,
+                    "KeyPairAlgorithm", optKeyPairAlgorithm, "KeyUsage",
+                    optKeyUsage, "Surname", optSurname, "UnstructuredName",
+                    optUnstructuredName))
+            {
+                return;
+            }
+
+            // bmcweb has no way to store or decode a private key challenge
+            // password, which will likely cause bmcweb to crash on startup
+            // if this is not set on a post so not allowing the user to set
+            // value
+            if (*optChallengePassword != "")
+            {
+                messages::actionParameterNotSupported(
+                    asyncResp->res, "GenerateCSR", "ChallengePassword");
+                return;
+            }
+
+            std::string certURI;
+            if (!redfish::json_util::readJson(certificateCollection,
+                                              asyncResp->res, "@odata.id",
+                                              certURI))
+            {
+                return;
+            }
+
+            std::string objectPath;
+            std::string service;
+            if (boost::starts_with(
+                    certURI,
+                    "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates"))
+            {
+                objectPath = certs::httpsObjectPath;
+                service = certs::httpsServiceName;
+            }
+            else if (boost::starts_with(
+                         certURI,
+                         "/redfish/v1/AccountService/LDAP/Certificates"))
+            {
+                objectPath = certs::ldapObjectPath;
+                service = certs::ldapServiceName;
+            }
+            else
+            {
+                messages::actionParameterNotSupported(
+                    asyncResp->res, "CertificateCollection", "GenerateCSR");
+                return;
+            }
+
+            // supporting only EC and RSA algorithm
+            if (*optKeyPairAlgorithm != "EC" && *optKeyPairAlgorithm != "RSA")
+            {
+                messages::actionParameterNotSupported(
+                    asyncResp->res, "KeyPairAlgorithm", "GenerateCSR");
+                return;
+            }
+
+            // supporting only 2048 key bit length for RSA algorithm due to
+            // time consumed in generating private key
+            if (*optKeyPairAlgorithm == "RSA" &&
+                *optKeyBitLength != rsaKeyBitLength)
+            {
+                messages::propertyValueNotInList(
+                    asyncResp->res, std::to_string(*optKeyBitLength),
+                    "KeyBitLength");
+                return;
+            }
+
+            // validate KeyUsage supporting only 1 type based on URL
+            if (boost::starts_with(
+                    certURI,
+                    "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates"))
+            {
+                if (optKeyUsage->size() == 0)
                 {
-                    return;
+                    optKeyUsage->push_back("ServerAuthentication");
                 }
-
-                // bmcweb has no way to store or decode a private key challenge
-                // password, which will likely cause bmcweb to crash on startup
-                // if this is not set on a post so not allowing the user to set
-                // value
-                if (*optChallengePassword != "")
+                else if (optKeyUsage->size() == 1)
                 {
-                    messages::actionParameterNotSupported(
-                        asyncResp->res, "GenerateCSR", "ChallengePassword");
-                    return;
-                }
-
-                std::string certURI;
-                if (!redfish::json_util::readJson(certificateCollection,
-                                                  asyncResp->res, "@odata.id",
-                                                  certURI))
-                {
-                    return;
-                }
-
-                std::string objectPath;
-                std::string service;
-                if (boost::starts_with(certURI,
-                                       "/redfish/v1/Managers/bmc/"
-                                       "NetworkProtocol/HTTPS/Certificates"))
-                {
-                    objectPath = certs::httpsObjectPath;
-                    service = certs::httpsServiceName;
-                }
-                else if (boost::starts_with(
-                             certURI,
-                             "/redfish/v1/AccountService/LDAP/Certificates"))
-                {
-                    objectPath = certs::ldapObjectPath;
-                    service = certs::ldapServiceName;
+                    if ((*optKeyUsage)[0] != "ServerAuthentication")
+                    {
+                        messages::propertyValueNotInList(
+                            asyncResp->res, (*optKeyUsage)[0], "KeyUsage");
+                        return;
+                    }
                 }
                 else
                 {
                     messages::actionParameterNotSupported(
-                        asyncResp->res, "CertificateCollection", "GenerateCSR");
+                        asyncResp->res, "KeyUsage", "GenerateCSR");
                     return;
                 }
-
-                // supporting only EC and RSA algorithm
-                if (*optKeyPairAlgorithm != "EC" &&
-                    *optKeyPairAlgorithm != "RSA")
+            }
+            else if (boost::starts_with(
+                         certURI,
+                         "/redfish/v1/AccountService/LDAP/Certificates"))
+            {
+                if (optKeyUsage->size() == 0)
+                {
+                    optKeyUsage->push_back("ClientAuthentication");
+                }
+                else if (optKeyUsage->size() == 1)
+                {
+                    if ((*optKeyUsage)[0] != "ClientAuthentication")
+                    {
+                        messages::propertyValueNotInList(
+                            asyncResp->res, (*optKeyUsage)[0], "KeyUsage");
+                        return;
+                    }
+                }
+                else
                 {
                     messages::actionParameterNotSupported(
-                        asyncResp->res, "KeyPairAlgorithm", "GenerateCSR");
+                        asyncResp->res, "KeyUsage", "GenerateCSR");
                     return;
                 }
+            }
 
-                // supporting only 2048 key bit length for RSA algorithm due to
-                // time consumed in generating private key
-                if (*optKeyPairAlgorithm == "RSA" &&
-                    *optKeyBitLength != rsaKeyBitLength)
-                {
-                    messages::propertyValueNotInList(
-                        asyncResp->res, std::to_string(*optKeyBitLength),
-                        "KeyBitLength");
-                    return;
-                }
+            // Only allow one CSR matcher at a time so setting retry
+            // time-out and timer expiry to 10 seconds for now.
+            static const int timeOut = 10;
+            if (csrMatcher)
+            {
+                messages::serviceTemporarilyUnavailable(
+                    asyncResp->res, std::to_string(timeOut));
+                return;
+            }
 
-                // validate KeyUsage supporting only 1 type based on URL
-                if (boost::starts_with(certURI,
-                                       "/redfish/v1/Managers/bmc/"
-                                       "NetworkProtocol/HTTPS/Certificates"))
-                {
-                    if (optKeyUsage->size() == 0)
-                    {
-                        optKeyUsage->push_back("ServerAuthentication");
-                    }
-                    else if (optKeyUsage->size() == 1)
-                    {
-                        if ((*optKeyUsage)[0] != "ServerAuthentication")
-                        {
-                            messages::propertyValueNotInList(
-                                asyncResp->res, (*optKeyUsage)[0], "KeyUsage");
-                            return;
-                        }
-                    }
-                    else
-                    {
-                        messages::actionParameterNotSupported(
-                            asyncResp->res, "KeyUsage", "GenerateCSR");
-                        return;
-                    }
-                }
-                else if (boost::starts_with(
-                             certURI,
-                             "/redfish/v1/AccountService/LDAP/Certificates"))
-                {
-                    if (optKeyUsage->size() == 0)
-                    {
-                        optKeyUsage->push_back("ClientAuthentication");
-                    }
-                    else if (optKeyUsage->size() == 1)
-                    {
-                        if ((*optKeyUsage)[0] != "ClientAuthentication")
-                        {
-                            messages::propertyValueNotInList(
-                                asyncResp->res, (*optKeyUsage)[0], "KeyUsage");
-                            return;
-                        }
-                    }
-                    else
-                    {
-                        messages::actionParameterNotSupported(
-                            asyncResp->res, "KeyUsage", "GenerateCSR");
-                        return;
-                    }
-                }
-
-                // Only allow one CSR matcher at a time so setting retry
-                // time-out and timer expiry to 10 seconds for now.
-                static const int timeOut = 10;
-                if (csrMatcher)
-                {
-                    messages::serviceTemporarilyUnavailable(
-                        asyncResp->res, std::to_string(timeOut));
-                    return;
-                }
-
-                // Make this static so it survives outside this method
-                static boost::asio::steady_timer timeout(*req.ioService);
-                timeout.expires_after(std::chrono::seconds(timeOut));
-                timeout.async_wait([asyncResp](
-                                       const boost::system::error_code& ec) {
+            // Make this static so it survives outside this method
+            static boost::asio::steady_timer timeout(*req.ioService);
+            timeout.expires_after(std::chrono::seconds(timeOut));
+            timeout.async_wait(
+                [asyncResp](const boost::system::error_code& ec) {
                     csrMatcher = nullptr;
                     if (ec)
                     {
@@ -428,65 +430,61 @@
                     messages::internalError(asyncResp->res);
                 });
 
-                // create a matcher to wait on CSR object
-                BMCWEB_LOG_DEBUG << "create matcher with path " << objectPath;
-                std::string match(
-                    "type='signal',"
-                    "interface='org.freedesktop.DBus.ObjectManager',"
-                    "path='" +
-                    objectPath +
-                    "',"
-                    "member='InterfacesAdded'");
-                csrMatcher = std::make_unique<sdbusplus::bus::match::match>(
-                    *crow::connections::systemBus, match,
-                    [asyncResp, service, objectPath,
-                     certURI](sdbusplus::message::message& m) {
-                        timeout.cancel();
-                        if (m.is_method_error())
+            // create a matcher to wait on CSR object
+            BMCWEB_LOG_DEBUG << "create matcher with path " << objectPath;
+            std::string match("type='signal',"
+                              "interface='org.freedesktop.DBus.ObjectManager',"
+                              "path='" +
+                              objectPath +
+                              "',"
+                              "member='InterfacesAdded'");
+            csrMatcher = std::make_unique<sdbusplus::bus::match::match>(
+                *crow::connections::systemBus, match,
+                [asyncResp, service, objectPath,
+                 certURI](sdbusplus::message::message& m) {
+                    timeout.cancel();
+                    if (m.is_method_error())
+                    {
+                        BMCWEB_LOG_ERROR << "Dbus method error!!!";
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    std::vector<
+                        std::pair<std::string,
+                                  std::vector<std::pair<
+                                      std::string, std::variant<std::string>>>>>
+                        interfacesProperties;
+                    sdbusplus::message::object_path csrObjectPath;
+                    m.read(csrObjectPath, interfacesProperties);
+                    BMCWEB_LOG_DEBUG << "CSR object added" << csrObjectPath.str;
+                    for (auto& interface : interfacesProperties)
+                    {
+                        if (interface.first == "xyz.openbmc_project.Certs.CSR")
                         {
-                            BMCWEB_LOG_ERROR << "Dbus method error!!!";
-                            messages::internalError(asyncResp->res);
-                            return;
+                            getCSR(asyncResp, certURI, service, objectPath,
+                                   csrObjectPath.str);
+                            break;
                         }
-                        std::vector<std::pair<
-                            std::string,
-                            std::vector<std::pair<std::string,
-                                                  std::variant<std::string>>>>>
-                            interfacesProperties;
-                        sdbusplus::message::object_path csrObjectPath;
-                        m.read(csrObjectPath, interfacesProperties);
-                        BMCWEB_LOG_DEBUG << "CSR object added"
-                                         << csrObjectPath.str;
-                        for (auto& interface : interfacesProperties)
-                        {
-                            if (interface.first ==
-                                "xyz.openbmc_project.Certs.CSR")
-                            {
-                                getCSR(asyncResp, certURI, service, objectPath,
-                                       csrObjectPath.str);
-                                break;
-                            }
-                        }
-                    });
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code& ec,
-                                const std::string&) {
-                        if (ec)
-                        {
-                            BMCWEB_LOG_ERROR << "DBUS response error: "
-                                             << ec.message();
-                            messages::internalError(asyncResp->res);
-                            return;
-                        }
-                    },
-                    service, objectPath, "xyz.openbmc_project.Certs.CSR.Create",
-                    "GenerateCSR", *optAlternativeNames, *optChallengePassword,
-                    city, commonName, *optContactPerson, country, *optEmail,
-                    *optGivenName, *optInitials, *optKeyBitLength,
-                    *optKeyCurveId, *optKeyPairAlgorithm, *optKeyUsage,
-                    organization, organizationalUnit, state, *optSurname,
-                    *optUnstructuredName);
-            });
+                    }
+                });
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](const boost::system::error_code& ec,
+                            const std::string&) {
+                    if (ec)
+                    {
+                        BMCWEB_LOG_ERROR << "DBUS response error: "
+                                         << ec.message();
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                },
+                service, objectPath, "xyz.openbmc_project.Certs.CSR.Create",
+                "GenerateCSR", *optAlternativeNames, *optChallengePassword,
+                city, commonName, *optContactPerson, country, *optEmail,
+                *optGivenName, *optInitials, *optKeyBitLength, *optKeyCurveId,
+                *optKeyPairAlgorithm, *optKeyUsage, organization,
+                organizationalUnit, state, *optSurname, *optUnstructuredName);
+        });
 } // requestRoutesCertificateActionGenerateCSR
 
 /**
@@ -676,8 +674,9 @@
  */
 inline void requestRoutesCertificateActionsReplaceCertificate(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/CertificateService/Actions/"
-                      "CertificateService.ReplaceCertificate/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate/")
         .privileges(redfish::privileges::postCertificateService)
         .methods(
             boost::beast::http::verb::
@@ -730,9 +729,9 @@
             std::string objectPath;
             std::string name;
             std::string service;
-            if (boost::starts_with(certURI,
-                                   "/redfish/v1/Managers/bmc/NetworkProtocol/"
-                                   "HTTPS/Certificates/"))
+            if (boost::starts_with(
+                    certURI,
+                    "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/"))
             {
                 objectPath = std::string(certs::httpsObjectPath) + "/" +
                              std::to_string(id);
@@ -861,8 +860,7 @@
                         {
                             members.push_back(
                                 {{"@odata.id",
-                                  "/redfish/v1/Managers/bmc/"
-                                  "NetworkProtocol/HTTPS/Certificates/" +
+                                  "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/" +
                                       std::to_string(id)}});
                         }
                     }
@@ -876,60 +874,57 @@
     BMCWEB_ROUTE(app,
                  "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/")
         .privileges(redfish::privileges::postCertificateCollection)
-        .methods(boost::beast::http::verb::post)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                BMCWEB_LOG_DEBUG << "HTTPSCertificateCollection::doPost";
+        .methods(
+            boost::beast::http::verb::
+                post)([](const crow::Request& req,
+                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            BMCWEB_LOG_DEBUG << "HTTPSCertificateCollection::doPost";
 
-                asyncResp->res.jsonValue = {
-                    {"Name", "HTTPS Certificate"},
-                    {"Description", "HTTPS Certificate"}};
+            asyncResp->res.jsonValue = {{"Name", "HTTPS Certificate"},
+                                        {"Description", "HTTPS Certificate"}};
 
-                std::string certFileBody =
-                    getCertificateFromReqBody(asyncResp, req);
+            std::string certFileBody =
+                getCertificateFromReqBody(asyncResp, req);
 
-                if (certFileBody.empty())
-                {
-                    BMCWEB_LOG_ERROR
-                        << "Cannot get certificate from request body.";
-                    messages::unrecognizedRequestBody(asyncResp->res);
-                    return;
-                }
+            if (certFileBody.empty())
+            {
+                BMCWEB_LOG_ERROR << "Cannot get certificate from request body.";
+                messages::unrecognizedRequestBody(asyncResp->res);
+                return;
+            }
 
-                std::shared_ptr<CertificateFile> certFile =
-                    std::make_shared<CertificateFile>(certFileBody);
+            std::shared_ptr<CertificateFile> certFile =
+                std::make_shared<CertificateFile>(certFileBody);
 
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp, certFile](const boost::system::error_code ec,
-                                          const std::string& objectPath) {
-                        if (ec)
-                        {
-                            BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
-                            messages::internalError(asyncResp->res);
-                            return;
-                        }
-                        long certId = getIDFromURL(objectPath);
-                        if (certId < 0)
-                        {
-                            BMCWEB_LOG_ERROR << "Invalid objectPath value"
-                                             << objectPath;
-                            messages::internalError(asyncResp->res);
-                            return;
-                        }
-                        std::string certURL =
-                            "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/"
-                            "Certificates/" +
-                            std::to_string(certId);
-                        getCertificateProperties(
-                            asyncResp, objectPath, certs::httpsServiceName,
-                            certId, certURL, "HTTPS Certificate");
-                        BMCWEB_LOG_DEBUG << "HTTPS certificate install file="
-                                         << certFile->getCertFilePath();
-                    },
-                    certs::httpsServiceName, certs::httpsObjectPath,
-                    certs::certInstallIntf, "Install",
-                    certFile->getCertFilePath());
-            });
+            crow::connections::systemBus->async_method_call(
+                [asyncResp, certFile](const boost::system::error_code ec,
+                                      const std::string& objectPath) {
+                    if (ec)
+                    {
+                        BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    long certId = getIDFromURL(objectPath);
+                    if (certId < 0)
+                    {
+                        BMCWEB_LOG_ERROR << "Invalid objectPath value"
+                                         << objectPath;
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    std::string certURL =
+                        "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/" +
+                        std::to_string(certId);
+                    getCertificateProperties(asyncResp, objectPath,
+                                             certs::httpsServiceName, certId,
+                                             certURL, "HTTPS Certificate");
+                    BMCWEB_LOG_DEBUG << "HTTPS certificate install file="
+                                     << certFile->getCertFilePath();
+                },
+                certs::httpsServiceName, certs::httpsObjectPath,
+                certs::certInstallIntf, "Install", certFile->getCertFilePath());
+        });
 } // requestRoutesHTTPSCertificateCollection
 
 /**
@@ -1022,49 +1017,47 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/AccountService/LDAP/Certificates/")
         .privileges(redfish::privileges::getCertificateCollection)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue = {
-                    {"@odata.id",
-                     "/redfish/v1/AccountService/LDAP/Certificates"},
-                    {"@odata.type",
-                     "#CertificateCollection.CertificateCollection"},
-                    {"Name", "LDAP Certificates Collection"},
-                    {"Description",
-                     "A Collection of LDAP certificate instances"}};
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue = {
+                {"@odata.id", "/redfish/v1/AccountService/LDAP/Certificates"},
+                {"@odata.type", "#CertificateCollection.CertificateCollection"},
+                {"Name", "LDAP Certificates Collection"},
+                {"Description", "A Collection of LDAP certificate instances"}};
 
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code ec,
-                                const ManagedObjectType& certs) {
-                        nlohmann::json& members =
-                            asyncResp->res.jsonValue["Members"];
-                        nlohmann::json& count =
-                            asyncResp->res.jsonValue["Members@odata.count"];
-                        members = nlohmann::json::array();
-                        count = 0;
-                        if (ec)
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](const boost::system::error_code ec,
+                            const ManagedObjectType& certs) {
+                    nlohmann::json& members =
+                        asyncResp->res.jsonValue["Members"];
+                    nlohmann::json& count =
+                        asyncResp->res.jsonValue["Members@odata.count"];
+                    members = nlohmann::json::array();
+                    count = 0;
+                    if (ec)
+                    {
+                        BMCWEB_LOG_WARNING << "LDAP certificate query failed: "
+                                           << ec;
+                        return;
+                    }
+                    for (const auto& cert : certs)
+                    {
+                        long id = getIDFromURL(cert.first.str);
+                        if (id >= 0)
                         {
-                            BMCWEB_LOG_WARNING
-                                << "LDAP certificate query failed: " << ec;
-                            return;
+                            members.push_back(
+                                {{"@odata.id",
+                                  "/redfish/v1/AccountService/LDAP/Certificates/" +
+                                      std::to_string(id)}});
                         }
-                        for (const auto& cert : certs)
-                        {
-                            long id = getIDFromURL(cert.first.str);
-                            if (id >= 0)
-                            {
-                                members.push_back(
-                                    {{"@odata.id", "/redfish/v1/AccountService/"
-                                                   "LDAP/Certificates/" +
-                                                       std::to_string(id)}});
-                            }
-                        }
-                        count = members.size();
-                    },
-                    certs::ldapServiceName, certs::ldapObjectPath,
-                    certs::dbusObjManagerIntf, "GetManagedObjects");
-            });
+                    }
+                    count = members.size();
+                },
+                certs::ldapServiceName, certs::ldapObjectPath,
+                certs::dbusObjManagerIntf, "GetManagedObjects");
+        });
 
     BMCWEB_ROUTE(app, "/redfish/v1/AccountService/LDAP/Certificates/")
         .privileges(redfish::privileges::postCertificateCollection)
@@ -1156,98 +1149,96 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/Truststore/Certificates/")
         .privileges(redfish::privileges::getCertificate)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue = {
-                    {"@odata.id",
-                     "/redfish/v1/Managers/bmc/Truststore/Certificates/"},
-                    {"@odata.type",
-                     "#CertificateCollection.CertificateCollection"},
-                    {"Name", "TrustStore Certificates Collection"},
-                    {"Description",
-                     "A Collection of TrustStore certificate instances"}};
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue = {
+                {"@odata.id",
+                 "/redfish/v1/Managers/bmc/Truststore/Certificates/"},
+                {"@odata.type", "#CertificateCollection.CertificateCollection"},
+                {"Name", "TrustStore Certificates Collection"},
+                {"Description",
+                 "A Collection of TrustStore certificate instances"}};
 
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code ec,
-                                const ManagedObjectType& certs) {
-                        if (ec)
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](const boost::system::error_code ec,
+                            const ManagedObjectType& certs) {
+                    if (ec)
+                    {
+                        BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    nlohmann::json& members =
+                        asyncResp->res.jsonValue["Members"];
+                    members = nlohmann::json::array();
+                    for (const auto& cert : certs)
+                    {
+                        long id = getIDFromURL(cert.first.str);
+                        if (id >= 0)
                         {
-                            BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
-                            messages::internalError(asyncResp->res);
-                            return;
+                            members.push_back(
+                                {{"@odata.id",
+                                  "/redfish/v1/Managers/bmc/Truststore/Certificates/" +
+                                      std::to_string(id)}});
                         }
-                        nlohmann::json& members =
-                            asyncResp->res.jsonValue["Members"];
-                        members = nlohmann::json::array();
-                        for (const auto& cert : certs)
-                        {
-                            long id = getIDFromURL(cert.first.str);
-                            if (id >= 0)
-                            {
-                                members.push_back(
-                                    {{"@odata.id", "/redfish/v1/Managers/bmc/"
-                                                   "Truststore/Certificates/" +
-                                                       std::to_string(id)}});
-                            }
-                        }
-                        asyncResp->res.jsonValue["Members@odata.count"] =
-                            members.size();
-                    },
-                    certs::authorityServiceName, certs::authorityObjectPath,
-                    certs::dbusObjManagerIntf, "GetManagedObjects");
-            });
+                    }
+                    asyncResp->res.jsonValue["Members@odata.count"] =
+                        members.size();
+                },
+                certs::authorityServiceName, certs::authorityObjectPath,
+                certs::dbusObjManagerIntf, "GetManagedObjects");
+        });
 
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/Truststore/Certificates/")
         .privileges(redfish::privileges::postCertificateCollection)
-        .methods(boost::beast::http::verb::post)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                std::string certFileBody =
-                    getCertificateFromReqBody(asyncResp, req);
+        .methods(
+            boost::beast::http::verb::
+                post)([](const crow::Request& req,
+                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            std::string certFileBody =
+                getCertificateFromReqBody(asyncResp, req);
 
-                if (certFileBody.empty())
-                {
-                    BMCWEB_LOG_ERROR
-                        << "Cannot get certificate from request body.";
-                    messages::unrecognizedRequestBody(asyncResp->res);
-                    return;
-                }
+            if (certFileBody.empty())
+            {
+                BMCWEB_LOG_ERROR << "Cannot get certificate from request body.";
+                messages::unrecognizedRequestBody(asyncResp->res);
+                return;
+            }
 
-                std::shared_ptr<CertificateFile> certFile =
-                    std::make_shared<CertificateFile>(certFileBody);
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp, certFile](const boost::system::error_code ec,
-                                          const std::string& objectPath) {
-                        if (ec)
-                        {
-                            BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
-                            messages::internalError(asyncResp->res);
-                            return;
-                        }
-                        long certId = getIDFromURL(objectPath);
-                        if (certId < 0)
-                        {
-                            BMCWEB_LOG_ERROR << "Invalid objectPath value"
-                                             << objectPath;
-                            messages::internalError(asyncResp->res);
-                            return;
-                        }
-                        std::string certURL = "/redfish/v1/Managers/bmc/"
-                                              "Truststore/Certificates/" +
-                                              std::to_string(certId);
+            std::shared_ptr<CertificateFile> certFile =
+                std::make_shared<CertificateFile>(certFileBody);
+            crow::connections::systemBus->async_method_call(
+                [asyncResp, certFile](const boost::system::error_code ec,
+                                      const std::string& objectPath) {
+                    if (ec)
+                    {
+                        BMCWEB_LOG_ERROR << "DBUS response error: " << ec;
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    long certId = getIDFromURL(objectPath);
+                    if (certId < 0)
+                    {
+                        BMCWEB_LOG_ERROR << "Invalid objectPath value"
+                                         << objectPath;
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    std::string certURL =
+                        "/redfish/v1/Managers/bmc/Truststore/Certificates/" +
+                        std::to_string(certId);
 
-                        getCertificateProperties(
-                            asyncResp, objectPath, certs::authorityServiceName,
-                            certId, certURL, "TrustStore Certificate");
-                        BMCWEB_LOG_DEBUG
-                            << "TrustStore certificate install file="
-                            << certFile->getCertFilePath();
-                    },
-                    certs::authorityServiceName, certs::authorityObjectPath,
-                    certs::certInstallIntf, "Install",
-                    certFile->getCertFilePath());
-            });
+                    getCertificateProperties(
+                        asyncResp, objectPath, certs::authorityServiceName,
+                        certId, certURL, "TrustStore Certificate");
+                    BMCWEB_LOG_DEBUG << "TrustStore certificate install file="
+                                     << certFile->getCertFilePath();
+                },
+                certs::authorityServiceName, certs::authorityObjectPath,
+                certs::certInstallIntf, "Install", certFile->getCertFilePath());
+        });
 } // requestRoutesTrustStoreCertificateCollection
 
 /**
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 745f5af..8fc9129 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -189,8 +189,7 @@
                     const std::variant<std::string>& property) {
             if (ec)
             {
-                BMCWEB_LOG_DEBUG << "DBUS response error for "
-                                    "Location";
+                BMCWEB_LOG_DEBUG << "DBUS response error for Location";
                 messages::internalError(asyncResp->res);
                 return;
             }
@@ -198,8 +197,7 @@
             const std::string* value = std::get_if<std::string>(&property);
             if (value == nullptr)
             {
-                BMCWEB_LOG_DEBUG << "Null value returned "
-                                    "for locaton code";
+                BMCWEB_LOG_DEBUG << "Null value returned for locaton code";
                 messages::internalError(asyncResp->res);
                 return;
             }
@@ -219,16 +217,14 @@
                     const std::variant<std::string>& chassisUUID) {
             if (ec)
             {
-                BMCWEB_LOG_DEBUG << "DBUS response error for "
-                                    "UUID";
+                BMCWEB_LOG_DEBUG << "DBUS response error for UUID";
                 messages::internalError(asyncResp->res);
                 return;
             }
             const std::string* value = std::get_if<std::string>(&chassisUUID);
             if (value == nullptr)
             {
-                BMCWEB_LOG_DEBUG << "Null value returned "
-                                    "for UUID";
+                BMCWEB_LOG_DEBUG << "Null value returned for UUID";
                 messages::internalError(asyncResp->res);
                 return;
             }
@@ -338,12 +334,10 @@
                             connectionNames[0].second;
                         const std::array<const char*, 2> hasIndicatorLed = {
                             "xyz.openbmc_project.Inventory.Item.Panel",
-                            "xyz.openbmc_project.Inventory.Item.Board."
-                            "Motherboard"};
+                            "xyz.openbmc_project.Inventory.Item.Board.Motherboard"};
 
                         const std::string assetTagInterface =
-                            "xyz.openbmc_project.Inventory.Decorator."
-                            "AssetTag";
+                            "xyz.openbmc_project.Inventory.Decorator.AssetTag";
                         if (std::find(interfaces2.begin(), interfaces2.end(),
                                       assetTagInterface) != interfaces2.end())
                         {
@@ -354,8 +348,7 @@
                                     if (ec)
                                     {
                                         BMCWEB_LOG_DEBUG
-                                            << "DBus response error for "
-                                               "AssetTag";
+                                            << "DBus response error for AssetTag";
                                         messages::internalError(asyncResp->res);
                                         return;
                                     }
@@ -365,8 +358,7 @@
                                     if (assetTag == nullptr)
                                     {
                                         BMCWEB_LOG_DEBUG
-                                            << "Null value returned "
-                                               "for Chassis AssetTag";
+                                            << "Null value returned for Chassis AssetTag";
                                         messages::internalError(asyncResp->res);
                                         return;
                                     }
@@ -458,9 +450,9 @@
                             {
                                 getChassisUUID(asyncResp, connectionName, path);
                             }
-                            else if (interface ==
-                                     "xyz.openbmc_project.Inventory."
-                                     "Decorator.LocationCode")
+                            else if (
+                                interface ==
+                                "xyz.openbmc_project.Inventory.Decorator.LocationCode")
                             {
                                 getChassisLocationCode(asyncResp,
                                                        connectionName, path);
@@ -513,8 +505,7 @@
             {
                 asyncResp->res.addHeader(
                     boost::beast::http::field::warning,
-                    "299 - \"IndicatorLED is deprecated. Use "
-                    "LocationIndicatorActive instead.\"");
+                    "299 - \"IndicatorLED is deprecated. Use LocationIndicatorActive instead.\"");
             }
 
             const std::array<const char*, 2> interfaces = {
@@ -562,8 +553,7 @@
 
                         const std::array<const char*, 2> hasIndicatorLed = {
                             "xyz.openbmc_project.Inventory.Item.Panel",
-                            "xyz.openbmc_project.Inventory.Item.Board."
-                            "Motherboard"};
+                            "xyz.openbmc_project.Inventory.Item.Board.Motherboard"};
                         bool indicatorChassis = false;
                         for (const char* interface : hasIndicatorLed)
                         {
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 82d44ae..6723d5b 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -1089,8 +1089,8 @@
 {
     // Can have multiple subdomains
     // Top Level Domain's min length is 2 character
-    const std::regex pattern("^([A-Za-z0-9][a-zA-Z0-9\\-]{1,61}|[a-zA-Z0-9]"
-                             "{1,30}\\.)*[a-zA-Z]{2,}$");
+    const std::regex pattern(
+        "^([A-Za-z0-9][a-zA-Z0-9\\-]{1,61}|[a-zA-Z0-9]{1,30}\\.)*[a-zA-Z]{2,}$");
 
     return std::regex_match(domainname, pattern);
 }
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index b802280..d273aea 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -44,48 +44,47 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/EventService/")
         .privileges(redfish::privileges::getEventService)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue = {
-                    {"@odata.type", "#EventService.v1_5_0.EventService"},
-                    {"Id", "EventService"},
-                    {"Name", "Event Service"},
-                    {"Subscriptions",
-                     {{"@odata.id", "/redfish/v1/EventService/Subscriptions"}}},
-                    {"Actions",
-                     {{"#EventService.SubmitTestEvent",
-                       {{"target", "/redfish/v1/EventService/Actions/"
-                                   "EventService.SubmitTestEvent"}}}}},
-                    {"@odata.id", "/redfish/v1/EventService"}};
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue = {
+                {"@odata.type", "#EventService.v1_5_0.EventService"},
+                {"Id", "EventService"},
+                {"Name", "Event Service"},
+                {"Subscriptions",
+                 {{"@odata.id", "/redfish/v1/EventService/Subscriptions"}}},
+                {"Actions",
+                 {{"#EventService.SubmitTestEvent",
+                   {{"target",
+                     "/redfish/v1/EventService/Actions/EventService.SubmitTestEvent"}}}}},
+                {"@odata.id", "/redfish/v1/EventService"}};
 
-                const persistent_data::EventServiceConfig eventServiceConfig =
-                    persistent_data::EventServiceStore::getInstance()
-                        .getEventServiceConfig();
+            const persistent_data::EventServiceConfig eventServiceConfig =
+                persistent_data::EventServiceStore::getInstance()
+                    .getEventServiceConfig();
 
-                asyncResp->res.jsonValue["Status"]["State"] =
-                    (eventServiceConfig.enabled ? "Enabled" : "Disabled");
-                asyncResp->res.jsonValue["ServiceEnabled"] =
-                    eventServiceConfig.enabled;
-                asyncResp->res.jsonValue["DeliveryRetryAttempts"] =
-                    eventServiceConfig.retryAttempts;
-                asyncResp->res.jsonValue["DeliveryRetryIntervalSeconds"] =
-                    eventServiceConfig.retryTimeoutInterval;
-                asyncResp->res.jsonValue["EventFormatTypes"] =
-                    supportedEvtFormatTypes;
-                asyncResp->res.jsonValue["RegistryPrefixes"] =
-                    supportedRegPrefixes;
-                asyncResp->res.jsonValue["ResourceTypes"] =
-                    supportedResourceTypes;
+            asyncResp->res.jsonValue["Status"]["State"] =
+                (eventServiceConfig.enabled ? "Enabled" : "Disabled");
+            asyncResp->res.jsonValue["ServiceEnabled"] =
+                eventServiceConfig.enabled;
+            asyncResp->res.jsonValue["DeliveryRetryAttempts"] =
+                eventServiceConfig.retryAttempts;
+            asyncResp->res.jsonValue["DeliveryRetryIntervalSeconds"] =
+                eventServiceConfig.retryTimeoutInterval;
+            asyncResp->res.jsonValue["EventFormatTypes"] =
+                supportedEvtFormatTypes;
+            asyncResp->res.jsonValue["RegistryPrefixes"] = supportedRegPrefixes;
+            asyncResp->res.jsonValue["ResourceTypes"] = supportedResourceTypes;
 
-                nlohmann::json supportedSSEFilters = {
-                    {"EventFormatType", true},        {"MessageId", true},
-                    {"MetricReportDefinition", true}, {"RegistryPrefix", true},
-                    {"OriginResource", false},        {"ResourceType", false}};
+            nlohmann::json supportedSSEFilters = {
+                {"EventFormatType", true},        {"MessageId", true},
+                {"MetricReportDefinition", true}, {"RegistryPrefix", true},
+                {"OriginResource", false},        {"ResourceType", false}};
 
-                asyncResp->res.jsonValue["SSEFilterPropertiesSupported"] =
-                    supportedSSEFilters;
-            });
+            asyncResp->res.jsonValue["SSEFilterPropertiesSupported"] =
+                supportedSSEFilters;
+        });
 
     BMCWEB_ROUTE(app, "/redfish/v1/EventService/")
         .privileges(redfish::privileges::patchEventService)
diff --git a/redfish-core/lib/hypervisor_system.hpp b/redfish-core/lib/hypervisor_system.hpp
index 107a5fa..54166a7 100644
--- a/redfish-core/lib/hypervisor_system.hpp
+++ b/redfish-core/lib/hypervisor_system.hpp
@@ -58,26 +58,26 @@
                 aResp->res.jsonValue["PowerState"] = "On";
                 aResp->res.jsonValue["Status"]["State"] = "Enabled";
             }
-            else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                           "Quiesced")
+            else if (*s == "xyz.openbmc_project.State.Host.HostState.Quiesced")
             {
                 aResp->res.jsonValue["PowerState"] = "On";
                 aResp->res.jsonValue["Status"]["State"] = "Quiesced";
             }
-            else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                           "Standby")
+            else if (*s == "xyz.openbmc_project.State.Host.HostState.Standby")
             {
                 aResp->res.jsonValue["PowerState"] = "On";
                 aResp->res.jsonValue["Status"]["State"] = "StandbyOffline";
             }
-            else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                           "TransitioningToRunning")
+            else if (
+                *s ==
+                "xyz.openbmc_project.State.Host.HostState.TransitioningToRunning")
             {
                 aResp->res.jsonValue["PowerState"] = "PoweringOn";
                 aResp->res.jsonValue["Status"]["State"] = "Starting";
             }
-            else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                           "TransitioningToOff")
+            else if (
+                *s ==
+                "xyz.openbmc_project.State.Host.HostState.TransitioningToOff")
             {
                 aResp->res.jsonValue["PowerState"] = "PoweringOff";
                 aResp->res.jsonValue["Status"]["State"] = "Enabled";
@@ -727,43 +727,43 @@
 
     BMCWEB_ROUTE(app, "/redfish/v1/Systems/hypervisor/")
         .privileges(redfish::privileges::getComputerSystem)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code ec,
-                                const std::variant<std::string>& /*hostName*/) {
-                        if (ec)
-                        {
-                            messages::resourceNotFound(asyncResp->res, "System",
-                                                       "hypervisor");
-                            return;
-                        }
-                        BMCWEB_LOG_DEBUG << "Hypervisor is available";
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](const boost::system::error_code ec,
+                            const std::variant<std::string>& /*hostName*/) {
+                    if (ec)
+                    {
+                        messages::resourceNotFound(asyncResp->res, "System",
+                                                   "hypervisor");
+                        return;
+                    }
+                    BMCWEB_LOG_DEBUG << "Hypervisor is available";
 
-                        asyncResp->res.jsonValue["@odata.type"] =
-                            "#ComputerSystem.v1_6_0.ComputerSystem";
-                        asyncResp->res.jsonValue["@odata.id"] =
-                            "/redfish/v1/Systems/hypervisor";
-                        asyncResp->res.jsonValue["Description"] = "Hypervisor";
-                        asyncResp->res.jsonValue["Name"] = "Hypervisor";
-                        asyncResp->res.jsonValue["Id"] = "hypervisor";
-                        asyncResp->res.jsonValue["SystemType"] = "OS";
-                        asyncResp->res.jsonValue["Links"]["ManagedBy"] = {
-                            {{"@odata.id", "/redfish/v1/Managers/bmc"}}};
-                        asyncResp->res.jsonValue["EthernetInterfaces"] = {
-                            {"@odata.id", "/redfish/v1/Systems/hypervisor/"
-                                          "EthernetInterfaces"}};
-                        getHypervisorState(asyncResp);
-                        getHypervisorActions(asyncResp);
-                        // TODO: Add "SystemType" : "hypervisor"
-                    },
-                    "xyz.openbmc_project.Settings",
-                    "/xyz/openbmc_project/network/hypervisor",
-                    "org.freedesktop.DBus.Properties", "Get",
-                    "xyz.openbmc_project.Network.SystemConfiguration",
-                    "HostName");
-            });
+                    asyncResp->res.jsonValue["@odata.type"] =
+                        "#ComputerSystem.v1_6_0.ComputerSystem";
+                    asyncResp->res.jsonValue["@odata.id"] =
+                        "/redfish/v1/Systems/hypervisor";
+                    asyncResp->res.jsonValue["Description"] = "Hypervisor";
+                    asyncResp->res.jsonValue["Name"] = "Hypervisor";
+                    asyncResp->res.jsonValue["Id"] = "hypervisor";
+                    asyncResp->res.jsonValue["SystemType"] = "OS";
+                    asyncResp->res.jsonValue["Links"]["ManagedBy"] = {
+                        {{"@odata.id", "/redfish/v1/Managers/bmc"}}};
+                    asyncResp->res.jsonValue["EthernetInterfaces"] = {
+                        {"@odata.id",
+                         "/redfish/v1/Systems/hypervisor/EthernetInterfaces"}};
+                    getHypervisorState(asyncResp);
+                    getHypervisorActions(asyncResp);
+                    // TODO: Add "SystemType" : "hypervisor"
+                },
+                "xyz.openbmc_project.Settings",
+                "/xyz/openbmc_project/network/hypervisor",
+                "org.freedesktop.DBus.Properties", "Get",
+                "xyz.openbmc_project.Network.SystemConfiguration", "HostName");
+        });
 
     /**
      * HypervisorInterfaceCollection class to handle the GET and PATCH on
@@ -772,58 +772,58 @@
 
     BMCWEB_ROUTE(app, "/redfish/v1/Systems/hypervisor/EthernetInterfaces/")
         .privileges(redfish::privileges::getEthernetInterfaceCollection)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                const std::array<const char*, 1> interfaces = {
-                    "xyz.openbmc_project.Network.EthernetInterface"};
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            const std::array<const char*, 1> interfaces = {
+                "xyz.openbmc_project.Network.EthernetInterface"};
 
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code error,
-                                const std::vector<std::string>& ifaceList) {
-                        if (error)
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](const boost::system::error_code error,
+                            const std::vector<std::string>& ifaceList) {
+                    if (error)
+                    {
+                        messages::resourceNotFound(asyncResp->res, "System",
+                                                   "hypervisor");
+                        return;
+                    }
+                    asyncResp->res.jsonValue["@odata.type"] =
+                        "#EthernetInterfaceCollection."
+                        "EthernetInterfaceCollection";
+                    asyncResp->res.jsonValue["@odata.id"] =
+                        "/redfish/v1/Systems/hypervisor/EthernetInterfaces";
+                    asyncResp->res.jsonValue["Name"] = "Hypervisor Ethernet "
+                                                       "Interface Collection";
+                    asyncResp->res.jsonValue["Description"] =
+                        "Collection of Virtual Management "
+                        "Interfaces for the hypervisor";
+
+                    nlohmann::json& ifaceArray =
+                        asyncResp->res.jsonValue["Members"];
+                    ifaceArray = nlohmann::json::array();
+                    for (const std::string& iface : ifaceList)
+                    {
+                        sdbusplus::message::object_path path(iface);
+                        std::string name = path.filename();
+                        if (name.empty())
                         {
-                            messages::resourceNotFound(asyncResp->res, "System",
-                                                       "hypervisor");
-                            return;
+                            continue;
                         }
-                        asyncResp->res.jsonValue["@odata.type"] =
-                            "#EthernetInterfaceCollection."
-                            "EthernetInterfaceCollection";
-                        asyncResp->res.jsonValue["@odata.id"] =
-                            "/redfish/v1/Systems/hypervisor/EthernetInterfaces";
-                        asyncResp->res.jsonValue["Name"] =
-                            "Hypervisor Ethernet "
-                            "Interface Collection";
-                        asyncResp->res.jsonValue["Description"] =
-                            "Collection of Virtual Management "
-                            "Interfaces for the hypervisor";
 
-                        nlohmann::json& ifaceArray =
-                            asyncResp->res.jsonValue["Members"];
-                        ifaceArray = nlohmann::json::array();
-                        for (const std::string& iface : ifaceList)
-                        {
-                            sdbusplus::message::object_path path(iface);
-                            std::string name = path.filename();
-                            if (name.empty())
-                            {
-                                continue;
-                            }
-
-                            ifaceArray.push_back(
-                                {{"@odata.id", "/redfish/v1/Systems/hypervisor/"
-                                               "EthernetInterfaces/" +
-                                                   name}});
-                        }
-                        asyncResp->res.jsonValue["Members@odata.count"] =
-                            ifaceArray.size();
-                    },
-                    "xyz.openbmc_project.ObjectMapper",
-                    "/xyz/openbmc_project/object_mapper",
-                    "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
-                    "/xyz/openbmc_project/network/hypervisor", 0, interfaces);
-            });
+                        ifaceArray.push_back(
+                            {{"@odata.id",
+                              "/redfish/v1/Systems/hypervisor/EthernetInterfaces/" +
+                                  name}});
+                    }
+                    asyncResp->res.jsonValue["Members@odata.count"] =
+                        ifaceArray.size();
+                },
+                "xyz.openbmc_project.ObjectMapper",
+                "/xyz/openbmc_project/object_mapper",
+                "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
+                "/xyz/openbmc_project/network/hypervisor", 0, interfaces);
+        });
 
     BMCWEB_ROUTE(app,
                  "/redfish/v1/Systems/hypervisor/EthernetInterfaces/<str>/")
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 92caac9..65b12f3 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -495,8 +495,8 @@
                     }
                 }
 
-                if (dumpStatus != "xyz.openbmc_project.Common.Progress."
-                                  "OperationStatus.Completed" &&
+                if (dumpStatus !=
+                        "xyz.openbmc_project.Common.Progress.OperationStatus.Completed" &&
                     !dumpStatus.empty())
                 {
                     // Dump status is not Complete, no need to enumerate
@@ -645,8 +645,8 @@
                     }
                 }
 
-                if (dumpStatus != "xyz.openbmc_project.Common.Progress."
-                                  "OperationStatus.Completed" &&
+                if (dumpStatus !=
+                        "xyz.openbmc_project.Common.Progress.OperationStatus.Completed" &&
                     !dumpStatus.empty())
                 {
                     // Dump status is not Complete
@@ -831,8 +831,8 @@
     {
         if (!diagnosticDataType)
         {
-            BMCWEB_LOG_ERROR << "CreateDump action parameter "
-                                "'DiagnosticDataType' not found!";
+            BMCWEB_LOG_ERROR
+                << "CreateDump action parameter 'DiagnosticDataType' not found!";
             messages::actionParameterMissing(
                 asyncResp->res, "CollectDiagnosticData", "DiagnosticDataType");
             return;
@@ -1002,8 +1002,8 @@
                                 nlohmann::json& logServiceArrayLocal =
                                     asyncResp->res.jsonValue["Members"];
                                 logServiceArrayLocal.push_back(
-                                    {{"@odata.id", "/redfish/v1/Systems/system/"
-                                                   "LogServices/PostCodes"}});
+                                    {{"@odata.id",
+                                      "/redfish/v1/Systems/system/LogServices/PostCodes"}});
                                 asyncResp->res
                                     .jsonValue["Members@odata.count"] =
                                     logServiceArrayLocal.size();
@@ -1048,8 +1048,8 @@
                  "/redfish/v1/Systems/system/LogServices/EventLog/Entries"}};
             asyncResp->res.jsonValue["Actions"]["#LogService.ClearLog"] = {
 
-                {"target", "/redfish/v1/Systems/system/LogServices/EventLog/"
-                           "Actions/LogService.ClearLog"}};
+                {"target",
+                 "/redfish/v1/Systems/system/LogServices/EventLog/Actions/LogService.ClearLog"}};
         });
 }
 
@@ -1480,8 +1480,7 @@
                         nlohmann::json& thisEntry = entriesArray.back();
                         thisEntry["@odata.type"] = "#LogEntry.v1_8_0.LogEntry";
                         thisEntry["@odata.id"] =
-                            "/redfish/v1/Systems/system/"
-                            "LogServices/EventLog/Entries/" +
+                            "/redfish/v1/Systems/system/LogServices/EventLog/Entries/" +
                             std::to_string(*id);
                         thisEntry["Name"] = "System Event Log Entry";
                         thisEntry["Id"] = std::to_string(*id);
@@ -1497,9 +1496,7 @@
                         if (filePath != nullptr)
                         {
                             thisEntry["AdditionalDataURI"] =
-                                "/redfish/v1/Systems/system/LogServices/"
-                                "EventLog/"
-                                "Entries/" +
+                                "/redfish/v1/Systems/system/LogServices/EventLog/Entries/" +
                                 std::to_string(*id) + "/attachment";
                         }
                     }
@@ -1543,9 +1540,9 @@
                         }
                         if (ec)
                         {
-                            BMCWEB_LOG_ERROR << "EventLogEntry (DBus) "
-                                                "resp_handler got error "
-                                             << ec;
+                            BMCWEB_LOG_ERROR
+                                << "EventLogEntry (DBus) resp_handler got error "
+                                << ec;
                             messages::internalError(asyncResp->res);
                             return;
                         }
@@ -1620,8 +1617,7 @@
                         asyncResp->res.jsonValue["@odata.type"] =
                             "#LogEntry.v1_8_0.LogEntry";
                         asyncResp->res.jsonValue["@odata.id"] =
-                            "/redfish/v1/Systems/system/LogServices/EventLog/"
-                            "Entries/" +
+                            "/redfish/v1/Systems/system/LogServices/EventLog/Entries/" +
                             std::to_string(*id);
                         asyncResp->res.jsonValue["Name"] =
                             "System Event Log Entry";
@@ -1638,9 +1634,7 @@
                         if (filePath != nullptr)
                         {
                             asyncResp->res.jsonValue["AdditionalDataURI"] =
-                                "/redfish/v1/Systems/system/LogServices/"
-                                "EventLog/"
-                                "attachment/" +
+                                "/redfish/v1/Systems/system/LogServices/EventLog/attachment/" +
                                 std::to_string(*id);
                         }
                     },
@@ -1711,9 +1705,9 @@
                             return;
                         }
                         // TODO Handle for specific error code
-                        BMCWEB_LOG_ERROR << "EventLogEntry (DBus) doDelete "
-                                            "respHandler got error "
-                                         << ec;
+                        BMCWEB_LOG_ERROR
+                            << "EventLogEntry (DBus) doDelete respHandler got error "
+                            << ec;
                         asyncResp->res.result(
                             boost::beast::http::status::internal_server_error);
                         return;
@@ -1732,8 +1726,9 @@
 
 inline void requestRoutesDBusEventLogEntryDownload(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/EventLog/Entries/"
-                      "<str>/attachment")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/EventLog/Entries/<str>/attachment")
         .privileges(redfish::privileges::getLogEntry)
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request& req,
@@ -1908,20 +1903,21 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/HostLogger/")
         .privileges(redfish::privileges::getLogService)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/Systems/system/LogServices/HostLogger";
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#LogService.v1_1_0.LogService";
-                asyncResp->res.jsonValue["Name"] = "Host Logger Service";
-                asyncResp->res.jsonValue["Description"] = "Host Logger Service";
-                asyncResp->res.jsonValue["Id"] = "HostLogger";
-                asyncResp->res.jsonValue["Entries"] = {
-                    {"@odata.id", "/redfish/v1/Systems/system/LogServices/"
-                                  "HostLogger/Entries"}};
-            });
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue["@odata.id"] =
+                "/redfish/v1/Systems/system/LogServices/HostLogger";
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#LogService.v1_1_0.LogService";
+            asyncResp->res.jsonValue["Name"] = "Host Logger Service";
+            asyncResp->res.jsonValue["Description"] = "Host Logger Service";
+            asyncResp->res.jsonValue["Id"] = "HostLogger";
+            asyncResp->res.jsonValue["Entries"] = {
+                {"@odata.id",
+                 "/redfish/v1/Systems/system/LogServices/HostLogger/Entries"}};
+        });
 }
 
 inline void requestRoutesSystemHostLoggerCollection(App& app)
@@ -1929,77 +1925,76 @@
     BMCWEB_ROUTE(app,
                  "/redfish/v1/Systems/system/LogServices/HostLogger/Entries/")
         .privileges(redfish::privileges::getLogEntry)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                uint64_t skip = 0;
-                uint64_t top = maxEntriesPerPage; // Show max 1000 entries by
-                                                  // default, allow range 1 to
-                                                  // 1000 entries per page.
-                if (!getSkipParam(asyncResp, req, skip))
-                {
-                    return;
-                }
-                if (!getTopParam(asyncResp, req, top))
-                {
-                    return;
-                }
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/Systems/system/LogServices/HostLogger/Entries";
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#LogEntryCollection.LogEntryCollection";
-                asyncResp->res.jsonValue["Name"] = "HostLogger Entries";
-                asyncResp->res.jsonValue["Description"] =
-                    "Collection of HostLogger Entries";
-                nlohmann::json& logEntryArray =
-                    asyncResp->res.jsonValue["Members"];
-                logEntryArray = nlohmann::json::array();
-                asyncResp->res.jsonValue["Members@odata.count"] = 0;
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request& req,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            uint64_t skip = 0;
+            uint64_t top = maxEntriesPerPage; // Show max 1000 entries by
+                                              // default, allow range 1 to
+                                              // 1000 entries per page.
+            if (!getSkipParam(asyncResp, req, skip))
+            {
+                return;
+            }
+            if (!getTopParam(asyncResp, req, top))
+            {
+                return;
+            }
+            asyncResp->res.jsonValue["@odata.id"] =
+                "/redfish/v1/Systems/system/LogServices/HostLogger/Entries";
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#LogEntryCollection.LogEntryCollection";
+            asyncResp->res.jsonValue["Name"] = "HostLogger Entries";
+            asyncResp->res.jsonValue["Description"] =
+                "Collection of HostLogger Entries";
+            nlohmann::json& logEntryArray = asyncResp->res.jsonValue["Members"];
+            logEntryArray = nlohmann::json::array();
+            asyncResp->res.jsonValue["Members@odata.count"] = 0;
 
-                std::vector<std::filesystem::path> hostLoggerFiles;
-                if (!getHostLoggerFiles(hostLoggerFolderPath, hostLoggerFiles))
+            std::vector<std::filesystem::path> hostLoggerFiles;
+            if (!getHostLoggerFiles(hostLoggerFolderPath, hostLoggerFiles))
+            {
+                BMCWEB_LOG_ERROR << "fail to get host log file path";
+                return;
+            }
+
+            size_t logCount = 0;
+            // This vector only store the entries we want to expose that
+            // control by skip and top.
+            std::vector<std::string> logEntries;
+            if (!getHostLoggerEntries(hostLoggerFiles, skip, top, logEntries,
+                                      logCount))
+            {
+                messages::internalError(asyncResp->res);
+                return;
+            }
+            // If vector is empty, that means skip value larger than total
+            // log count
+            if (logEntries.size() == 0)
+            {
+                asyncResp->res.jsonValue["Members@odata.count"] = logCount;
+                return;
+            }
+            if (logEntries.size() > 0)
+            {
+                for (size_t i = 0; i < logEntries.size(); i++)
                 {
-                    BMCWEB_LOG_ERROR << "fail to get host log file path";
-                    return;
+                    logEntryArray.push_back({});
+                    nlohmann::json& hostLogEntry = logEntryArray.back();
+                    fillHostLoggerEntryJson(std::to_string(skip + i),
+                                            logEntries[i], hostLogEntry);
                 }
 
-                size_t logCount = 0;
-                // This vector only store the entries we want to expose that
-                // control by skip and top.
-                std::vector<std::string> logEntries;
-                if (!getHostLoggerEntries(hostLoggerFiles, skip, top,
-                                          logEntries, logCount))
+                asyncResp->res.jsonValue["Members@odata.count"] = logCount;
+                if (skip + top < logCount)
                 {
-                    messages::internalError(asyncResp->res);
-                    return;
+                    asyncResp->res.jsonValue["Members@odata.nextLink"] =
+                        "/redfish/v1/Systems/system/LogServices/HostLogger/Entries?$skip=" +
+                        std::to_string(skip + top);
                 }
-                // If vector is empty, that means skip value larger than total
-                // log count
-                if (logEntries.size() == 0)
-                {
-                    asyncResp->res.jsonValue["Members@odata.count"] = logCount;
-                    return;
-                }
-                if (logEntries.size() > 0)
-                {
-                    for (size_t i = 0; i < logEntries.size(); i++)
-                    {
-                        logEntryArray.push_back({});
-                        nlohmann::json& hostLogEntry = logEntryArray.back();
-                        fillHostLoggerEntryJson(std::to_string(skip + i),
-                                                logEntries[i], hostLogEntry);
-                    }
-
-                    asyncResp->res.jsonValue["Members@odata.count"] = logCount;
-                    if (skip + top < logCount)
-                    {
-                        asyncResp->res.jsonValue["Members@odata.nextLink"] =
-                            "/redfish/v1/Systems/system/LogServices/HostLogger/"
-                            "Entries?$skip=" +
-                            std::to_string(skip + top);
-                    }
-                }
-            });
+            }
+        });
 }
 
 inline void requestRoutesSystemHostLoggerLogEntry(App& app)
@@ -2192,89 +2187,88 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/LogServices/Journal/Entries/")
         .privileges(redfish::privileges::getLogEntryCollection)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                static constexpr const long maxEntriesPerPage = 1000;
-                uint64_t skip = 0;
-                uint64_t top = maxEntriesPerPage; // Show max entries by default
-                if (!getSkipParam(asyncResp, req, skip))
-                {
-                    return;
-                }
-                if (!getTopParam(asyncResp, req, top))
-                {
-                    return;
-                }
-                // Collections don't include the static data added by SubRoute
-                // because it has a duplicate entry for members
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#LogEntryCollection.LogEntryCollection";
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/Managers/bmc/LogServices/Journal/Entries";
-                asyncResp->res.jsonValue["Name"] = "Open BMC Journal Entries";
-                asyncResp->res.jsonValue["Description"] =
-                    "Collection of BMC Journal Entries";
-                nlohmann::json& logEntryArray =
-                    asyncResp->res.jsonValue["Members"];
-                logEntryArray = nlohmann::json::array();
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request& req,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            static constexpr const long maxEntriesPerPage = 1000;
+            uint64_t skip = 0;
+            uint64_t top = maxEntriesPerPage; // Show max entries by default
+            if (!getSkipParam(asyncResp, req, skip))
+            {
+                return;
+            }
+            if (!getTopParam(asyncResp, req, top))
+            {
+                return;
+            }
+            // Collections don't include the static data added by SubRoute
+            // because it has a duplicate entry for members
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#LogEntryCollection.LogEntryCollection";
+            asyncResp->res.jsonValue["@odata.id"] =
+                "/redfish/v1/Managers/bmc/LogServices/Journal/Entries";
+            asyncResp->res.jsonValue["Name"] = "Open BMC Journal Entries";
+            asyncResp->res.jsonValue["Description"] =
+                "Collection of BMC Journal Entries";
+            nlohmann::json& logEntryArray = asyncResp->res.jsonValue["Members"];
+            logEntryArray = nlohmann::json::array();
 
-                // Go through the journal and use the timestamp to create a
-                // unique ID for each entry
-                sd_journal* journalTmp = nullptr;
-                int ret = sd_journal_open(&journalTmp, SD_JOURNAL_LOCAL_ONLY);
-                if (ret < 0)
+            // Go through the journal and use the timestamp to create a
+            // unique ID for each entry
+            sd_journal* journalTmp = nullptr;
+            int ret = sd_journal_open(&journalTmp, SD_JOURNAL_LOCAL_ONLY);
+            if (ret < 0)
+            {
+                BMCWEB_LOG_ERROR << "failed to open journal: "
+                                 << strerror(-ret);
+                messages::internalError(asyncResp->res);
+                return;
+            }
+            std::unique_ptr<sd_journal, decltype(&sd_journal_close)> journal(
+                journalTmp, sd_journal_close);
+            journalTmp = nullptr;
+            uint64_t entryCount = 0;
+            // Reset the unique ID on the first entry
+            bool firstEntry = true;
+            SD_JOURNAL_FOREACH(journal.get())
+            {
+                entryCount++;
+                // Handle paging using skip (number of entries to skip from
+                // the start) and top (number of entries to display)
+                if (entryCount <= skip || entryCount > skip + top)
                 {
-                    BMCWEB_LOG_ERROR << "failed to open journal: "
-                                     << strerror(-ret);
+                    continue;
+                }
+
+                std::string idStr;
+                if (!getUniqueEntryID(journal.get(), idStr, firstEntry))
+                {
+                    continue;
+                }
+
+                if (firstEntry)
+                {
+                    firstEntry = false;
+                }
+
+                logEntryArray.push_back({});
+                nlohmann::json& bmcJournalLogEntry = logEntryArray.back();
+                if (fillBMCJournalLogEntryJson(idStr, journal.get(),
+                                               bmcJournalLogEntry) != 0)
+                {
                     messages::internalError(asyncResp->res);
                     return;
                 }
-                std::unique_ptr<sd_journal, decltype(&sd_journal_close)>
-                    journal(journalTmp, sd_journal_close);
-                journalTmp = nullptr;
-                uint64_t entryCount = 0;
-                // Reset the unique ID on the first entry
-                bool firstEntry = true;
-                SD_JOURNAL_FOREACH(journal.get())
-                {
-                    entryCount++;
-                    // Handle paging using skip (number of entries to skip from
-                    // the start) and top (number of entries to display)
-                    if (entryCount <= skip || entryCount > skip + top)
-                    {
-                        continue;
-                    }
-
-                    std::string idStr;
-                    if (!getUniqueEntryID(journal.get(), idStr, firstEntry))
-                    {
-                        continue;
-                    }
-
-                    if (firstEntry)
-                    {
-                        firstEntry = false;
-                    }
-
-                    logEntryArray.push_back({});
-                    nlohmann::json& bmcJournalLogEntry = logEntryArray.back();
-                    if (fillBMCJournalLogEntryJson(idStr, journal.get(),
-                                                   bmcJournalLogEntry) != 0)
-                    {
-                        messages::internalError(asyncResp->res);
-                        return;
-                    }
-                }
-                asyncResp->res.jsonValue["Members@odata.count"] = entryCount;
-                if (skip + top < entryCount)
-                {
-                    asyncResp->res.jsonValue["Members@odata.nextLink"] =
-                        "/redfish/v1/Managers/bmc/LogServices/Journal/"
-                        "Entries?$skip=" +
-                        std::to_string(skip + top);
-                }
-            });
+            }
+            asyncResp->res.jsonValue["Members@odata.count"] = entryCount;
+            if (skip + top < entryCount)
+            {
+                asyncResp->res.jsonValue["Members@odata.nextLink"] =
+                    "/redfish/v1/Managers/bmc/LogServices/Journal/Entries?$skip=" +
+                    std::to_string(skip + top);
+            }
+        });
 }
 
 inline void requestRoutesBMCJournalLogEntry(App& app)
@@ -2351,36 +2345,36 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/LogServices/Dump/")
         .privileges(redfish::privileges::getLogService)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/Managers/bmc/LogServices/Dump";
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#LogService.v1_2_0.LogService";
-                asyncResp->res.jsonValue["Name"] = "Dump LogService";
-                asyncResp->res.jsonValue["Description"] = "BMC Dump LogService";
-                asyncResp->res.jsonValue["Id"] = "Dump";
-                asyncResp->res.jsonValue["OverWritePolicy"] = "WrapsWhenFull";
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue["@odata.id"] =
+                "/redfish/v1/Managers/bmc/LogServices/Dump";
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#LogService.v1_2_0.LogService";
+            asyncResp->res.jsonValue["Name"] = "Dump LogService";
+            asyncResp->res.jsonValue["Description"] = "BMC Dump LogService";
+            asyncResp->res.jsonValue["Id"] = "Dump";
+            asyncResp->res.jsonValue["OverWritePolicy"] = "WrapsWhenFull";
 
-                std::pair<std::string, std::string> redfishDateTimeOffset =
-                    crow::utility::getDateTimeOffsetNow();
-                asyncResp->res.jsonValue["DateTime"] =
-                    redfishDateTimeOffset.first;
-                asyncResp->res.jsonValue["DateTimeLocalOffset"] =
-                    redfishDateTimeOffset.second;
+            std::pair<std::string, std::string> redfishDateTimeOffset =
+                crow::utility::getDateTimeOffsetNow();
+            asyncResp->res.jsonValue["DateTime"] = redfishDateTimeOffset.first;
+            asyncResp->res.jsonValue["DateTimeLocalOffset"] =
+                redfishDateTimeOffset.second;
 
-                asyncResp->res.jsonValue["Entries"] = {
-                    {"@odata.id",
-                     "/redfish/v1/Managers/bmc/LogServices/Dump/Entries"}};
-                asyncResp->res.jsonValue["Actions"] = {
-                    {"#LogService.ClearLog",
-                     {{"target", "/redfish/v1/Managers/bmc/LogServices/Dump/"
-                                 "Actions/LogService.ClearLog"}}},
-                    {"#LogService.CollectDiagnosticData",
-                     {{"target", "/redfish/v1/Managers/bmc/LogServices/Dump/"
-                                 "Actions/LogService.CollectDiagnosticData"}}}};
-            });
+            asyncResp->res.jsonValue["Entries"] = {
+                {"@odata.id",
+                 "/redfish/v1/Managers/bmc/LogServices/Dump/Entries"}};
+            asyncResp->res.jsonValue["Actions"] = {
+                {"#LogService.ClearLog",
+                 {{"target",
+                   "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.ClearLog"}}},
+                {"#LogService.CollectDiagnosticData",
+                 {{"target",
+                   "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData"}}}};
+        });
 }
 
 inline void requestRoutesBMCDumpEntryCollection(App& app)
@@ -2431,9 +2425,9 @@
 inline void requestRoutesBMCDumpCreate(App& app)
 {
 
-    BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/LogServices/Dump/"
-                      "Actions/"
-                      "LogService.CollectDiagnosticData/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData/")
         .privileges(redfish::privileges::postLogService)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
@@ -2444,9 +2438,9 @@
 
 inline void requestRoutesBMCDumpClear(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/LogServices/Dump/"
-                      "Actions/"
-                      "LogService.ClearLog/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.ClearLog/")
         .privileges(redfish::privileges::postLogService)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request&,
@@ -2487,12 +2481,10 @@
                 asyncResp->res.jsonValue["Actions"] = {
                     {"#LogService.ClearLog",
                      {{"target",
-                       "/redfish/v1/Systems/system/LogServices/Dump/Actions/"
-                       "LogService.ClearLog"}}},
+                       "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.ClearLog"}}},
                     {"#LogService.CollectDiagnosticData",
                      {{"target",
-                       "/redfish/v1/Systems/system/LogServices/Dump/Actions/"
-                       "LogService.CollectDiagnosticData"}}}};
+                       "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.CollectDiagnosticData"}}}};
             });
 }
 
@@ -2545,9 +2537,9 @@
 
 inline void requestRoutesSystemDumpCreate(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/Dump/"
-                      "Actions/"
-                      "LogService.CollectDiagnosticData/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.CollectDiagnosticData/")
         .privileges(redfish::privileges::postLogService)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
@@ -2558,9 +2550,9 @@
 
 inline void requestRoutesSystemDumpClear(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/Dump/"
-                      "Actions/"
-                      "LogService.ClearLog/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/Dump/Actions/LogService.ClearLog/")
         .privileges(redfish::privileges::postLogService)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request&,
@@ -2607,19 +2599,19 @@
                  "/redfish/v1/Systems/system/LogServices/Crashdump/Entries"}};
             asyncResp->res.jsonValue["Actions"] = {
                 {"#LogService.ClearLog",
-                 {{"target", "/redfish/v1/Systems/system/LogServices/Crashdump/"
-                             "Actions/LogService.ClearLog"}}},
+                 {{"target",
+                   "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/LogService.ClearLog"}}},
                 {"#LogService.CollectDiagnosticData",
-                 {{"target", "/redfish/v1/Systems/system/LogServices/Crashdump/"
-                             "Actions/LogService.CollectDiagnosticData"}}}};
+                 {{"target",
+                   "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/LogService.CollectDiagnosticData"}}}};
         });
 }
 
 void inline requestRoutesCrashdumpClear(App& app)
 {
-    BMCWEB_ROUTE(app,
-                 "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/"
-                 "LogService.ClearLog/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/LogService.ClearLog/")
         // This is incorrect, should be:
         //.privileges(redfish::privileges::postLogService)
         .privileges({{"ConfigureComponents"}})
@@ -2886,8 +2878,9 @@
 {
     // Note: Deviated from redfish privilege registry for GET & HEAD
     // method for security reasons.
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/Crashdump/"
-                      "Actions/LogService.CollectDiagnosticData/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/LogService.CollectDiagnosticData/")
         // The below is incorrect;  Should be ConfigureManager
         //.privileges(redfish::privileges::postLogService)
         .privileges({{"ConfigureComponents"}})
@@ -2938,24 +2931,22 @@
                     }
                     return;
                 }
-                std::shared_ptr<task::TaskData> task =
-                    task::TaskData::createTask(
-                        [](boost::system::error_code err,
-                           sdbusplus::message::message&,
-                           const std::shared_ptr<task::TaskData>& taskData) {
-                            if (!err)
-                            {
-                                taskData->messages.emplace_back(
-                                    messages::taskCompletedOK(
-                                        std::to_string(taskData->index)));
-                                taskData->state = "Completed";
-                            }
-                            return task::completed;
-                        },
-                        "type='signal',interface='org.freedesktop.DBus."
-                        "Properties',"
-                        "member='PropertiesChanged',arg0namespace='com.intel."
-                        "crashdump'");
+                std::shared_ptr<task::TaskData> task = task::TaskData::createTask(
+                    [](boost::system::error_code err,
+                       sdbusplus::message::message&,
+                       const std::shared_ptr<task::TaskData>& taskData) {
+                        if (!err)
+                        {
+                            taskData->messages.emplace_back(
+                                messages::taskCompletedOK(
+                                    std::to_string(taskData->index)));
+                            taskData->state = "Completed";
+                        }
+                        return task::completed;
+                    },
+                    "type='signal',interface='org.freedesktop.DBus."
+                    "Properties',"
+                    "member='PropertiesChanged',arg0namespace='com.intel.crashdump'");
                 task->startTimer(std::chrono::minutes(5));
                 task->populateResp(asyncResp->res);
                 task->payload.emplace(req);
@@ -2998,8 +2989,9 @@
      * all entries found in the Entries collection for this Log Service.
      */
 
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/EventLog/Actions/"
-                      "LogService.ClearLog/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/EventLog/Actions/LogService.ClearLog/")
         .privileges(redfish::privileges::postLogService)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request&,
@@ -3041,40 +3033,39 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/PostCodes/")
         .privileges(redfish::privileges::getLogService)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue = {
-                    {"@odata.id",
-                     "/redfish/v1/Systems/system/LogServices/PostCodes"},
-                    {"@odata.type", "#LogService.v1_1_0.LogService"},
-                    {"Name", "POST Code Log Service"},
-                    {"Description", "POST Code Log Service"},
-                    {"Id", "BIOS POST Code Log"},
-                    {"OverWritePolicy", "WrapsWhenFull"},
-                    {"Entries",
-                     {{"@odata.id", "/redfish/v1/Systems/system/LogServices/"
-                                    "PostCodes/Entries"}}}};
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue = {
+                {"@odata.id",
+                 "/redfish/v1/Systems/system/LogServices/PostCodes"},
+                {"@odata.type", "#LogService.v1_1_0.LogService"},
+                {"Name", "POST Code Log Service"},
+                {"Description", "POST Code Log Service"},
+                {"Id", "BIOS POST Code Log"},
+                {"OverWritePolicy", "WrapsWhenFull"},
+                {"Entries",
+                 {{"@odata.id",
+                   "/redfish/v1/Systems/system/LogServices/PostCodes/Entries"}}}};
 
-                std::pair<std::string, std::string> redfishDateTimeOffset =
-                    crow::utility::getDateTimeOffsetNow();
-                asyncResp->res.jsonValue["DateTime"] =
-                    redfishDateTimeOffset.first;
-                asyncResp->res.jsonValue["DateTimeLocalOffset"] =
-                    redfishDateTimeOffset.second;
+            std::pair<std::string, std::string> redfishDateTimeOffset =
+                crow::utility::getDateTimeOffsetNow();
+            asyncResp->res.jsonValue["DateTime"] = redfishDateTimeOffset.first;
+            asyncResp->res.jsonValue["DateTimeLocalOffset"] =
+                redfishDateTimeOffset.second;
 
-                asyncResp->res.jsonValue["Actions"]["#LogService.ClearLog"] = {
-                    {"target",
-                     "/redfish/v1/Systems/system/LogServices/PostCodes/"
-                     "Actions/LogService.ClearLog"}};
-            });
+            asyncResp->res.jsonValue["Actions"]["#LogService.ClearLog"] = {
+                {"target",
+                 "/redfish/v1/Systems/system/LogServices/PostCodes/Actions/LogService.ClearLog"}};
+        });
 }
 
 inline void requestRoutesPostCodesClear(App& app)
 {
-    BMCWEB_ROUTE(app,
-                 "/redfish/v1/Systems/system/LogServices/PostCodes/Actions/"
-                 "LogService.ClearLog/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/PostCodes/Actions/LogService.ClearLog/")
         // The following privilege is incorrect;  It should be ConfigureManager
         //.privileges(redfish::privileges::postLogService)
         .privileges({{"ConfigureComponents"}})
@@ -3208,18 +3199,19 @@
         // add to AsyncResp
         logEntryArray.push_back({});
         nlohmann::json& bmcLogEntry = logEntryArray.back();
-        bmcLogEntry = {{"@odata.type", "#LogEntry.v1_8_0.LogEntry"},
-                       {"@odata.id", "/redfish/v1/Systems/system/LogServices/"
-                                     "PostCodes/Entries/" +
-                                         postcodeEntryID},
-                       {"Name", "POST Code Log Entry"},
-                       {"Id", postcodeEntryID},
-                       {"Message", std::move(msg)},
-                       {"MessageId", "OpenBMC.0.2.BIOSPOSTCode"},
-                       {"MessageArgs", std::move(messageArgs)},
-                       {"EntryType", "Event"},
-                       {"Severity", std::move(severity)},
-                       {"Created", entryTimeStr}};
+        bmcLogEntry = {
+            {"@odata.type", "#LogEntry.v1_8_0.LogEntry"},
+            {"@odata.id",
+             "/redfish/v1/Systems/system/LogServices/PostCodes/Entries/" +
+                 postcodeEntryID},
+            {"Name", "POST Code Log Entry"},
+            {"Id", postcodeEntryID},
+            {"Message", std::move(msg)},
+            {"MessageId", "OpenBMC.0.2.BIOSPOSTCode"},
+            {"MessageArgs", std::move(messageArgs)},
+            {"EntryType", "Event"},
+            {"Severity", std::move(severity)},
+            {"Created", entryTimeStr}};
         if (!std::get<std::vector<uint8_t>>(code.second).empty())
         {
             bmcLogEntry["AdditionalDataURI"] =
@@ -3309,8 +3301,7 @@
             else
             {
                 aResp->res.jsonValue["Members@odata.nextLink"] =
-                    "/redfish/v1/Systems/system/LogServices/PostCodes/"
-                    "Entries?$skip=" +
+                    "/redfish/v1/Systems/system/LogServices/PostCodes/Entries?$skip=" +
                     std::to_string(skip + top);
             }
         },
@@ -3425,8 +3416,9 @@
 
 inline void requestRoutesPostCodesEntryAdditionalData(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/LogServices/PostCodes/"
-                      "Entries/<str>/attachment/")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Systems/system/LogServices/PostCodes/Entries/<str>/attachment/")
         .privileges(redfish::privileges::getLogEntry)
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request& req,
@@ -3530,8 +3522,7 @@
                 asyncResp->res.jsonValue["@odata.type"] =
                     "#LogEntry.v1_4_0.LogEntry";
                 asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/Systems/system/LogServices/PostCodes/"
-                    "Entries";
+                    "/redfish/v1/Systems/system/LogServices/PostCodes/Entries";
                 asyncResp->res.jsonValue["Name"] = "BIOS POST Code Log Entries";
                 asyncResp->res.jsonValue["Description"] =
                     "Collection of POST Code Log Entries";
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 344ca83..12af99d 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -187,9 +187,9 @@
 
                 if (resetType != "ResetAll")
                 {
-                    BMCWEB_LOG_DEBUG << "Invalid property value for "
-                                        "ResetToDefaultsType: "
-                                     << resetType;
+                    BMCWEB_LOG_DEBUG
+                        << "Invalid property value for ResetToDefaultsType: "
+                        << resetType;
                     messages::actionParameterNotSupported(
                         asyncResp->res, resetType, "ResetToDefaultsType");
                     return;
@@ -276,8 +276,8 @@
                 asyncResp->res.jsonValue["Oem"]["OpenBmc"]["Fan"];
             nlohmann::json& fans = configRoot["FanControllers"];
             fans["@odata.type"] = "#OemManager.FanControllers";
-            fans["@odata.id"] = "/redfish/v1/Managers/bmc#/Oem/OpenBmc/"
-                                "Fan/FanControllers";
+            fans["@odata.id"] =
+                "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/FanControllers";
 
             nlohmann::json& pids = configRoot["PidControllers"];
             pids["@odata.type"] = "#OemManager.PidControllers";
@@ -373,9 +373,9 @@
                         nlohmann::json& zone = zones[name];
                         zone["Chassis"] = {
                             {"@odata.id", "/redfish/v1/Chassis/" + chassis}};
-                        zone["@odata.id"] = "/redfish/v1/Managers/bmc#/Oem/"
-                                            "OpenBmc/Fan/FanZones/" +
-                                            name;
+                        zone["@odata.id"] =
+                            "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/FanZones/" +
+                            name;
                         zone["@odata.type"] = "#OemManager.FanZone";
                         config = &zone;
                     }
@@ -393,8 +393,7 @@
                         config = &controller;
 
                         controller["@odata.id"] =
-                            "/redfish/v1/Managers/bmc#/Oem/"
-                            "OpenBmc/Fan/StepwiseControllers/" +
+                            "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/StepwiseControllers/" +
                             name;
                         controller["@odata.type"] =
                             "#OemManager.StepwiseController";
@@ -419,8 +418,7 @@
                         if (isFan)
                         {
                             element["@odata.id"] =
-                                "/redfish/v1/Managers/bmc#/Oem/"
-                                "OpenBmc/Fan/FanControllers/" +
+                                "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/FanControllers/" +
                                 name;
                             element["@odata.type"] =
                                 "#OemManager.FanController";
@@ -428,8 +426,7 @@
                         else
                         {
                             element["@odata.id"] =
-                                "/redfish/v1/Managers/bmc#/Oem/"
-                                "OpenBmc/Fan/PidControllers/" +
+                                "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/PidControllers/" +
                                 name;
                             element["@odata.type"] =
                                 "#OemManager.PidController";
@@ -500,8 +497,7 @@
                                     if (keys->size() != values->size())
                                     {
                                         BMCWEB_LOG_ERROR
-                                            << "Reading and Output size don't "
-                                               "match ";
+                                            << "Reading and Output size don't match ";
                                         messages::internalError(asyncResp->res);
                                         return;
                                     }
@@ -556,8 +552,7 @@
                                     dbus::utility::escapePathForDbus(itemCopy);
                                     data.push_back(
                                         {{"@odata.id",
-                                          "/redfish/v1/Managers/bmc#/Oem/"
-                                          "OpenBmc/Fan/FanZones/" +
+                                          "/redfish/v1/Managers/bmc#/Oem/OpenBmc/Fan/FanZones/" +
                                               itemCopy}});
                                 }
                             }
@@ -1190,9 +1185,9 @@
                                                       std::string>>& resp) {
                         if (ec2)
                         {
-                            BMCWEB_LOG_ERROR << "GetPIDValues: Can't get "
-                                                "thermalModeIface "
-                                             << path;
+                            BMCWEB_LOG_ERROR
+                                << "GetPIDValues: Can't get thermalModeIface "
+                                << path;
                             messages::internalError(self->asyncResp->res);
                             return;
                         }
@@ -1206,8 +1201,7 @@
                                 if (current == nullptr)
                                 {
                                     BMCWEB_LOG_ERROR
-                                        << "GetPIDValues: thermal mode "
-                                           "iface invalid "
+                                        << "GetPIDValues: thermal mode iface invalid "
                                         << path;
                                     messages::internalError(
                                         self->asyncResp->res);
@@ -1222,8 +1216,7 @@
                                 if (supported == nullptr)
                                 {
                                     BMCWEB_LOG_ERROR
-                                        << "GetPIDValues: thermal mode "
-                                           "iface invalid"
+                                        << "GetPIDValues: thermal mode iface invalid"
                                         << path;
                                     messages::internalError(
                                         self->asyncResp->res);
@@ -1233,9 +1226,9 @@
                         }
                         if (current == nullptr || supported == nullptr)
                         {
-                            BMCWEB_LOG_ERROR << "GetPIDValues: thermal mode "
-                                                "iface invalid "
-                                             << path;
+                            BMCWEB_LOG_ERROR
+                                << "GetPIDValues: thermal mode iface invalid "
+                                << path;
                             messages::internalError(self->asyncResp->res);
                             return;
                         }
@@ -1407,9 +1400,9 @@
                                                       std::string>>& r) {
                         if (ec2)
                         {
-                            BMCWEB_LOG_ERROR << "SetPIDValues: Can't get "
-                                                "thermalModeIface "
-                                             << path;
+                            BMCWEB_LOG_ERROR
+                                << "SetPIDValues: Can't get thermalModeIface "
+                                << path;
                             messages::internalError(self->asyncResp->res);
                             return;
                         }
@@ -1423,8 +1416,7 @@
                                 if (current == nullptr)
                                 {
                                     BMCWEB_LOG_ERROR
-                                        << "SetPIDValues: thermal mode "
-                                           "iface invalid "
+                                        << "SetPIDValues: thermal mode iface invalid "
                                         << path;
                                     messages::internalError(
                                         self->asyncResp->res);
@@ -1439,8 +1431,7 @@
                                 if (supported == nullptr)
                                 {
                                     BMCWEB_LOG_ERROR
-                                        << "SetPIDValues: thermal mode "
-                                           "iface invalid"
+                                        << "SetPIDValues: thermal mode iface invalid"
                                         << path;
                                     messages::internalError(
                                         self->asyncResp->res);
@@ -1450,9 +1441,9 @@
                         }
                         if (current == nullptr || supported == nullptr)
                         {
-                            BMCWEB_LOG_ERROR << "SetPIDValues: thermal mode "
-                                                "iface invalid "
-                                             << path;
+                            BMCWEB_LOG_ERROR
+                                << "SetPIDValues: thermal mode iface invalid "
+                                << path;
                             messages::internalError(self->asyncResp->res);
                             return;
                         }
@@ -1721,9 +1712,7 @@
                 *value;
         },
         connectionName, path, "org.freedesktop.DBus.Properties", "Get",
-        "xyz.openbmc_project.Inventory.Decorator."
-        "LocationCode",
-        "LocationCode");
+        "xyz.openbmc_project.Inventory.Decorator.LocationCode", "LocationCode");
 }
 // avoid name collision systems.hpp
 inline void
@@ -2168,12 +2157,11 @@
                                 },
                                 connectionName, path,
                                 "org.freedesktop.DBus.Properties", "GetAll",
-                                "xyz.openbmc_project.Inventory.Decorator."
-                                "Asset");
+                                "xyz.openbmc_project.Inventory.Decorator.Asset");
                         }
-                        else if (interfaceName ==
-                                 "xyz.openbmc_project.Inventory."
-                                 "Decorator.LocationCode")
+                        else if (
+                            interfaceName ==
+                            "xyz.openbmc_project.Inventory.Decorator.LocationCode")
                         {
                             getLocation(asyncResp, connectionName, path);
                         }
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index 5d508c4..90e54e8 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -75,8 +75,8 @@
     {
         return "DDR2_SDRAM_FB_DIMM";
     }
-    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_"
-                      "SDRAM_FB_DIMM_PROB")
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_SDRAM_FB_DIMM_PROB")
     {
         return "DDR2_SDRAM_FB_DIMM_PROBE";
     }
@@ -188,8 +188,8 @@
             if (value == nullptr)
             {
                 messages::internalError(aResp->res);
-                BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                    "VolatileRegionSizeLimitKiB";
+                BMCWEB_LOG_DEBUG
+                    << "Invalid property type for VolatileRegionSizeLimitKiB";
                 return;
             }
             aResp->res.jsonValue["VolatileRegionSizeLimitMiB"] = (*value) >> 10;
@@ -251,8 +251,8 @@
             if (value == nullptr)
             {
                 messages::internalError(aResp->res);
-                BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                    "VolatileRegionMaxSizeInKib";
+                BMCWEB_LOG_DEBUG
+                    << "Invalid property type for VolatileRegionMaxSizeInKib";
                 return;
             }
             aResp->res.jsonValue["VolatileRegionSizeMaxMiB"] = (*value) >> 10;
@@ -277,8 +277,8 @@
             if (value == nullptr)
             {
                 messages::internalError(aResp->res);
-                BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                    "AllocationIncrementInKiB";
+                BMCWEB_LOG_DEBUG
+                    << "Invalid property type for AllocationIncrementInKiB";
                 return;
             }
             aResp->res.jsonValue["AllocationIncrementMiB"] = (*value) >> 10;
@@ -290,8 +290,8 @@
             if (value == nullptr)
             {
                 messages::internalError(aResp->res);
-                BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                    "AllocationAlignmentInKiB";
+                BMCWEB_LOG_DEBUG
+                    << "Invalid property type for AllocationAlignmentInKiB";
                 return;
             }
             aResp->res.jsonValue["AllocationAlignmentMiB"] = (*value) >> 10;
@@ -353,8 +353,8 @@
             if (value == nullptr)
             {
                 messages::internalError(aResp->res);
-                BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                    "MaxAveragePowerLimitmW";
+                BMCWEB_LOG_DEBUG
+                    << "Invalid property type for MaxAveragePowerLimitmW";
                 return;
             }
             aResp->res.jsonValue["MaxTDPMilliWatts"] = *value;
@@ -860,9 +860,9 @@
                         // device, i.e.
                         // /xyz/openbmc_project/Inventory/Item/Dimm1/Partition1
                         // /xyz/openbmc_project/Inventory/Item/Dimm1/Partition2
-                        if (std::find(interfaces.begin(), interfaces.end(),
-                                      "xyz.openbmc_project.Inventory.Item."
-                                      "PersistentMemory.Partition") !=
+                        if (std::find(
+                                interfaces.begin(), interfaces.end(),
+                                "xyz.openbmc_project.Inventory.Item.PersistentMemory.Partition") !=
                             interfaces.end())
                         {
                             getDimmPartitionData(aResp, service, path);
diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index 43359e3..ae02189 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -34,8 +34,8 @@
     // because it has a duplicate entry for members
 
     asyncResp->res.jsonValue = {
-        {"@odata.type", "#MessageRegistryFileCollection."
-                        "MessageRegistryFileCollection"},
+        {"@odata.type",
+         "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
         {"@odata.id", "/redfish/v1/Registries"},
         {"Name", "MessageRegistryFile Collection"},
         {"Description", "Collection of MessageRegistryFiles"},
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index fc717e4..cb38633 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -235,9 +235,8 @@
                 !dbus::utility::getNthStringFromPath(uri, 3, chassis) ||
                 !dbus::utility::getNthStringFromPath(uri, 4, node))
             {
-                BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
-                                    "from "
-                                 << uri;
+                BMCWEB_LOG_ERROR
+                    << "Failed to get chassis and sensor Node from " << uri;
                 messages::propertyValueIncorrect(asyncResp->res, uri,
                                                  "MetricProperties/" +
                                                      std::to_string(i));
@@ -281,9 +280,9 @@
                 auto el = uriToDbus.find(uri);
                 if (el == uriToDbus.end())
                 {
-                    BMCWEB_LOG_ERROR << "Failed to find DBus sensor "
-                                        "corresponding to URI "
-                                     << uri;
+                    BMCWEB_LOG_ERROR
+                        << "Failed to find DBus sensor corresponding to URI "
+                        << uri;
                     messages::propertyValueNotInList(asyncResp->res, uri,
                                                      "MetricProperties/" +
                                                          std::to_string(i));
@@ -371,45 +370,45 @@
 
     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/MetricReportDefinitions/")
         .privileges(redfish::privileges::postMetricReportDefinitionCollection)
-        .methods(boost::beast::http::verb::post)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                telemetry::AddReportArgs args;
-                if (!telemetry::getUserParameters(asyncResp->res, req, args))
-                {
-                    return;
-                }
+        .methods(
+            boost::beast::http::verb::
+                post)([](const crow::Request& req,
+                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            telemetry::AddReportArgs args;
+            if (!telemetry::getUserParameters(asyncResp->res, req, args))
+            {
+                return;
+            }
 
-                boost::container::flat_set<std::pair<std::string, std::string>>
-                    chassisSensors;
-                if (!telemetry::getChassisSensorNode(asyncResp, args.metrics,
-                                                     chassisSensors))
-                {
-                    return;
-                }
+            boost::container::flat_set<std::pair<std::string, std::string>>
+                chassisSensors;
+            if (!telemetry::getChassisSensorNode(asyncResp, args.metrics,
+                                                 chassisSensors))
+            {
+                return;
+            }
 
-                auto addReportReq = std::make_shared<telemetry::AddReport>(
-                    std::move(args), asyncResp);
-                for (const auto& [chassis, sensorType] : chassisSensors)
-                {
-                    retrieveUriToDbusMap(
-                        chassis, sensorType,
-                        [asyncResp, addReportReq](
-                            const boost::beast::http::status status,
-                            const boost::container::flat_map<
-                                std::string, std::string>& uriToDbus) {
-                            if (status != boost::beast::http::status::ok)
-                            {
-                                BMCWEB_LOG_ERROR
-                                    << "Failed to retrieve URI to dbus "
-                                       "sensors map with err "
-                                    << static_cast<unsigned>(status);
-                                return;
-                            }
-                            addReportReq->insert(uriToDbus);
-                        });
-                }
-            });
+            auto addReportReq = std::make_shared<telemetry::AddReport>(
+                std::move(args), asyncResp);
+            for (const auto& [chassis, sensorType] : chassisSensors)
+            {
+                retrieveUriToDbusMap(
+                    chassis, sensorType,
+                    [asyncResp,
+                     addReportReq](const boost::beast::http::status status,
+                                   const boost::container::flat_map<
+                                       std::string, std::string>& uriToDbus) {
+                        if (status != boost::beast::http::status::ok)
+                        {
+                            BMCWEB_LOG_ERROR
+                                << "Failed to retrieve URI to dbus sensors map with err "
+                                << static_cast<unsigned>(status);
+                            return;
+                        }
+                        addReportReq->insert(uriToDbus);
+                    });
+            }
+        });
 }
 
 inline void requestRoutesMetricReportDefinition(App& app)
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index 3a769af..9acf5d4 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -380,8 +380,8 @@
             {
                 asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = true;
             }
-            else if (*s == "xyz.openbmc_project.Time.Synchronization."
-                           "Method.Manual")
+            else if (*s ==
+                     "xyz.openbmc_project.Time.Synchronization.Method.Manual")
             {
                 asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = false;
             }
@@ -395,88 +395,87 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/")
         .privileges(redfish::privileges::patchManagerNetworkProtocol)
-        .methods(boost::beast::http::verb::patch)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                std::optional<std::string> newHostName;
-                std::optional<nlohmann::json> ntp;
-                std::optional<nlohmann::json> ipmi;
-                std::optional<nlohmann::json> ssh;
+        .methods(
+            boost::beast::http::verb::
+                patch)([](const crow::Request& req,
+                          const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            std::optional<std::string> newHostName;
+            std::optional<nlohmann::json> ntp;
+            std::optional<nlohmann::json> ipmi;
+            std::optional<nlohmann::json> ssh;
 
-                if (!json_util::readJson(req, asyncResp->res, "NTP", ntp,
-                                         "HostName", newHostName, "IPMI", ipmi,
-                                         "SSH", ssh))
+            if (!json_util::readJson(req, asyncResp->res, "NTP", ntp,
+                                     "HostName", newHostName, "IPMI", ipmi,
+                                     "SSH", ssh))
+            {
+                return;
+            }
+
+            asyncResp->res.result(boost::beast::http::status::no_content);
+            if (newHostName)
+            {
+                messages::propertyNotWritable(asyncResp->res, "HostName");
+                return;
+            }
+
+            if (ntp)
+            {
+                std::optional<std::vector<std::string>> ntpServers;
+                std::optional<bool> ntpEnabled;
+                if (!json_util::readJson(*ntp, asyncResp->res, "NTPServers",
+                                         ntpServers, "ProtocolEnabled",
+                                         ntpEnabled))
                 {
                     return;
                 }
 
-                asyncResp->res.result(boost::beast::http::status::no_content);
-                if (newHostName)
+                if (ntpEnabled)
                 {
-                    messages::propertyNotWritable(asyncResp->res, "HostName");
+                    handleNTPProtocolEnabled(*ntpEnabled, asyncResp);
+                }
+
+                if (ntpServers)
+                {
+                    stl_utils::removeDuplicate(*ntpServers);
+                    handleNTPServersPatch(asyncResp, *ntpServers);
+                }
+            }
+
+            if (ipmi)
+            {
+                std::optional<bool> ipmiProtocolEnabled;
+                if (!json_util::readJson(*ipmi, asyncResp->res,
+                                         "ProtocolEnabled",
+                                         ipmiProtocolEnabled))
+                {
                     return;
                 }
 
-                if (ntp)
+                if (ipmiProtocolEnabled)
                 {
-                    std::optional<std::vector<std::string>> ntpServers;
-                    std::optional<bool> ntpEnabled;
-                    if (!json_util::readJson(*ntp, asyncResp->res, "NTPServers",
-                                             ntpServers, "ProtocolEnabled",
-                                             ntpEnabled))
-                    {
-                        return;
-                    }
+                    handleProtocolEnabled(
+                        *ipmiProtocolEnabled, asyncResp,
+                        "/xyz/openbmc_project/control/service/phosphor_2dipmi_2dnet_40");
+                }
+            }
 
-                    if (ntpEnabled)
-                    {
-                        handleNTPProtocolEnabled(*ntpEnabled, asyncResp);
-                    }
-
-                    if (ntpServers)
-                    {
-                        stl_utils::removeDuplicate(*ntpServers);
-                        handleNTPServersPatch(asyncResp, *ntpServers);
-                    }
+            if (ssh)
+            {
+                std::optional<bool> sshProtocolEnabled;
+                if (!json_util::readJson(*ssh, asyncResp->res,
+                                         "ProtocolEnabled", sshProtocolEnabled))
+                {
+                    return;
                 }
 
-                if (ipmi)
+                if (sshProtocolEnabled)
                 {
-                    std::optional<bool> ipmiProtocolEnabled;
-                    if (!json_util::readJson(*ipmi, asyncResp->res,
-                                             "ProtocolEnabled",
-                                             ipmiProtocolEnabled))
-                    {
-                        return;
-                    }
-
-                    if (ipmiProtocolEnabled)
-                    {
-                        handleProtocolEnabled(
-                            *ipmiProtocolEnabled, asyncResp,
-                            "/xyz/openbmc_project/control/service/"
-                            "phosphor_2dipmi_2dnet_40");
-                    }
+                    handleProtocolEnabled(
+                        *sshProtocolEnabled, asyncResp,
+                        "/xyz/openbmc_project/control/service/dropbear");
                 }
-
-                if (ssh)
-                {
-                    std::optional<bool> sshProtocolEnabled;
-                    if (!json_util::readJson(*ssh, asyncResp->res,
-                                             "ProtocolEnabled",
-                                             sshProtocolEnabled))
-                    {
-                        return;
-                    }
-
-                    if (sshProtocolEnabled)
-                    {
-                        handleProtocolEnabled(
-                            *sshProtocolEnabled, asyncResp,
-                            "/xyz/openbmc_project/control/service/dropbear");
-                    }
-                }
-            });
+            }
+        });
 
     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/")
         .privileges(redfish::privileges::getManagerNetworkProtocol)
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index bf33250..d7fb7dd 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -27,102 +27,99 @@
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     std::vector<nlohmann::json>& powerControlCollections)
 {
-    auto getChassisPath =
-        [sensorsAsyncResp, powerControlCollections](
-            const std::optional<std::string>& chassisPath) mutable {
-            if (!chassisPath)
+    auto getChassisPath = [sensorsAsyncResp, powerControlCollections](
+                              const std::optional<std::string>&
+                                  chassisPath) mutable {
+        if (!chassisPath)
+        {
+            BMCWEB_LOG_ERROR << "Don't find valid chassis path ";
+            messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
+                                       "Chassis", sensorsAsyncResp->chassisId);
+            return;
+        }
+
+        if (powerControlCollections.size() != 1)
+        {
+            BMCWEB_LOG_ERROR << "Don't support multiple hosts at present ";
+            messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
+                                       "Power", "PowerControl");
+            return;
+        }
+
+        auto& item = powerControlCollections[0];
+
+        std::optional<nlohmann::json> powerLimit;
+        if (!json_util::readJson(item, sensorsAsyncResp->asyncResp->res,
+                                 "PowerLimit", powerLimit))
+        {
+            return;
+        }
+        if (!powerLimit)
+        {
+            return;
+        }
+        std::optional<uint32_t> value;
+        if (!json_util::readJson(*powerLimit, sensorsAsyncResp->asyncResp->res,
+                                 "LimitInWatts", value))
+        {
+            return;
+        }
+        if (!value)
+        {
+            return;
+        }
+        auto valueHandler = [value, sensorsAsyncResp](
+                                const boost::system::error_code ec,
+                                const SensorVariant& powerCapEnable) {
+            if (ec)
             {
-                BMCWEB_LOG_ERROR << "Don't find valid chassis path ";
-                messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
-                                           "Chassis",
-                                           sensorsAsyncResp->chassisId);
+                messages::internalError(sensorsAsyncResp->asyncResp->res);
+                BMCWEB_LOG_ERROR << "powerCapEnable Get handler: Dbus error "
+                                 << ec;
+                return;
+            }
+            // Check PowerCapEnable
+            const bool* b = std::get_if<bool>(&powerCapEnable);
+            if (b == nullptr)
+            {
+                messages::internalError(sensorsAsyncResp->asyncResp->res);
+                BMCWEB_LOG_ERROR << "Fail to get PowerCapEnable status ";
+                return;
+            }
+            if (!(*b))
+            {
+                messages::actionNotSupported(
+                    sensorsAsyncResp->asyncResp->res,
+                    "Setting LimitInWatts when PowerLimit feature is disabled");
+                BMCWEB_LOG_ERROR << "PowerLimit feature is disabled ";
                 return;
             }
 
-            if (powerControlCollections.size() != 1)
-            {
-                BMCWEB_LOG_ERROR << "Don't support multiple hosts at present ";
-                messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
-                                           "Power", "PowerControl");
-                return;
-            }
-
-            auto& item = powerControlCollections[0];
-
-            std::optional<nlohmann::json> powerLimit;
-            if (!json_util::readJson(item, sensorsAsyncResp->asyncResp->res,
-                                     "PowerLimit", powerLimit))
-            {
-                return;
-            }
-            if (!powerLimit)
-            {
-                return;
-            }
-            std::optional<uint32_t> value;
-            if (!json_util::readJson(*powerLimit,
-                                     sensorsAsyncResp->asyncResp->res,
-                                     "LimitInWatts", value))
-            {
-                return;
-            }
-            if (!value)
-            {
-                return;
-            }
-            auto valueHandler = [value, sensorsAsyncResp](
-                                    const boost::system::error_code ec,
-                                    const SensorVariant& powerCapEnable) {
-                if (ec)
-                {
-                    messages::internalError(sensorsAsyncResp->asyncResp->res);
-                    BMCWEB_LOG_ERROR
-                        << "powerCapEnable Get handler: Dbus error " << ec;
-                    return;
-                }
-                // Check PowerCapEnable
-                const bool* b = std::get_if<bool>(&powerCapEnable);
-                if (b == nullptr)
-                {
-                    messages::internalError(sensorsAsyncResp->asyncResp->res);
-                    BMCWEB_LOG_ERROR << "Fail to get PowerCapEnable status ";
-                    return;
-                }
-                if (!(*b))
-                {
-                    messages::actionNotSupported(
-                        sensorsAsyncResp->asyncResp->res,
-                        "Setting LimitInWatts when PowerLimit "
-                        "feature is disabled");
-                    BMCWEB_LOG_ERROR << "PowerLimit feature is disabled ";
-                    return;
-                }
-
-                crow::connections::systemBus->async_method_call(
-                    [sensorsAsyncResp](const boost::system::error_code ec2) {
-                        if (ec2)
-                        {
-                            BMCWEB_LOG_DEBUG << "Power Limit Set: Dbus error: "
-                                             << ec2;
-                            messages::internalError(
-                                sensorsAsyncResp->asyncResp->res);
-                            return;
-                        }
-                        sensorsAsyncResp->asyncResp->res.result(
-                            boost::beast::http::status::no_content);
-                    },
-                    "xyz.openbmc_project.Settings",
-                    "/xyz/openbmc_project/control/host0/power_cap",
-                    "org.freedesktop.DBus.Properties", "Set",
-                    "xyz.openbmc_project.Control.Power.Cap", "PowerCap",
-                    std::variant<uint32_t>(*value));
-            };
             crow::connections::systemBus->async_method_call(
-                std::move(valueHandler), "xyz.openbmc_project.Settings",
+                [sensorsAsyncResp](const boost::system::error_code ec2) {
+                    if (ec2)
+                    {
+                        BMCWEB_LOG_DEBUG << "Power Limit Set: Dbus error: "
+                                         << ec2;
+                        messages::internalError(
+                            sensorsAsyncResp->asyncResp->res);
+                        return;
+                    }
+                    sensorsAsyncResp->asyncResp->res.result(
+                        boost::beast::http::status::no_content);
+                },
+                "xyz.openbmc_project.Settings",
                 "/xyz/openbmc_project/control/host0/power_cap",
-                "org.freedesktop.DBus.Properties", "Get",
-                "xyz.openbmc_project.Control.Power.Cap", "PowerCapEnable");
+                "org.freedesktop.DBus.Properties", "Set",
+                "xyz.openbmc_project.Control.Power.Cap", "PowerCap",
+                std::variant<uint32_t>(*value));
         };
+        crow::connections::systemBus->async_method_call(
+            std::move(valueHandler), "xyz.openbmc_project.Settings",
+            "/xyz/openbmc_project/control/host0/power_cap",
+            "org.freedesktop.DBus.Properties", "Get",
+            "xyz.openbmc_project.Control.Power.Cap", "PowerCapEnable");
+    };
     getValidChassisPath(sensorsAsyncResp, std::move(getChassisPath));
 }
 inline void requestRoutesPower(App& app)
diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index 59b7ff2..ec24735 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -591,8 +591,7 @@
                         },
                         service, dbusPath, "org.freedesktop.DBus.Properties",
                         "Get",
-                        "xyz.openbmc_project.Inventory.Item.Cpu."
-                        "OperatingConfig",
+                        "xyz.openbmc_project.Inventory.Item.Cpu.OperatingConfig",
                         "BaseSpeedPrioritySettings");
                 }
                 else if (dbusPropName == "BaseSpeedPriorityEnabled")
@@ -778,8 +777,8 @@
             {
                 getCpuAssetData(aResp, serviceName, objectPath);
             }
-            else if (interface == "xyz.openbmc_project.Inventory."
-                                  "Decorator.Revision")
+            else if (interface ==
+                     "xyz.openbmc_project.Inventory.Decorator.Revision")
             {
                 getCpuRevisionData(aResp, serviceName, objectPath);
             }
@@ -788,19 +787,20 @@
                 getCpuDataByService(aResp, processorId, serviceName,
                                     objectPath);
             }
-            else if (interface == "xyz.openbmc_project.Inventory."
-                                  "Item.Accelerator")
+            else if (interface ==
+                     "xyz.openbmc_project.Inventory.Item.Accelerator")
             {
                 getAcceleratorDataByService(aResp, processorId, serviceName,
                                             objectPath);
             }
-            else if (interface == "xyz.openbmc_project.Control.Processor."
-                                  "CurrentOperatingConfig")
+            else if (
+                interface ==
+                "xyz.openbmc_project.Control.Processor.CurrentOperatingConfig")
             {
                 getCpuConfigData(aResp, processorId, serviceName, objectPath);
             }
-            else if (interface == "xyz.openbmc_project.Inventory."
-                                  "Decorator.LocationCode")
+            else if (interface ==
+                     "xyz.openbmc_project.Inventory.Decorator.LocationCode")
             {
                 getCpuLocationCode(aResp, serviceName, objectPath);
             }
@@ -808,8 +808,8 @@
             {
                 getProcessorUUID(aResp, serviceName, objectPath);
             }
-            else if (interface == "xyz.openbmc_project.Inventory."
-                                  "Decorator.UniqueIdentifier")
+            else if (interface ==
+                     "xyz.openbmc_project.Inventory.Decorator.UniqueIdentifier")
             {
                 getCpuUniqueId(aResp, serviceName, objectPath);
             }
@@ -1068,61 +1068,58 @@
     BMCWEB_ROUTE(
         app, "/redfish/v1/Systems/system/Processors/<str>/OperatingConfigs/")
         .privileges(redfish::privileges::getOperatingConfigCollection)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-               const std::string& cpuName) {
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#OperatingConfigCollection.OperatingConfigCollection";
-                asyncResp->res.jsonValue["@odata.id"] = req.url;
-                asyncResp->res.jsonValue["Name"] =
-                    "Operating Config Collection";
+        .methods(
+            boost::beast::http::verb::get)([](const crow::Request& req,
+                                              const std::shared_ptr<
+                                                  bmcweb::AsyncResp>& asyncResp,
+                                              const std::string& cpuName) {
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#OperatingConfigCollection.OperatingConfigCollection";
+            asyncResp->res.jsonValue["@odata.id"] = req.url;
+            asyncResp->res.jsonValue["Name"] = "Operating Config Collection";
 
-                // First find the matching CPU object so we know how to
-                // constrain our search for related Config objects.
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp,
-                     cpuName](const boost::system::error_code ec,
-                              const std::vector<std::string>& objects) {
-                        if (ec)
+            // First find the matching CPU object so we know how to
+            // constrain our search for related Config objects.
+            crow::connections::systemBus->async_method_call(
+                [asyncResp, cpuName](const boost::system::error_code ec,
+                                     const std::vector<std::string>& objects) {
+                    if (ec)
+                    {
+                        BMCWEB_LOG_WARNING << "D-Bus error: " << ec << ", "
+                                           << ec.message();
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+
+                    for (const std::string& object : objects)
+                    {
+                        if (!boost::ends_with(object, cpuName))
                         {
-                            BMCWEB_LOG_WARNING << "D-Bus error: " << ec << ", "
-                                               << ec.message();
-                            messages::internalError(asyncResp->res);
-                            return;
+                            continue;
                         }
 
-                        for (const std::string& object : objects)
-                        {
-                            if (!boost::ends_with(object, cpuName))
-                            {
-                                continue;
-                            }
+                        // Not expected that there will be multiple matching
+                        // CPU objects, but if there are just use the first
+                        // one.
 
-                            // Not expected that there will be multiple matching
-                            // CPU objects, but if there are just use the first
-                            // one.
-
-                            // Use the common search routine to construct the
-                            // Collection of all Config objects under this CPU.
-                            collection_util::getCollectionMembers(
-                                asyncResp,
-                                "/redfish/v1/Systems/system/Processors/" +
-                                    cpuName + "/OperatingConfigs",
-                                {"xyz.openbmc_project.Inventory.Item.Cpu."
-                                 "OperatingConfig"},
-                                object.c_str());
-                            return;
-                        }
-                    },
-                    "xyz.openbmc_project.ObjectMapper",
-                    "/xyz/openbmc_project/object_mapper",
-                    "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
-                    "/xyz/openbmc_project/inventory", 0,
-                    std::array<const char*, 1>{
-                        "xyz.openbmc_project.Control.Processor."
-                        "CurrentOperatingConfig"});
-            });
+                        // Use the common search routine to construct the
+                        // Collection of all Config objects under this CPU.
+                        collection_util::getCollectionMembers(
+                            asyncResp,
+                            "/redfish/v1/Systems/system/Processors/" + cpuName +
+                                "/OperatingConfigs",
+                            {"xyz.openbmc_project.Inventory.Item.Cpu.OperatingConfig"},
+                            object.c_str());
+                        return;
+                    }
+                },
+                "xyz.openbmc_project.ObjectMapper",
+                "/xyz/openbmc_project/object_mapper",
+                "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
+                "/xyz/openbmc_project/inventory", 0,
+                std::array<const char*, 1>{
+                    "xyz.openbmc_project.Control.Processor.CurrentOperatingConfig"});
+        });
 }
 
 inline void requestRoutesOperatingConfig(App& app)
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index af9f466..6257dce 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -1251,8 +1251,7 @@
                                 {
 
                                     BMCWEB_LOG_ERROR
-                                        << "Invalid redundancy interface "
-                                           "types";
+                                        << "Invalid redundancy interface types";
                                     messages::internalError(
                                         sensorsAsyncResp->asyncResp->res);
                                     return;
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index 80e6059..b83e13f 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -152,8 +152,7 @@
                         storageController["@odata.type"] =
                             "#Storage.v1_7_0.StorageController";
                         storageController["@odata.id"] =
-                            "/redfish/v1/Systems/system/Storage/1"
-                            "#/StorageControllers/" +
+                            "/redfish/v1/Systems/system/Storage/1#/StorageControllers/" +
                             std::to_string(index);
                         storageController["Name"] = id;
                         storageController["MemberId"] = id;
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index fc9ad81..2f88a77 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -348,16 +348,13 @@
                                             if (value == nullptr)
                                             {
                                                 BMCWEB_LOG_DEBUG
-                                                    << "Find incorrect type of "
-                                                       "MemorySize";
+                                                    << "Find incorrect type of MemorySize";
                                                 continue;
                                             }
                                             nlohmann::json& totalMemory =
-                                                aResp->res
-                                                    .jsonValue["MemorySummar"
-                                                               "y"]
-                                                              ["TotalSystemMe"
-                                                               "moryGiB"];
+                                                aResp->res.jsonValue
+                                                    ["MemorySummary"]
+                                                    ["TotalSystemMemoryGiB"];
                                             uint64_t* preValue =
                                                 totalMemory
                                                     .get_ptr<uint64_t*>();
@@ -365,10 +362,9 @@
                                             {
                                                 continue;
                                             }
-                                            aResp->res
-                                                .jsonValue["MemorySummary"]
-                                                          ["TotalSystemMemoryGi"
-                                                           "B"] =
+                                            aResp->res.jsonValue
+                                                ["MemorySummary"]
+                                                ["TotalSystemMemoryGiB"] =
                                                 *value / (1024 * 1024) +
                                                 *preValue;
                                             aResp->res
@@ -388,8 +384,7 @@
                                                 if (ec3)
                                                 {
                                                     BMCWEB_LOG_ERROR
-                                                        << "DBUS response "
-                                                           "error "
+                                                        << "DBUS response error "
                                                         << ec3;
                                                     return;
                                                 }
@@ -400,11 +395,9 @@
                                             ->async_method_call(
                                                 std::move(getDimmProperties),
                                                 service, path,
-                                                "org.freedesktop.DBus."
-                                                "Properties",
+                                                "org.freedesktop.DBus.Properties",
                                                 "Get",
-                                                "xyz.openbmc_project.State."
-                                                "Decorator.OperationalStatus",
+                                                "xyz.openbmc_project.State.Decorator.OperationalStatus",
                                                 "Functional");
                                     }
                                 },
@@ -526,8 +519,7 @@
                                 },
                                 connection.first, path,
                                 "org.freedesktop.DBus.Properties", "GetAll",
-                                "xyz.openbmc_project.Inventory.Decorator."
-                                "Asset");
+                                "xyz.openbmc_project.Inventory.Decorator.Asset");
 
                             crow::connections::systemBus->async_method_call(
                                 [aResp](
@@ -550,8 +542,7 @@
                                 },
                                 connection.first, path,
                                 "org.freedesktop.DBus.Properties", "Get",
-                                "xyz.openbmc_project.Inventory.Decorator."
-                                "AssetTag",
+                                "xyz.openbmc_project.Inventory.Decorator.AssetTag",
                                 "AssetTag");
                         }
                     }
@@ -601,26 +592,29 @@
                     aResp->res.jsonValue["PowerState"] = "On";
                     aResp->res.jsonValue["Status"]["State"] = "Enabled";
                 }
-                else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                               "Quiesced")
+                else if (*s ==
+                         "xyz.openbmc_project.State.Host.HostState.Quiesced")
                 {
                     aResp->res.jsonValue["PowerState"] = "On";
                     aResp->res.jsonValue["Status"]["State"] = "Quiesced";
                 }
-                else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                               "DiagnosticMode")
+                else if (
+                    *s ==
+                    "xyz.openbmc_project.State.Host.HostState.DiagnosticMode")
                 {
                     aResp->res.jsonValue["PowerState"] = "On";
                     aResp->res.jsonValue["Status"]["State"] = "InTest";
                 }
-                else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                               "TransitioningToRunning")
+                else if (
+                    *s ==
+                    "xyz.openbmc_project.State.Host.HostState.TransitioningToRunning")
                 {
                     aResp->res.jsonValue["PowerState"] = "PoweringOn";
                     aResp->res.jsonValue["Status"]["State"] = "Starting";
                 }
-                else if (*s == "xyz.openbmc_project.State.Host.HostState."
-                               "TransitioningToOff")
+                else if (
+                    *s ==
+                    "xyz.openbmc_project.State.Host.HostState.TransitioningToOff")
                 {
                     aResp->res.jsonValue["PowerState"] = "PoweringOff";
                     aResp->res.jsonValue["Status"]["State"] = "Disabled";
@@ -766,9 +760,9 @@
     }
     else
     {
-        BMCWEB_LOG_DEBUG << "Invalid property value for "
-                            "BootSourceOverrideTarget: "
-                         << bootSource;
+        BMCWEB_LOG_DEBUG
+            << "Invalid property value for BootSourceOverrideTarget: "
+            << bootSource;
         messages::propertyValueNotInList(aResp->res, rfSource,
                                          "BootSourceTargetOverride");
         return -1;
@@ -811,56 +805,56 @@
             // Now convert the D-Bus BootProgress to the appropriate Redfish
             // enum
             std::string rfBpLastState = "None";
-            if (*bootProgressStr == "xyz.openbmc_project.State.Boot.Progress."
-                                    "ProgressStages.Unspecified")
+            if (*bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.Unspecified")
             {
                 rfBpLastState = "None";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "PrimaryProcInit")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.PrimaryProcInit")
             {
                 rfBpLastState = "PrimaryProcessorInitializationStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "BusInit")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.BusInit")
             {
                 rfBpLastState = "BusInitializationStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "MemoryInit")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.MemoryInit")
             {
                 rfBpLastState = "MemoryInitializationStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "SecondaryProcInit")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.SecondaryProcInit")
             {
                 rfBpLastState = "SecondaryProcessorInitializationStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "PCIInit")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.PCIInit")
             {
                 rfBpLastState = "PCIResourceConfigStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "SystemInitComplete")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.SystemInitComplete")
             {
                 rfBpLastState = "SystemHardwareInitializationComplete";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "OSStart")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart")
             {
                 rfBpLastState = "OSBootStarted";
             }
-            else if (*bootProgressStr ==
-                     "xyz.openbmc_project.State.Boot.Progress.ProgressStages."
-                     "OSRunning")
+            else if (
+                *bootProgressStr ==
+                "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSRunning")
             {
                 rfBpLastState = "OSRunning";
             }
@@ -908,9 +902,10 @@
 
             BMCWEB_LOG_DEBUG << "Boot type: " << *bootTypeStr;
 
-            aResp->res.jsonValue["Boot"]["BootSourceOverrideMode@Redfish."
-                                         "AllowableValues"] = {"Legacy",
-                                                               "UEFI"};
+            aResp->res
+                .jsonValue["Boot"]
+                          ["BootSourceOverrideMode@Redfish.AllowableValues"] = {
+                "Legacy", "UEFI"};
 
             auto rfType = dbusToRfBootType(*bootTypeStr);
             if (rfType.empty())
@@ -958,9 +953,10 @@
 
             BMCWEB_LOG_DEBUG << "Boot mode: " << *bootModeStr;
 
-            aResp->res.jsonValue["Boot"]["BootSourceOverrideTarget@Redfish."
-                                         "AllowableValues"] = {
-                "None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup", "Usb"};
+            aResp->res
+                .jsonValue["Boot"]
+                          ["BootSourceOverrideTarget@Redfish.AllowableValues"] =
+                {"None", "Pxe", "Hdd", "Cd", "Diags", "BiosSetup", "Usb"};
 
             if (*bootModeStr !=
                 "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular")
@@ -1269,9 +1265,10 @@
             // "AutomaticRetryConfig" can be 3 values, Disabled, RetryAlways,
             // and RetryAttempts. OpenBMC only supports Disabled and
             // RetryAttempts.
-            aResp->res.jsonValue["Boot"]["AutomaticRetryConfig@Redfish."
-                                         "AllowableValues"] = {"Disabled",
-                                                               "RetryAttempts"};
+            aResp->res
+                .jsonValue["Boot"]
+                          ["AutomaticRetryConfig@Redfish.AllowableValues"] = {
+                "Disabled", "RetryAttempts"};
         },
         "xyz.openbmc_project.Settings",
         "/xyz/openbmc_project/control/host0/auto_reboot",
@@ -1300,17 +1297,13 @@
                 return;
             }
 
-            const boost::container::flat_map<std::string, std::string>
-                policyMaps = {
-                    {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                     "AlwaysOn",
-                     "AlwaysOn"},
-                    {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                     "AlwaysOff",
-                     "AlwaysOff"},
-                    {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                     "Restore",
-                     "LastState"}};
+            const boost::container::flat_map<std::string, std::string> policyMaps = {
+                {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn",
+                 "AlwaysOn"},
+                {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff",
+                 "AlwaysOff"},
+                {"xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore",
+                 "LastState"}};
 
             const std::string* policyPtr = std::get_if<std::string>(&policy);
 
@@ -1507,9 +1500,9 @@
                 [aResp](const boost::system::error_code ec) {
                     if (ec)
                     {
-                        BMCWEB_LOG_DEBUG << "DBUS response error: Set "
-                                            "TrustedModuleRequiredToBoot"
-                                         << ec;
+                        BMCWEB_LOG_DEBUG
+                            << "DBUS response error: Set TrustedModuleRequiredToBoot"
+                            << ec;
                         messages::internalError(aResp->res);
                         return;
                     }
@@ -1624,9 +1617,9 @@
     }
     else
     {
-        BMCWEB_LOG_DEBUG << "Invalid property value for "
-                            "BootSourceOverrideEnabled: "
-                         << *bootEnable;
+        BMCWEB_LOG_DEBUG
+            << "Invalid property value for BootSourceOverrideEnabled: "
+            << *bootEnable;
         messages::propertyValueNotInList(aResp->res, *bootEnable,
                                          "BootSourceOverrideEnabled");
         return;
@@ -1873,8 +1866,7 @@
     }
     else
     {
-        BMCWEB_LOG_DEBUG << "Invalid property value for "
-                            "AutomaticRetryConfig: "
+        BMCWEB_LOG_DEBUG << "Invalid property value for AutomaticRetryConfig: "
                          << automaticRetryConfig;
         messages::propertyValueNotInList(aResp->res, automaticRetryConfig,
                                          "AutomaticRetryConfig");
@@ -1911,12 +1903,12 @@
     BMCWEB_LOG_DEBUG << "Set power restore policy.";
 
     const boost::container::flat_map<std::string, std::string> policyMaps = {
-        {"AlwaysOn", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                     "AlwaysOn"},
-        {"AlwaysOff", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                      "AlwaysOff"},
-        {"LastState", "xyz.openbmc_project.Control.Power.RestorePolicy.Policy."
-                      "Restore"}};
+        {"AlwaysOn",
+         "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn"},
+        {"AlwaysOff",
+         "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff"},
+        {"LastState",
+         "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore"}};
 
     std::string powerRestorPolicy;
 
@@ -2031,23 +2023,23 @@
 {
     std::string modeString;
 
-    if (modeValue == "xyz.openbmc_project.Control.Power.Mode."
-                     "PowerMode.Static")
+    if (modeValue == "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static")
     {
         aResp->res.jsonValue["PowerMode"] = "Static";
     }
-    else if (modeValue == "xyz.openbmc_project.Control.Power.Mode."
-                          "PowerMode.MaximumPerformance")
+    else if (
+        modeValue ==
+        "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance")
     {
         aResp->res.jsonValue["PowerMode"] = "MaximumPerformance";
     }
-    else if (modeValue == "xyz.openbmc_project.Control.Power.Mode."
-                          "PowerMode.PowerSaving")
+    else if (modeValue ==
+             "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving")
     {
         aResp->res.jsonValue["PowerMode"] = "PowerSaving";
     }
-    else if (modeValue == "xyz.openbmc_project.Control.Power.Mode."
-                          "PowerMode.OEM")
+    else if (modeValue ==
+             "xyz.openbmc_project.Control.Power.Mode.PowerMode.OEM")
     {
         aResp->res.jsonValue["PowerMode"] = "OEM";
     }
@@ -2172,8 +2164,8 @@
     }
     else if (modeString == "MaximumPerformance")
     {
-        mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode."
-               "MaximumPerformance";
+        mode =
+            "xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance";
     }
     else if (modeString == "PowerSaving")
     {
@@ -2694,9 +2686,9 @@
             {
                 // More then one PowerIdlePowerSaver object is not supported and
                 // is an error
-                BMCWEB_LOG_DEBUG << "Found more than 1 system D-Bus "
-                                    "Power.IdlePowerSaver objects: "
-                                 << subtree.size();
+                BMCWEB_LOG_DEBUG
+                    << "Found more than 1 system D-Bus Power.IdlePowerSaver objects: "
+                    << subtree.size();
                 messages::internalError(aResp->res);
                 return;
             }
@@ -2928,8 +2920,8 @@
             }
             else if (resetType == "GracefulRestart")
             {
-                command = "xyz.openbmc_project.State.Host.Transition."
-                          "GracefulWarmReboot";
+                command =
+                    "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot";
                 hostCommand = true;
             }
             else if (resetType == "PowerCycle")
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index e420130..f3987d4 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -56,8 +56,7 @@
         service, objPath, "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Software.Activation", "RequestedActivation",
         std::variant<std::string>(
-            "xyz.openbmc_project.Software.Activation.RequestedActivations."
-            "Active"));
+            "xyz.openbmc_project.Software.Activation.RequestedActivations.Active"));
 }
 
 // Note that asyncResp can be either a valid pointer or nullptr. If nullptr
@@ -143,8 +142,8 @@
                                         std::to_string(taskData->index);
                                     msg.read(iface, values);
 
-                                    if (iface == "xyz.openbmc_project.Software."
-                                                 "Activation")
+                                    if (iface ==
+                                        "xyz.openbmc_project.Software.Activation")
                                     {
                                         auto findActivation =
                                             values.find("Activation");
@@ -199,9 +198,9 @@
                                             return task::completed;
                                         }
                                     }
-                                    else if (iface ==
-                                             "xyz.openbmc_project.Software."
-                                             "ActivationProgress")
+                                    else if (
+                                        iface ==
+                                        "xyz.openbmc_project.Software.ActivationProgress")
                                     {
                                         auto findProgress =
                                             values.find("Progress");
@@ -238,8 +237,7 @@
 
                                     return !task::completed;
                                 },
-                                "type='signal',interface='org.freedesktop.DBus."
-                                "Properties',"
+                                "type='signal',interface='org.freedesktop.DBus.Properties',"
                                 "member='PropertiesChanged',path='" +
                                     objPath.str + "'");
                         task->startTimer(std::chrono::minutes(5));
@@ -347,8 +345,9 @@
                 redfish::messages::invalidUpload(asyncResp->res, url,
                                                  "Invalid archive");
             }
-            else if (*type == "xyz.openbmc_project.Software.Image.Error."
-                              "ManifestFileFailure")
+            else if (
+                *type ==
+                "xyz.openbmc_project.Software.Image.Error.ManifestFileFailure")
             {
                 redfish::messages::invalidUpload(asyncResp->res, url,
                                                  "Invalid manifest");
@@ -359,8 +358,8 @@
                 redfish::messages::invalidUpload(asyncResp->res, url,
                                                  "Invalid image format");
             }
-            else if (*type == "xyz.openbmc_project.Software.Version.Error."
-                              "AlreadyExists")
+            else if (*type ==
+                     "xyz.openbmc_project.Software.Version.Error.AlreadyExists")
             {
 
                 redfish::messages::invalidUpload(
@@ -559,16 +558,17 @@
                         return;
                     }
                     // Store the ApplyTime Value
-                    if (*s == "xyz.openbmc_project.Software.ApplyTime."
-                              "RequestedApplyTimes.Immediate")
+                    if (*s ==
+                        "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.Immediate")
                     {
                         asyncResp->res
                             .jsonValue["HttpPushUriOptions"]
                                       ["HttpPushUriApplyTime"]["ApplyTime"] =
                             "Immediate";
                     }
-                    else if (*s == "xyz.openbmc_project.Software.ApplyTime."
-                                   "RequestedApplyTimes.OnReset")
+                    else if (
+                        *s ==
+                        "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.OnReset")
                     {
                         asyncResp->res
                             .jsonValue["HttpPushUriOptions"]
@@ -583,86 +583,82 @@
         });
     BMCWEB_ROUTE(app, "/redfish/v1/UpdateService/")
         .privileges(redfish::privileges::patchUpdateService)
-        .methods(boost::beast::http::verb::patch)(
-            [](const crow::Request& req,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                BMCWEB_LOG_DEBUG << "doPatch...";
+        .methods(
+            boost::beast::http::verb::
+                patch)([](const crow::Request& req,
+                          const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            BMCWEB_LOG_DEBUG << "doPatch...";
 
-                std::optional<nlohmann::json> pushUriOptions;
-                if (!json_util::readJson(req, asyncResp->res,
-                                         "HttpPushUriOptions", pushUriOptions))
+            std::optional<nlohmann::json> pushUriOptions;
+            if (!json_util::readJson(req, asyncResp->res, "HttpPushUriOptions",
+                                     pushUriOptions))
+            {
+                return;
+            }
+
+            if (pushUriOptions)
+            {
+                std::optional<nlohmann::json> pushUriApplyTime;
+                if (!json_util::readJson(*pushUriOptions, asyncResp->res,
+                                         "HttpPushUriApplyTime",
+                                         pushUriApplyTime))
                 {
                     return;
                 }
 
-                if (pushUriOptions)
+                if (pushUriApplyTime)
                 {
-                    std::optional<nlohmann::json> pushUriApplyTime;
-                    if (!json_util::readJson(*pushUriOptions, asyncResp->res,
-                                             "HttpPushUriApplyTime",
-                                             pushUriApplyTime))
+                    std::optional<std::string> applyTime;
+                    if (!json_util::readJson(*pushUriApplyTime, asyncResp->res,
+                                             "ApplyTime", applyTime))
                     {
                         return;
                     }
 
-                    if (pushUriApplyTime)
+                    if (applyTime)
                     {
-                        std::optional<std::string> applyTime;
-                        if (!json_util::readJson(*pushUriApplyTime,
-                                                 asyncResp->res, "ApplyTime",
-                                                 applyTime))
+                        std::string applyTimeNewVal;
+                        if (applyTime == "Immediate")
                         {
+                            applyTimeNewVal =
+                                "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.Immediate";
+                        }
+                        else if (applyTime == "OnReset")
+                        {
+                            applyTimeNewVal =
+                                "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.OnReset";
+                        }
+                        else
+                        {
+                            BMCWEB_LOG_INFO
+                                << "ApplyTime value is not in the list of acceptable values";
+                            messages::propertyValueNotInList(
+                                asyncResp->res, *applyTime, "ApplyTime");
                             return;
                         }
 
-                        if (applyTime)
-                        {
-                            std::string applyTimeNewVal;
-                            if (applyTime == "Immediate")
-                            {
-                                applyTimeNewVal =
-                                    "xyz.openbmc_project.Software.ApplyTime."
-                                    "RequestedApplyTimes.Immediate";
-                            }
-                            else if (applyTime == "OnReset")
-                            {
-                                applyTimeNewVal =
-                                    "xyz.openbmc_project.Software.ApplyTime."
-                                    "RequestedApplyTimes.OnReset";
-                            }
-                            else
-                            {
-                                BMCWEB_LOG_INFO
-                                    << "ApplyTime value is not in the list of "
-                                       "acceptable values";
-                                messages::propertyValueNotInList(
-                                    asyncResp->res, *applyTime, "ApplyTime");
-                                return;
-                            }
-
-                            // Set the requested image apply time value
-                            crow::connections::systemBus->async_method_call(
-                                [asyncResp](
-                                    const boost::system::error_code ec) {
-                                    if (ec)
-                                    {
-                                        BMCWEB_LOG_ERROR
-                                            << "D-Bus responses error: " << ec;
-                                        messages::internalError(asyncResp->res);
-                                        return;
-                                    }
-                                    messages::success(asyncResp->res);
-                                },
-                                "xyz.openbmc_project.Settings",
-                                "/xyz/openbmc_project/software/apply_time",
-                                "org.freedesktop.DBus.Properties", "Set",
-                                "xyz.openbmc_project.Software.ApplyTime",
-                                "RequestedApplyTime",
-                                std::variant<std::string>{applyTimeNewVal});
-                        }
+                        // Set the requested image apply time value
+                        crow::connections::systemBus->async_method_call(
+                            [asyncResp](const boost::system::error_code ec) {
+                                if (ec)
+                                {
+                                    BMCWEB_LOG_ERROR
+                                        << "D-Bus responses error: " << ec;
+                                    messages::internalError(asyncResp->res);
+                                    return;
+                                }
+                                messages::success(asyncResp->res);
+                            },
+                            "xyz.openbmc_project.Settings",
+                            "/xyz/openbmc_project/software/apply_time",
+                            "org.freedesktop.DBus.Properties", "Set",
+                            "xyz.openbmc_project.Software.ApplyTime",
+                            "RequestedApplyTime",
+                            std::variant<std::string>{applyTimeNewVal});
                     }
                 }
-            });
+            }
+        });
     BMCWEB_ROUTE(app, "/redfish/v1/UpdateService/")
         .privileges(redfish::privileges::postUpdateService)
         .methods(boost::beast::http::verb::post)(
@@ -691,66 +687,66 @@
 {
     BMCWEB_ROUTE(app, "/redfish/v1/UpdateService/FirmwareInventory/")
         .privileges(redfish::privileges::getSoftwareInventoryCollection)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#SoftwareInventoryCollection.SoftwareInventoryCollection";
-                asyncResp->res.jsonValue["@odata.id"] =
-                    "/redfish/v1/UpdateService/FirmwareInventory";
-                asyncResp->res.jsonValue["Name"] =
-                    "Software Inventory Collection";
+        .methods(
+            boost::beast::http::verb::
+                get)([](const crow::Request&,
+                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+            asyncResp->res.jsonValue["@odata.type"] =
+                "#SoftwareInventoryCollection.SoftwareInventoryCollection";
+            asyncResp->res.jsonValue["@odata.id"] =
+                "/redfish/v1/UpdateService/FirmwareInventory";
+            asyncResp->res.jsonValue["Name"] = "Software Inventory Collection";
 
-                crow::connections::systemBus->async_method_call(
-                    [asyncResp](
-                        const boost::system::error_code ec,
-                        const std::vector<std::pair<
-                            std::string,
-                            std::vector<std::pair<std::string,
-                                                  std::vector<std::string>>>>>&
-                            subtree) {
-                        if (ec)
+            crow::connections::systemBus->async_method_call(
+                [asyncResp](
+                    const boost::system::error_code ec,
+                    const std::vector<
+                        std::pair<std::string,
+                                  std::vector<std::pair<
+                                      std::string, std::vector<std::string>>>>>&
+                        subtree) {
+                    if (ec)
+                    {
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+                    asyncResp->res.jsonValue["Members"] =
+                        nlohmann::json::array();
+                    asyncResp->res.jsonValue["Members@odata.count"] = 0;
+
+                    for (auto& obj : subtree)
+                    {
+                        sdbusplus::message::object_path path(obj.first);
+                        std::string swId = path.filename();
+                        if (swId.empty())
                         {
                             messages::internalError(asyncResp->res);
+                            BMCWEB_LOG_DEBUG << "Can't parse firmware ID!!";
                             return;
                         }
-                        asyncResp->res.jsonValue["Members"] =
-                            nlohmann::json::array();
-                        asyncResp->res.jsonValue["Members@odata.count"] = 0;
 
-                        for (auto& obj : subtree)
-                        {
-                            sdbusplus::message::object_path path(obj.first);
-                            std::string swId = path.filename();
-                            if (swId.empty())
-                            {
-                                messages::internalError(asyncResp->res);
-                                BMCWEB_LOG_DEBUG << "Can't parse firmware ID!!";
-                                return;
-                            }
-
-                            nlohmann::json& members =
-                                asyncResp->res.jsonValue["Members"];
-                            members.push_back(
-                                {{"@odata.id", "/redfish/v1/UpdateService/"
-                                               "FirmwareInventory/" +
-                                                   swId}});
-                            asyncResp->res.jsonValue["Members@odata.count"] =
-                                members.size();
-                        }
-                    },
-                    // Note that only firmware levels associated with a device
-                    // are stored under /xyz/openbmc_project/software therefore
-                    // to ensure only real FirmwareInventory items are returned,
-                    // this full object path must be used here as input to
-                    // mapper
-                    "xyz.openbmc_project.ObjectMapper",
-                    "/xyz/openbmc_project/object_mapper",
-                    "xyz.openbmc_project.ObjectMapper", "GetSubTree",
-                    "/xyz/openbmc_project/software", static_cast<int32_t>(0),
-                    std::array<const char*, 1>{
-                        "xyz.openbmc_project.Software.Version"});
-            });
+                        nlohmann::json& members =
+                            asyncResp->res.jsonValue["Members"];
+                        members.push_back(
+                            {{"@odata.id",
+                              "/redfish/v1/UpdateService/FirmwareInventory/" +
+                                  swId}});
+                        asyncResp->res.jsonValue["Members@odata.count"] =
+                            members.size();
+                    }
+                },
+                // Note that only firmware levels associated with a device
+                // are stored under /xyz/openbmc_project/software therefore
+                // to ensure only real FirmwareInventory items are returned,
+                // this full object path must be used here as input to
+                // mapper
+                "xyz.openbmc_project.ObjectMapper",
+                "/xyz/openbmc_project/object_mapper",
+                "xyz.openbmc_project.ObjectMapper", "GetSubTree",
+                "/xyz/openbmc_project/software", static_cast<int32_t>(0),
+                std::array<const char*, 1>{
+                    "xyz.openbmc_project.Software.Version"});
+        });
 }
 /* Fill related item links (i.e. bmc, bios) in for inventory */
 inline static void
@@ -853,8 +849,8 @@
                                     std::get_if<std::string>(&it->second);
                                 if (swInvPurpose == nullptr)
                                 {
-                                    BMCWEB_LOG_DEBUG << "wrong types for "
-                                                        "property\"Purpose\"!";
+                                    BMCWEB_LOG_DEBUG
+                                        << "wrong types for property\"Purpose\"!";
                                     messages::propertyValueTypeError(
                                         asyncResp->res, "", "Purpose");
                                     return;
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index 7383477..64f9a4c 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -777,8 +777,9 @@
 
 inline void requestNBDVirtualMediaRoutes(App& app)
 {
-    BMCWEB_ROUTE(app, "/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/"
-                      "VirtualMedia.InsertMedia")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/VirtualMedia.InsertMedia")
         .privileges(redfish::privileges::postVirtualMedia)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
@@ -922,8 +923,9 @@
                     std::array<const char*, 0>());
             });
 
-    BMCWEB_ROUTE(app, "/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/"
-                      "VirtualMedia.EjectMedia")
+    BMCWEB_ROUTE(
+        app,
+        "/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/VirtualMedia.EjectMedia")
         .privileges(redfish::privileges::postVirtualMedia)
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
