diff --git a/include/async_resolve.hpp b/include/async_resolve.hpp
index 87f53a0..8a5cc4e 100644
--- a/include/async_resolve.hpp
+++ b/include/async_resolve.hpp
@@ -37,53 +37,52 @@
                 const std::vector<
                     std::tuple<int32_t, int32_t, std::vector<uint8_t>>>& resp,
                 const std::string& hostName, const uint64_t flagNum) {
-                std::vector<boost::asio::ip::tcp::endpoint> endpointList;
-                if (ec)
+            std::vector<boost::asio::ip::tcp::endpoint> endpointList;
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "Resolve failed: " << ec.message();
+                handler(ec, endpointList);
+                return;
+            }
+            BMCWEB_LOG_DEBUG << "ResolveHostname returned: " << hostName << ":"
+                             << flagNum;
+            // Extract the IP address from the response
+            for (auto resolveList : resp)
+            {
+                std::vector<uint8_t> ipAddress = std::get<2>(resolveList);
+                boost::asio::ip::tcp::endpoint endpoint;
+                if (ipAddress.size() == 4) // ipv4 address
                 {
-                    BMCWEB_LOG_ERROR << "Resolve failed: " << ec.message();
+                    BMCWEB_LOG_DEBUG << "ipv4 address";
+                    boost::asio::ip::address_v4 ipv4Addr(
+                        {ipAddress[0], ipAddress[1], ipAddress[2],
+                         ipAddress[3]});
+                    endpoint.address(ipv4Addr);
+                }
+                else if (ipAddress.size() == 16) // ipv6 address
+                {
+                    BMCWEB_LOG_DEBUG << "ipv6 address";
+                    boost::asio::ip::address_v6 ipv6Addr(
+                        {ipAddress[0], ipAddress[1], ipAddress[2], ipAddress[3],
+                         ipAddress[4], ipAddress[5], ipAddress[6], ipAddress[7],
+                         ipAddress[8], ipAddress[9], ipAddress[10],
+                         ipAddress[11], ipAddress[12], ipAddress[13],
+                         ipAddress[14], ipAddress[15]});
+                    endpoint.address(ipv6Addr);
+                }
+                else
+                {
+                    BMCWEB_LOG_ERROR
+                        << "Resolve failed to fetch the IP address";
                     handler(ec, endpointList);
                     return;
                 }
-                BMCWEB_LOG_DEBUG << "ResolveHostname returned: " << hostName
-                                 << ":" << flagNum;
-                // Extract the IP address from the response
-                for (auto resolveList : resp)
-                {
-                    std::vector<uint8_t> ipAddress = std::get<2>(resolveList);
-                    boost::asio::ip::tcp::endpoint endpoint;
-                    if (ipAddress.size() == 4) // ipv4 address
-                    {
-                        BMCWEB_LOG_DEBUG << "ipv4 address";
-                        boost::asio::ip::address_v4 ipv4Addr(
-                            {ipAddress[0], ipAddress[1], ipAddress[2],
-                             ipAddress[3]});
-                        endpoint.address(ipv4Addr);
-                    }
-                    else if (ipAddress.size() == 16) // ipv6 address
-                    {
-                        BMCWEB_LOG_DEBUG << "ipv6 address";
-                        boost::asio::ip::address_v6 ipv6Addr(
-                            {ipAddress[0], ipAddress[1], ipAddress[2],
-                             ipAddress[3], ipAddress[4], ipAddress[5],
-                             ipAddress[6], ipAddress[7], ipAddress[8],
-                             ipAddress[9], ipAddress[10], ipAddress[11],
-                             ipAddress[12], ipAddress[13], ipAddress[14],
-                             ipAddress[15]});
-                        endpoint.address(ipv6Addr);
-                    }
-                    else
-                    {
-                        BMCWEB_LOG_ERROR
-                            << "Resolve failed to fetch the IP address";
-                        handler(ec, endpointList);
-                        return;
-                    }
-                    endpoint.port(port);
-                    BMCWEB_LOG_DEBUG << "resolved endpoint is : " << endpoint;
-                    endpointList.push_back(endpoint);
-                }
-                // All the resolved data is filled in the endpointList
-                handler(ec, endpointList);
+                endpoint.port(port);
+                BMCWEB_LOG_DEBUG << "resolved endpoint is : " << endpoint;
+                endpointList.push_back(endpoint);
+            }
+            // All the resolved data is filled in the endpointList
+            handler(ec, endpointList);
             },
             "org.freedesktop.resolve1", "/org/freedesktop/resolve1",
             "org.freedesktop.resolve1.Manager", "ResolveHostname", 0, host,
diff --git a/include/cors_preflight.hpp b/include/cors_preflight.hpp
index 29d7475..ae88325 100644
--- a/include/cors_preflight.hpp
+++ b/include/cors_preflight.hpp
@@ -12,8 +12,8 @@
         .methods(boost::beast::http::verb::options)(
             [](const crow::Request& /*req*/,
                const std::shared_ptr<bmcweb::AsyncResp>&, const std::string&) {
-                // An empty body handler that simply returns the headers bmcweb
-                // uses This allows browsers to do their CORS preflight checks
-            });
+        // An empty body handler that simply returns the headers bmcweb
+        // uses This allows browsers to do their CORS preflight checks
+        });
 }
 } // namespace cors_preflight
diff --git a/include/dbus_monitor.hpp b/include/dbus_monitor.hpp
index 977f3a3..ce0550d 100644
--- a/include/dbus_monitor.hpp
+++ b/include/dbus_monitor.hpp
@@ -117,138 +117,136 @@
         .onclose([&](crow::websocket::Connection& conn, const std::string&) {
             sessions.erase(&conn);
         })
-        .onmessage([&](crow::websocket::Connection& conn,
-                       const std::string& data, bool) {
-            const auto sessionPair = sessions.find(&conn);
-            if (sessionPair == sessions.end())
+        .onmessage(
+            [&](crow::websocket::Connection& conn, const std::string& data,
+                bool) {
+        const auto sessionPair = sessions.find(&conn);
+        if (sessionPair == sessions.end())
+        {
+            conn.close("Internal error");
+        }
+        DbusWebsocketSession& thisSession = sessionPair->second;
+        BMCWEB_LOG_DEBUG << "Connection " << &conn << " received " << data;
+        nlohmann::json j = nlohmann::json::parse(data, nullptr, false);
+        if (j.is_discarded())
+        {
+            BMCWEB_LOG_ERROR << "Unable to parse json data for monitor";
+            conn.close("Unable to parse json request");
+            return;
+        }
+        nlohmann::json::iterator interfaces = j.find("interfaces");
+        if (interfaces != j.end())
+        {
+            thisSession.interfaces.reserve(interfaces->size());
+            for (auto& interface : *interfaces)
             {
-                conn.close("Internal error");
+                const std::string* str =
+                    interface.get_ptr<const std::string*>();
+                if (str != nullptr)
+                {
+                    thisSession.interfaces.insert(*str);
+                }
             }
-            DbusWebsocketSession& thisSession = sessionPair->second;
-            BMCWEB_LOG_DEBUG << "Connection " << &conn << " received " << data;
-            nlohmann::json j = nlohmann::json::parse(data, nullptr, false);
-            if (j.is_discarded())
+        }
+
+        nlohmann::json::iterator paths = j.find("paths");
+        if (paths == j.end())
+        {
+            BMCWEB_LOG_ERROR << "Unable to find paths in json data";
+            conn.close("Unable to find paths in json data");
+            return;
+        }
+
+        size_t interfaceCount = thisSession.interfaces.size();
+        if (interfaceCount == 0)
+        {
+            interfaceCount = 1;
+        }
+        // Reserve our matches upfront.  For each path there is 1 for
+        // interfacesAdded, and InterfaceCount number for
+        // PropertiesChanged
+        thisSession.matches.reserve(thisSession.matches.size() +
+                                    paths->size() * (1U + interfaceCount));
+        std::string objectManagerMatchString;
+        std::string propertiesMatchString;
+        std::string objectManagerInterfacesMatchString;
+        // These regexes derived on the rules here:
+        // https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
+        std::regex validPath("^/([A-Za-z0-9_]+/?)*$");
+        std::regex validInterface(
+            "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$");
+
+        for (const auto& thisPath : *paths)
+        {
+            const std::string* thisPathString =
+                thisPath.get_ptr<const std::string*>();
+            if (thisPathString == nullptr)
             {
-                BMCWEB_LOG_ERROR << "Unable to parse json data for monitor";
-                conn.close("Unable to parse json request");
+                BMCWEB_LOG_ERROR << "subscribe path isn't a string?";
+                conn.close();
                 return;
             }
-            nlohmann::json::iterator interfaces = j.find("interfaces");
-            if (interfaces != j.end())
+            if (!std::regex_match(*thisPathString, validPath))
             {
-                thisSession.interfaces.reserve(interfaces->size());
-                for (auto& interface : *interfaces)
-                {
-                    const std::string* str =
-                        interface.get_ptr<const std::string*>();
-                    if (str != nullptr)
-                    {
-                        thisSession.interfaces.insert(*str);
-                    }
-                }
-            }
-
-            nlohmann::json::iterator paths = j.find("paths");
-            if (paths == j.end())
-            {
-                BMCWEB_LOG_ERROR << "Unable to find paths in json data";
-                conn.close("Unable to find paths in json data");
+                BMCWEB_LOG_ERROR << "Invalid path name " << *thisPathString;
+                conn.close();
                 return;
             }
-
-            size_t interfaceCount = thisSession.interfaces.size();
-            if (interfaceCount == 0)
+            propertiesMatchString =
+                ("type='signal',"
+                 "interface='org.freedesktop.DBus.Properties',"
+                 "path_namespace='" +
+                 *thisPathString +
+                 "',"
+                 "member='PropertiesChanged'");
+            // If interfaces weren't specified, add a single match for all
+            // interfaces
+            if (thisSession.interfaces.empty())
             {
-                interfaceCount = 1;
-            }
-            // Reserve our matches upfront.  For each path there is 1 for
-            // interfacesAdded, and InterfaceCount number for
-            // PropertiesChanged
-            thisSession.matches.reserve(thisSession.matches.size() +
-                                        paths->size() * (1U + interfaceCount));
-            std::string objectManagerMatchString;
-            std::string propertiesMatchString;
-            std::string objectManagerInterfacesMatchString;
-            // These regexes derived on the rules here:
-            // https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
-            std::regex validPath("^/([A-Za-z0-9_]+/?)*$");
-            std::regex validInterface(
-                "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$");
+                BMCWEB_LOG_DEBUG << "Creating match " << propertiesMatchString;
 
-            for (const auto& thisPath : *paths)
-            {
-                const std::string* thisPathString =
-                    thisPath.get_ptr<const std::string*>();
-                if (thisPathString == nullptr)
-                {
-                    BMCWEB_LOG_ERROR << "subscribe path isn't a string?";
-                    conn.close();
-                    return;
-                }
-                if (!std::regex_match(*thisPathString, validPath))
-                {
-                    BMCWEB_LOG_ERROR << "Invalid path name " << *thisPathString;
-                    conn.close();
-                    return;
-                }
-                propertiesMatchString =
-                    ("type='signal',"
-                     "interface='org.freedesktop.DBus.Properties',"
-                     "path_namespace='" +
-                     *thisPathString +
-                     "',"
-                     "member='PropertiesChanged'");
-                // If interfaces weren't specified, add a single match for all
-                // interfaces
-                if (thisSession.interfaces.empty())
-                {
-                    BMCWEB_LOG_DEBUG << "Creating match "
-                                     << propertiesMatchString;
-
-                    thisSession.matches.emplace_back(
-                        std::make_unique<sdbusplus::bus::match::match>(
-                            *crow::connections::systemBus,
-                            propertiesMatchString, onPropertyUpdate, &conn));
-                }
-                else
-                {
-                    // If interfaces were specified, add a match for each
-                    // interface
-                    for (const std::string& interface : thisSession.interfaces)
-                    {
-                        if (!std::regex_match(interface, validInterface))
-                        {
-                            BMCWEB_LOG_ERROR << "Invalid interface name "
-                                             << interface;
-                            conn.close();
-                            return;
-                        }
-                        std::string ifaceMatchString = propertiesMatchString;
-                        ifaceMatchString += ",arg0='";
-                        ifaceMatchString += interface;
-                        ifaceMatchString += "'";
-                        BMCWEB_LOG_DEBUG << "Creating match "
-                                         << ifaceMatchString;
-                        thisSession.matches.emplace_back(
-                            std::make_unique<sdbusplus::bus::match::match>(
-                                *crow::connections::systemBus, ifaceMatchString,
-                                onPropertyUpdate, &conn));
-                    }
-                }
-                objectManagerMatchString =
-                    ("type='signal',"
-                     "interface='org.freedesktop.DBus.ObjectManager',"
-                     "path_namespace='" +
-                     *thisPathString +
-                     "',"
-                     "member='InterfacesAdded'");
-                BMCWEB_LOG_DEBUG << "Creating match "
-                                 << objectManagerMatchString;
                 thisSession.matches.emplace_back(
                     std::make_unique<sdbusplus::bus::match::match>(
-                        *crow::connections::systemBus, objectManagerMatchString,
+                        *crow::connections::systemBus, propertiesMatchString,
                         onPropertyUpdate, &conn));
             }
+            else
+            {
+                // If interfaces were specified, add a match for each
+                // interface
+                for (const std::string& interface : thisSession.interfaces)
+                {
+                    if (!std::regex_match(interface, validInterface))
+                    {
+                        BMCWEB_LOG_ERROR << "Invalid interface name "
+                                         << interface;
+                        conn.close();
+                        return;
+                    }
+                    std::string ifaceMatchString = propertiesMatchString;
+                    ifaceMatchString += ",arg0='";
+                    ifaceMatchString += interface;
+                    ifaceMatchString += "'";
+                    BMCWEB_LOG_DEBUG << "Creating match " << ifaceMatchString;
+                    thisSession.matches.emplace_back(
+                        std::make_unique<sdbusplus::bus::match::match>(
+                            *crow::connections::systemBus, ifaceMatchString,
+                            onPropertyUpdate, &conn));
+                }
+            }
+            objectManagerMatchString =
+                ("type='signal',"
+                 "interface='org.freedesktop.DBus.ObjectManager',"
+                 "path_namespace='" +
+                 *thisPathString +
+                 "',"
+                 "member='InterfacesAdded'");
+            BMCWEB_LOG_DEBUG << "Creating match " << objectManagerMatchString;
+            thisSession.matches.emplace_back(
+                std::make_unique<sdbusplus::bus::match::match>(
+                    *crow::connections::systemBus, objectManagerMatchString,
+                    onPropertyUpdate, &conn));
+        }
         });
 }
 } // namespace dbus_monitor
diff --git a/include/dbus_utility.hpp b/include/dbus_utility.hpp
index 0c80197..d311216 100644
--- a/include/dbus_utility.hpp
+++ b/include/dbus_utility.hpp
@@ -122,7 +122,7 @@
         [callback{std::forward<Callback>(callback)}](
             const boost::system::error_code ec,
             const dbus::utility::MapperGetObject& objectNames) {
-            callback(!ec && !objectNames.empty());
+        callback(!ec && !objectNames.empty());
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
diff --git a/include/google/google_service_root.hpp b/include/google/google_service_root.hpp
index 441ddcf5..b43a8a5 100644
--- a/include/google/google_service_root.hpp
+++ b/include/google/google_service_root.hpp
@@ -62,12 +62,11 @@
                        const std::string& rotId,
                        ResolvedEntityHandler&& entityHandler)
 {
-    auto validateFunc = [command, asyncResp, rotId,
-                         entityHandler{std::forward<ResolvedEntityHandler>(
-                             entityHandler)}](
-                            const boost::system::error_code ec,
-                            const dbus::utility::MapperGetSubTreeResponse&
-                                subtree) {
+    auto validateFunc =
+        [command, asyncResp, rotId,
+         entityHandler{std::forward<ResolvedEntityHandler>(entityHandler)}](
+            const boost::system::error_code ec,
+            const dbus::utility::MapperGetSubTreeResponse& subtree) {
         if (ec)
         {
             redfish::messages::internalError(asyncResp->res);
diff --git a/include/hostname_monitor.hpp b/include/hostname_monitor.hpp
index f4e6b27..738dc1b 100644
--- a/include/hostname_monitor.hpp
+++ b/include/hostname_monitor.hpp
@@ -17,15 +17,15 @@
 {
     crow::connections::systemBus->async_method_call(
         [certPath](const boost::system::error_code ec) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "Replace Certificate Fail..";
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "Replace Certificate Fail..";
+            return;
+        }
 
-            BMCWEB_LOG_INFO << "Replace HTTPs Certificate Success, "
-                               "remove temporary certificate file..";
-            remove(certPath.c_str());
+        BMCWEB_LOG_INFO << "Replace HTTPs Certificate Success, "
+                           "remove temporary certificate file..";
+        remove(certPath.c_str());
         },
         "xyz.openbmc_project.Certs.Manager.Server.Https",
         "/xyz/openbmc_project/certs/server/https/1",
diff --git a/include/ibm/management_console_rest.hpp b/include/ibm/management_console_rest.hpp
index 0fbd2e2..dd33fd4 100644
--- a/include/ibm/management_console_rest.hpp
+++ b/include/ibm/management_console_rest.hpp
@@ -685,26 +685,26 @@
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                asyncResp->res.jsonValue["@odata.type"] =
-                    "#ibmServiceRoot.v1_0_0.ibmServiceRoot";
-                asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
-                asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
-                asyncResp->res.jsonValue["Name"] = "IBM Service Root";
-                asyncResp->res.jsonValue["ConfigFiles"]["@odata.id"] =
-                    "/ibm/v1/Host/ConfigFiles";
-                asyncResp->res.jsonValue["LockService"]["@odata.id"] =
-                    "/ibm/v1/HMC/LockService";
-                asyncResp->res.jsonValue["BroadcastService"]["@odata.id"] =
-                    "/ibm/v1/HMC/BroadcastService";
-            });
+        asyncResp->res.jsonValue["@odata.type"] =
+            "#ibmServiceRoot.v1_0_0.ibmServiceRoot";
+        asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
+        asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
+        asyncResp->res.jsonValue["Name"] = "IBM Service Root";
+        asyncResp->res.jsonValue["ConfigFiles"]["@odata.id"] =
+            "/ibm/v1/Host/ConfigFiles";
+        asyncResp->res.jsonValue["LockService"]["@odata.id"] =
+            "/ibm/v1/HMC/LockService";
+        asyncResp->res.jsonValue["BroadcastService"]["@odata.id"] =
+            "/ibm/v1/HMC/BroadcastService";
+        });
 
     BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                handleConfigFileList(asyncResp);
-            });
+        handleConfigFileList(asyncResp);
+        });
 
     BMCWEB_ROUTE(app,
                  "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll")
@@ -712,8 +712,8 @@
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                deleteConfigFiles(asyncResp);
-            });
+        deleteConfigFiles(asyncResp);
+        });
 
     BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles/<str>")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
@@ -722,97 +722,93 @@
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& fileName) {
-                BMCWEB_LOG_DEBUG << "ConfigFile : " << fileName;
-                // Validate the incoming fileName
-                if (!isValidConfigFileName(fileName, asyncResp->res))
-                {
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
-                handleFileUrl(req, asyncResp, fileName);
-            });
+        BMCWEB_LOG_DEBUG << "ConfigFile : " << fileName;
+        // Validate the incoming fileName
+        if (!isValidConfigFileName(fileName, asyncResp->res))
+        {
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+            return;
+        }
+        handleFileUrl(req, asyncResp, fileName);
+        });
 
     BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                getLockServiceData(asyncResp);
-            });
+        getLockServiceData(asyncResp);
+        });
 
     BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                std::vector<nlohmann::json> body;
-                if (!redfish::json_util::readJsonAction(req, asyncResp->res,
-                                                        "Request", body))
-                {
-                    BMCWEB_LOG_DEBUG << "Not a Valid JSON";
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
-                handleAcquireLockAPI(req, asyncResp, body);
-            });
+        std::vector<nlohmann::json> body;
+        if (!redfish::json_util::readJsonAction(req, asyncResp->res, "Request",
+                                                body))
+        {
+            BMCWEB_LOG_DEBUG << "Not a Valid JSON";
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+            return;
+        }
+        handleAcquireLockAPI(req, asyncResp, body);
+        });
     BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                std::string type;
-                std::vector<uint32_t> listTransactionIds;
+        std::string type;
+        std::vector<uint32_t> listTransactionIds;
 
-                if (!redfish::json_util::readJsonPatch(
-                        req, asyncResp->res, "Type", type, "TransactionIDs",
-                        listTransactionIds))
-                {
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
-                if (type == "Transaction")
-                {
-                    handleReleaseLockAPI(req, asyncResp, listTransactionIds);
-                }
-                else if (type == "Session")
-                {
-                    handleRelaseAllAPI(req, asyncResp);
-                }
-                else
-                {
-                    BMCWEB_LOG_DEBUG << " Value of Type : " << type
-                                     << "is Not a Valid key";
-                    redfish::messages::propertyValueNotInList(asyncResp->res,
-                                                              type, "Type");
-                }
-            });
+        if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "Type",
+                                               type, "TransactionIDs",
+                                               listTransactionIds))
+        {
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+            return;
+        }
+        if (type == "Transaction")
+        {
+            handleReleaseLockAPI(req, asyncResp, listTransactionIds);
+        }
+        else if (type == "Session")
+        {
+            handleRelaseAllAPI(req, asyncResp);
+        }
+        else
+        {
+            BMCWEB_LOG_DEBUG << " Value of Type : " << type
+                             << "is Not a Valid key";
+            redfish::messages::propertyValueNotInList(asyncResp->res, type,
+                                                      "Type");
+        }
+        });
     BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                ListOfSessionIds listSessionIds;
+        ListOfSessionIds listSessionIds;
 
-                if (!redfish::json_util::readJsonPatch(
-                        req, asyncResp->res, "SessionIDs", listSessionIds))
-                {
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
-                handleGetLockListAPI(asyncResp, listSessionIds);
-            });
+        if (!redfish::json_util::readJsonPatch(req, asyncResp->res,
+                                               "SessionIDs", listSessionIds))
+        {
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+            return;
+        }
+        handleGetLockListAPI(asyncResp, listSessionIds);
+        });
 
     BMCWEB_ROUTE(app, "/ibm/v1/HMC/BroadcastService")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                handleBroadcastService(req, asyncResp);
-            });
+        handleBroadcastService(req, asyncResp);
+        });
 }
 
 } // namespace ibm_mc
diff --git a/include/image_upload.hpp b/include/image_upload.hpp
index aefb27e..0fff1ea 100644
--- a/include/image_upload.hpp
+++ b/include/image_upload.hpp
@@ -59,32 +59,31 @@
 
     std::function<void(sdbusplus::message::message&)> callback =
         [asyncResp](sdbusplus::message::message& m) {
-            BMCWEB_LOG_DEBUG << "Match fired";
+        BMCWEB_LOG_DEBUG << "Match fired";
 
-            sdbusplus::message::object_path path;
-            dbus::utility::DBusInteracesMap interfaces;
-            m.read(path, interfaces);
+        sdbusplus::message::object_path path;
+        dbus::utility::DBusInteracesMap interfaces;
+        m.read(path, interfaces);
 
-            if (std::find_if(interfaces.begin(), interfaces.end(),
-                             [](const auto& i) {
-                                 return i.first ==
-                                        "xyz.openbmc_project.Software.Version";
-                             }) != interfaces.end())
+        if (std::find_if(interfaces.begin(), interfaces.end(),
+                         [](const auto& i) {
+            return i.first == "xyz.openbmc_project.Software.Version";
+            }) != interfaces.end())
+        {
+            timeout.cancel();
+            std::string leaf = path.filename();
+            if (leaf.empty())
             {
-                timeout.cancel();
-                std::string leaf = path.filename();
-                if (leaf.empty())
-                {
-                    leaf = path.str;
-                }
-
-                asyncResp->res.jsonValue["data"] = leaf;
-                asyncResp->res.jsonValue["message"] = "200 OK";
-                asyncResp->res.jsonValue["status"] = "ok";
-                BMCWEB_LOG_DEBUG << "ending response";
-                fwUpdateMatcher = nullptr;
+                leaf = path.str;
             }
-        };
+
+            asyncResp->res.jsonValue["data"] = leaf;
+            asyncResp->res.jsonValue["message"] = "200 OK";
+            asyncResp->res.jsonValue["status"] = "ok";
+            BMCWEB_LOG_DEBUG << "ending response";
+            fwUpdateMatcher = nullptr;
+        }
+    };
     fwUpdateMatcher = std::make_unique<sdbusplus::bus::match::match>(
         *crow::connections::systemBus,
         "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
@@ -116,8 +115,8 @@
         .methods(boost::beast::http::verb::post, boost::beast::http::verb::put)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                uploadImageHandler(req, asyncResp);
-            });
+        uploadImageHandler(req, asyncResp);
+        });
 }
 } // namespace image_upload
 } // namespace crow
diff --git a/include/kvm_websocket.hpp b/include/kvm_websocket.hpp
index fa61b75..79975d2 100644
--- a/include/kvm_websocket.hpp
+++ b/include/kvm_websocket.hpp
@@ -72,30 +72,30 @@
         hostSocket.async_read_some(
             outputBuffer.prepare(outputBuffer.capacity() - outputBuffer.size()),
             [this](const boost::system::error_code& ec, std::size_t bytesRead) {
-                BMCWEB_LOG_DEBUG << "conn:" << &conn << ", read done.  Read "
-                                 << bytesRead << " bytes";
-                if (ec)
+            BMCWEB_LOG_DEBUG << "conn:" << &conn << ", read done.  Read "
+                             << bytesRead << " bytes";
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR
+                    << "conn:" << &conn
+                    << ", Couldn't read from KVM socket port: " << ec;
+                if (ec != boost::asio::error::operation_aborted)
                 {
-                    BMCWEB_LOG_ERROR
-                        << "conn:" << &conn
-                        << ", Couldn't read from KVM socket port: " << ec;
-                    if (ec != boost::asio::error::operation_aborted)
-                    {
-                        conn.close("Error in connecting to KVM port");
-                    }
-                    return;
+                    conn.close("Error in connecting to KVM port");
                 }
+                return;
+            }
 
-                outputBuffer.commit(bytesRead);
-                std::string_view payload(
-                    static_cast<const char*>(outputBuffer.data().data()),
-                    bytesRead);
-                BMCWEB_LOG_DEBUG << "conn:" << &conn
-                                 << ", Sending payload size " << payload.size();
-                conn.sendBinary(payload);
-                outputBuffer.consume(bytesRead);
+            outputBuffer.commit(bytesRead);
+            std::string_view payload(
+                static_cast<const char*>(outputBuffer.data().data()),
+                bytesRead);
+            BMCWEB_LOG_DEBUG << "conn:" << &conn << ", Sending payload size "
+                             << payload.size();
+            conn.sendBinary(payload);
+            outputBuffer.consume(bytesRead);
 
-                doRead();
+            doRead();
             });
     }
 
@@ -115,32 +115,32 @@
         }
 
         doingWrite = true;
-        hostSocket.async_write_some(
-            inputBuffer.data(), [this](const boost::system::error_code& ec,
-                                       std::size_t bytesWritten) {
-                BMCWEB_LOG_DEBUG << "conn:" << &conn << ", Wrote "
-                                 << bytesWritten << "bytes";
-                doingWrite = false;
-                inputBuffer.consume(bytesWritten);
+        hostSocket.async_write_some(inputBuffer.data(),
+                                    [this](const boost::system::error_code& ec,
+                                           std::size_t bytesWritten) {
+            BMCWEB_LOG_DEBUG << "conn:" << &conn << ", Wrote " << bytesWritten
+                             << "bytes";
+            doingWrite = false;
+            inputBuffer.consume(bytesWritten);
 
-                if (ec == boost::asio::error::eof)
+            if (ec == boost::asio::error::eof)
+            {
+                conn.close("KVM socket port closed");
+                return;
+            }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "conn:" << &conn
+                                 << ", Error in KVM socket write " << ec;
+                if (ec != boost::asio::error::operation_aborted)
                 {
-                    conn.close("KVM socket port closed");
-                    return;
+                    conn.close("Error in reading to host port");
                 }
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "conn:" << &conn
-                                     << ", Error in KVM socket write " << ec;
-                    if (ec != boost::asio::error::operation_aborted)
-                    {
-                        conn.close("Error in reading to host port");
-                    }
-                    return;
-                }
+                return;
+            }
 
-                doWrite();
-            });
+            doWrite();
+        });
     }
 
     crow::websocket::Connection& conn;
diff --git a/include/login_routes.hpp b/include/login_routes.hpp
index a4fa9b7..1a35adf 100644
--- a/include/login_routes.hpp
+++ b/include/login_routes.hpp
@@ -21,91 +21,63 @@
 inline void requestRoutes(App& app)
 {
     BMCWEB_ROUTE(app, "/login")
-        .methods(
-            boost::beast::http::verb::
-                post)([](const crow::Request& req,
-                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-            std::string_view contentType = req.getHeaderValue("content-type");
-            std::string_view username;
-            std::string_view password;
+        .methods(boost::beast::http::verb::post)(
+            [](const crow::Request& req,
+               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
+        std::string_view contentType = req.getHeaderValue("content-type");
+        std::string_view username;
+        std::string_view password;
 
-            bool looksLikePhosphorRest = false;
+        bool looksLikePhosphorRest = false;
 
-            // This object needs to be declared at this scope so the strings
-            // within it are not destroyed before we can use them
-            nlohmann::json loginCredentials;
-            // Check if auth was provided by a payload
-            if (boost::starts_with(contentType, "application/json"))
+        // This object needs to be declared at this scope so the strings
+        // within it are not destroyed before we can use them
+        nlohmann::json loginCredentials;
+        // Check if auth was provided by a payload
+        if (boost::starts_with(contentType, "application/json"))
+        {
+            loginCredentials = nlohmann::json::parse(req.body, nullptr, false);
+            if (loginCredentials.is_discarded())
             {
-                loginCredentials =
-                    nlohmann::json::parse(req.body, nullptr, false);
-                if (loginCredentials.is_discarded())
-                {
-                    BMCWEB_LOG_DEBUG << "Bad json in request";
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
+                BMCWEB_LOG_DEBUG << "Bad json in request";
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
 
-                // check for username/password in the root object
-                // THis method is how intel APIs authenticate
-                nlohmann::json::iterator userIt =
-                    loginCredentials.find("username");
-                nlohmann::json::iterator passIt =
-                    loginCredentials.find("password");
-                if (userIt != loginCredentials.end() &&
-                    passIt != loginCredentials.end())
+            // check for username/password in the root object
+            // THis method is how intel APIs authenticate
+            nlohmann::json::iterator userIt = loginCredentials.find("username");
+            nlohmann::json::iterator passIt = loginCredentials.find("password");
+            if (userIt != loginCredentials.end() &&
+                passIt != loginCredentials.end())
+            {
+                const std::string* userStr =
+                    userIt->get_ptr<const std::string*>();
+                const std::string* passStr =
+                    passIt->get_ptr<const std::string*>();
+                if (userStr != nullptr && passStr != nullptr)
                 {
-                    const std::string* userStr =
-                        userIt->get_ptr<const std::string*>();
-                    const std::string* passStr =
-                        passIt->get_ptr<const std::string*>();
-                    if (userStr != nullptr && passStr != nullptr)
-                    {
-                        username = *userStr;
-                        password = *passStr;
-                    }
+                    username = *userStr;
+                    password = *passStr;
                 }
-                else
+            }
+            else
+            {
+                // Openbmc appears to push a data object that contains the
+                // same keys (username and password), attempt to use that
+                auto dataIt = loginCredentials.find("data");
+                if (dataIt != loginCredentials.end())
                 {
-                    // Openbmc appears to push a data object that contains the
-                    // same keys (username and password), attempt to use that
-                    auto dataIt = loginCredentials.find("data");
-                    if (dataIt != loginCredentials.end())
+                    // Some apis produce an array of value ["username",
+                    // "password"]
+                    if (dataIt->is_array())
                     {
-                        // Some apis produce an array of value ["username",
-                        // "password"]
-                        if (dataIt->is_array())
+                        if (dataIt->size() == 2)
                         {
-                            if (dataIt->size() == 2)
-                            {
-                                nlohmann::json::iterator userIt2 =
-                                    dataIt->begin();
-                                nlohmann::json::iterator passIt2 =
-                                    dataIt->begin() + 1;
-                                looksLikePhosphorRest = true;
-                                if (userIt2 != dataIt->end() &&
-                                    passIt2 != dataIt->end())
-                                {
-                                    const std::string* userStr =
-                                        userIt2->get_ptr<const std::string*>();
-                                    const std::string* passStr =
-                                        passIt2->get_ptr<const std::string*>();
-                                    if (userStr != nullptr &&
-                                        passStr != nullptr)
-                                    {
-                                        username = *userStr;
-                                        password = *passStr;
-                                    }
-                                }
-                            }
-                        }
-                        else if (dataIt->is_object())
-                        {
-                            nlohmann::json::iterator userIt2 =
-                                dataIt->find("username");
+                            nlohmann::json::iterator userIt2 = dataIt->begin();
                             nlohmann::json::iterator passIt2 =
-                                dataIt->find("password");
+                                dataIt->begin() + 1;
+                            looksLikePhosphorRest = true;
                             if (userIt2 != dataIt->end() &&
                                 passIt2 != dataIt->end())
                             {
@@ -121,139 +93,156 @@
                             }
                         }
                     }
+                    else if (dataIt->is_object())
+                    {
+                        nlohmann::json::iterator userIt2 =
+                            dataIt->find("username");
+                        nlohmann::json::iterator passIt2 =
+                            dataIt->find("password");
+                        if (userIt2 != dataIt->end() &&
+                            passIt2 != dataIt->end())
+                        {
+                            const std::string* userStr =
+                                userIt2->get_ptr<const std::string*>();
+                            const std::string* passStr =
+                                passIt2->get_ptr<const std::string*>();
+                            if (userStr != nullptr && passStr != nullptr)
+                            {
+                                username = *userStr;
+                                password = *passStr;
+                            }
+                        }
+                    }
                 }
             }
-            else if (boost::starts_with(contentType, "multipart/form-data"))
+        }
+        else if (boost::starts_with(contentType, "multipart/form-data"))
+        {
+            looksLikePhosphorRest = true;
+            MultipartParser parser;
+            ParserError ec = parser.parse(req);
+            if (ec != ParserError::PARSER_SUCCESS)
             {
-                looksLikePhosphorRest = true;
-                MultipartParser parser;
-                ParserError ec = parser.parse(req);
-                if (ec != ParserError::PARSER_SUCCESS)
+                // handle error
+                BMCWEB_LOG_ERROR << "MIME parse failed, ec : "
+                                 << static_cast<int>(ec);
+                asyncResp->res.result(boost::beast::http::status::bad_request);
+                return;
+            }
+
+            for (const FormPart& formpart : parser.mime_fields)
+            {
+                boost::beast::http::fields::const_iterator it =
+                    formpart.fields.find("Content-Disposition");
+                if (it == formpart.fields.end())
                 {
-                    // handle error
-                    BMCWEB_LOG_ERROR << "MIME parse failed, ec : "
-                                     << static_cast<int>(ec);
+                    BMCWEB_LOG_ERROR << "Couldn't find Content-Disposition";
                     asyncResp->res.result(
                         boost::beast::http::status::bad_request);
-                    return;
+                    continue;
                 }
 
-                for (const FormPart& formpart : parser.mime_fields)
+                BMCWEB_LOG_INFO << "Parsing value " << it->value();
+
+                if (it->value() == "form-data; name=\"username\"")
                 {
-                    boost::beast::http::fields::const_iterator it =
-                        formpart.fields.find("Content-Disposition");
-                    if (it == formpart.fields.end())
-                    {
-                        BMCWEB_LOG_ERROR << "Couldn't find Content-Disposition";
-                        asyncResp->res.result(
-                            boost::beast::http::status::bad_request);
-                        continue;
-                    }
-
-                    BMCWEB_LOG_INFO << "Parsing value " << it->value();
-
-                    if (it->value() == "form-data; name=\"username\"")
-                    {
-                        username = formpart.content;
-                    }
-                    else if (it->value() == "form-data; name=\"password\"")
-                    {
-                        password = formpart.content;
-                    }
-                    else
-                    {
-                        BMCWEB_LOG_INFO << "Extra format, ignore it."
-                                        << it->value();
-                    }
+                    username = formpart.content;
                 }
-            }
-            else
-            {
-                // check if auth was provided as a headers
-                username = req.getHeaderValue("username");
-                password = req.getHeaderValue("password");
-            }
-
-            if (!username.empty() && !password.empty())
-            {
-                int pamrc = pamAuthenticateUser(username, password);
-                bool isConfigureSelfOnly = pamrc == PAM_NEW_AUTHTOK_REQD;
-                if ((pamrc != PAM_SUCCESS) && !isConfigureSelfOnly)
+                else if (it->value() == "form-data; name=\"password\"")
                 {
-                    asyncResp->res.result(
-                        boost::beast::http::status::unauthorized);
+                    password = formpart.content;
                 }
                 else
                 {
-                    std::string unsupportedClientId;
-                    auto session =
-                        persistent_data::SessionStore::getInstance()
-                            .generateUserSession(
-                                username, req.ipAddress, unsupportedClientId,
-                                persistent_data::PersistenceType::TIMEOUT,
-                                isConfigureSelfOnly);
-
-                    if (looksLikePhosphorRest)
-                    {
-                        // Phosphor-Rest requires a very specific login
-                        // structure, and doesn't actually look at the status
-                        // code.
-                        // TODO(ed).... Fix that upstream
-
-                        asyncResp->res.jsonValue["data"] =
-                            "User '" + std::string(username) + "' logged in";
-                        asyncResp->res.jsonValue["message"] = "200 OK";
-                        asyncResp->res.jsonValue["status"] = "ok";
-
-                        // Hack alert.  Boost beast by default doesn't let you
-                        // declare multiple headers of the same name, and in
-                        // most cases this is fine.  Unfortunately here we need
-                        // to set the Session cookie, which requires the
-                        // httpOnly attribute, as well as the XSRF cookie, which
-                        // requires it to not have an httpOnly attribute. To get
-                        // the behavior we want, we simply inject the second
-                        // "set-cookie" string into the value header, and get
-                        // the result we want, even though we are technicaly
-                        // declaring two headers here.
-                        asyncResp->res.addHeader(
-                            "Set-Cookie",
-                            "XSRF-TOKEN=" + session->csrfToken +
-                                "; SameSite=Strict; Secure\r\nSet-Cookie: "
-                                "SESSION=" +
-                                session->sessionToken +
-                                "; SameSite=Strict; Secure; HttpOnly");
-                    }
-                    else
-                    {
-                        // if content type is json, assume json token
-                        asyncResp->res.jsonValue["token"] =
-                            session->sessionToken;
-                    }
+                    BMCWEB_LOG_INFO << "Extra format, ignore it."
+                                    << it->value();
                 }
             }
+        }
+        else
+        {
+            // check if auth was provided as a headers
+            username = req.getHeaderValue("username");
+            password = req.getHeaderValue("password");
+        }
+
+        if (!username.empty() && !password.empty())
+        {
+            int pamrc = pamAuthenticateUser(username, password);
+            bool isConfigureSelfOnly = pamrc == PAM_NEW_AUTHTOK_REQD;
+            if ((pamrc != PAM_SUCCESS) && !isConfigureSelfOnly)
+            {
+                asyncResp->res.result(boost::beast::http::status::unauthorized);
+            }
             else
             {
-                BMCWEB_LOG_DEBUG << "Couldn't interpret password";
-                asyncResp->res.result(boost::beast::http::status::bad_request);
+                std::string unsupportedClientId;
+                auto session =
+                    persistent_data::SessionStore::getInstance()
+                        .generateUserSession(
+                            username, req.ipAddress, unsupportedClientId,
+                            persistent_data::PersistenceType::TIMEOUT,
+                            isConfigureSelfOnly);
+
+                if (looksLikePhosphorRest)
+                {
+                    // Phosphor-Rest requires a very specific login
+                    // structure, and doesn't actually look at the status
+                    // code.
+                    // TODO(ed).... Fix that upstream
+
+                    asyncResp->res.jsonValue["data"] =
+                        "User '" + std::string(username) + "' logged in";
+                    asyncResp->res.jsonValue["message"] = "200 OK";
+                    asyncResp->res.jsonValue["status"] = "ok";
+
+                    // Hack alert.  Boost beast by default doesn't let you
+                    // declare multiple headers of the same name, and in
+                    // most cases this is fine.  Unfortunately here we need
+                    // to set the Session cookie, which requires the
+                    // httpOnly attribute, as well as the XSRF cookie, which
+                    // requires it to not have an httpOnly attribute. To get
+                    // the behavior we want, we simply inject the second
+                    // "set-cookie" string into the value header, and get
+                    // the result we want, even though we are technicaly
+                    // declaring two headers here.
+                    asyncResp->res.addHeader(
+                        "Set-Cookie",
+                        "XSRF-TOKEN=" + session->csrfToken +
+                            "; SameSite=Strict; Secure\r\nSet-Cookie: "
+                            "SESSION=" +
+                            session->sessionToken +
+                            "; SameSite=Strict; Secure; HttpOnly");
+                }
+                else
+                {
+                    // if content type is json, assume json token
+                    asyncResp->res.jsonValue["token"] = session->sessionToken;
+                }
             }
+        }
+        else
+        {
+            BMCWEB_LOG_DEBUG << "Couldn't interpret password";
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+        }
         });
 
     BMCWEB_ROUTE(app, "/logout")
         .methods(boost::beast::http::verb::post)(
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                const auto& session = req.session;
-                if (session != nullptr)
-                {
-                    asyncResp->res.jsonValue["data"] =
-                        "User '" + session->username + "' logged out";
-                    asyncResp->res.jsonValue["message"] = "200 OK";
-                    asyncResp->res.jsonValue["status"] = "ok";
+        const auto& session = req.session;
+        if (session != nullptr)
+        {
+            asyncResp->res.jsonValue["data"] =
+                "User '" + session->username + "' logged out";
+            asyncResp->res.jsonValue["message"] = "200 OK";
+            asyncResp->res.jsonValue["status"] = "ok";
 
-                    persistent_data::SessionStore::getInstance().removeSession(
-                        session);
-                }
-            });
+            persistent_data::SessionStore::getInstance().removeSession(session);
+        }
+        });
 }
 } // namespace login_routes
 } // namespace crow
diff --git a/include/nbd_proxy.hpp b/include/nbd_proxy.hpp
index 97c8b57..4431662 100644
--- a/include/nbd_proxy.hpp
+++ b/include/nbd_proxy.hpp
@@ -67,33 +67,33 @@
         acceptor.async_accept(
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              stream_protocol::socket socket) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX socket: async_accept error = "
-                                     << ec.message();
-                    return;
-                }
-                if (peerSocket)
-                {
-                    // Something is wrong - socket shouldn't be acquired at this
-                    // point
-                    BMCWEB_LOG_ERROR
-                        << "Failed to open connection - socket already used";
-                    return;
-                }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX socket: async_accept error = "
+                                 << ec.message();
+                return;
+            }
+            if (peerSocket)
+            {
+                // Something is wrong - socket shouldn't be acquired at this
+                // point
+                BMCWEB_LOG_ERROR
+                    << "Failed to open connection - socket already used";
+                return;
+            }
 
-                BMCWEB_LOG_DEBUG << "Connection opened";
-                peerSocket = std::move(socket);
-                doRead();
+            BMCWEB_LOG_DEBUG << "Connection opened";
+            peerSocket = std::move(socket);
+            doRead();
 
-                // Trigger Write if any data was sent from server
-                // Initially this is negotiation chunk
-                doWrite();
-            });
+            // Trigger Write if any data was sent from server
+            // Initially this is negotiation chunk
+            doWrite();
+        });
 
-        auto mountHandler = [this, self(shared_from_this())](
-                                const boost::system::error_code ec,
-                                const bool) {
+        auto mountHandler =
+            [this, self(shared_from_this())](const boost::system::error_code ec,
+                                             const bool) {
             if (ec)
             {
                 BMCWEB_LOG_ERROR << "DBus error: cannot call mount method = "
@@ -158,27 +158,27 @@
             ux2wsBuf.prepare(nbdBufferSize),
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              std::size_t bytesRead) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX socket: async_read_some error = "
-                                     << ec.message();
-                    // UNIX socket has been closed by peer, best we can do is to
-                    // break all connections
-                    close();
-                    return;
-                }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX socket: async_read_some error = "
+                                 << ec.message();
+                // UNIX socket has been closed by peer, best we can do is to
+                // break all connections
+                close();
+                return;
+            }
 
-                // Fetch data from UNIX socket
+            // Fetch data from UNIX socket
 
-                ux2wsBuf.commit(bytesRead);
+            ux2wsBuf.commit(bytesRead);
 
-                // Paste it to WebSocket as binary
-                connection.sendBinary(
-                    boost::beast::buffers_to_string(ux2wsBuf.data()));
-                ux2wsBuf.consume(bytesRead);
+            // Paste it to WebSocket as binary
+            connection.sendBinary(
+                boost::beast::buffers_to_string(ux2wsBuf.data()));
+            ux2wsBuf.consume(bytesRead);
 
-                // Allow further reads
-                doRead();
+            // Allow further reads
+            doRead();
             });
     }
 
@@ -209,19 +209,19 @@
             *peerSocket, ws2uxBuf.data(),
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              std::size_t bytesWritten) {
-                ws2uxBuf.consume(bytesWritten);
-                uxWriteInProgress = false;
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX: async_write error = "
-                                     << ec.message();
-                    return;
-                }
-                // Retrigger doWrite if there is something in buffer
-                if (ws2uxBuf.size() > 0)
-                {
-                    doWrite();
-                }
+            ws2uxBuf.consume(bytesWritten);
+            uxWriteInProgress = false;
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX: async_write error = "
+                                 << ec.message();
+                return;
+            }
+            // Retrigger doWrite if there is something in buffer
+            if (ws2uxBuf.size() > 0)
+            {
+                doWrite();
+            }
             });
     }
 
@@ -258,143 +258,138 @@
         .onopen([](crow::websocket::Connection& conn) {
             BMCWEB_LOG_DEBUG << "nbd-proxy.onopen(" << &conn << ")";
 
-            auto getUserInfoHandler = [&conn](
-                                          const boost::system::error_code ec,
-                                          const dbus::utility::
-                                              DBusPropertiesMap& userInfo) {
+            auto getUserInfoHandler =
+                [&conn](const boost::system::error_code ec,
+                        const dbus::utility::DBusPropertiesMap& userInfo) {
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "GetUserInfo failed...";
+                conn.close("Failed to get user information");
+                return;
+            }
+
+            const std::string* userRolePtr = nullptr;
+            auto userInfoIter = std::find_if(userInfo.begin(), userInfo.end(),
+                                             [](const auto& p) {
+                return p.first == "UserPrivilege";
+            });
+            if (userInfoIter != userInfo.end())
+            {
+                userRolePtr = std::get_if<std::string>(&userInfoIter->second);
+            }
+
+            std::string userRole{};
+            if (userRolePtr != nullptr)
+            {
+                userRole = *userRolePtr;
+                BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
+                                 << " userRole = " << *userRolePtr;
+            }
+
+            // Get the user privileges from the role
+            ::redfish::Privileges userPrivileges =
+                ::redfish::getUserPrivileges(userRole);
+
+            const ::redfish::Privileges requiredPrivileges{
+                requiredPrivilegeString};
+
+            if (!userPrivileges.isSupersetOf(requiredPrivileges))
+            {
+                BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
+                                 << " not authorized for nbd connection";
+                conn.close("Unathourized access");
+                return;
+            }
+
+            auto openHandler =
+                [&conn](const boost::system::error_code ec,
+                        const dbus::utility::ManagedObjectType& objects) {
+                const std::string* socketValue = nullptr;
+                const std::string* endpointValue = nullptr;
+                const std::string* endpointObjectPath = nullptr;
+
                 if (ec)
                 {
-                    BMCWEB_LOG_ERROR << "GetUserInfo failed...";
-                    conn.close("Failed to get user information");
+                    BMCWEB_LOG_ERROR << "DBus error: " << ec.message();
+                    conn.close("Failed to create mount point");
                     return;
                 }
 
-                const std::string* userRolePtr = nullptr;
-                auto userInfoIter = std::find_if(
-                    userInfo.begin(), userInfo.end(),
-                    [](const auto& p) { return p.first == "UserPrivilege"; });
-                if (userInfoIter != userInfo.end())
+                for (const auto& [objectPath, interfaces] : objects)
                 {
-                    userRolePtr =
-                        std::get_if<std::string>(&userInfoIter->second);
+                    for (const auto& [interface, properties] : interfaces)
+                    {
+                        if (interface !=
+                            "xyz.openbmc_project.VirtualMedia.MountPoint")
+                        {
+                            continue;
+                        }
+
+                        for (const auto& [name, value] : properties)
+                        {
+                            if (name == "EndpointId")
+                            {
+                                endpointValue =
+                                    std::get_if<std::string>(&value);
+
+                                if (endpointValue == nullptr)
+                                {
+                                    BMCWEB_LOG_ERROR
+                                        << "EndpointId property value is null";
+                                }
+                            }
+                            if (name == "Socket")
+                            {
+                                socketValue = std::get_if<std::string>(&value);
+                                if (socketValue == nullptr)
+                                {
+                                    BMCWEB_LOG_ERROR
+                                        << "Socket property value is null";
+                                }
+                            }
+                        }
+                    }
+
+                    if ((endpointValue != nullptr) &&
+                        (socketValue != nullptr) &&
+                        *endpointValue == conn.req.target())
+                    {
+                        endpointObjectPath = &objectPath.str;
+                        break;
+                    }
                 }
 
-                std::string userRole{};
-                if (userRolePtr != nullptr)
+                if (objects.empty() || endpointObjectPath == nullptr)
                 {
-                    userRole = *userRolePtr;
-                    BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
-                                     << " userRole = " << *userRolePtr;
-                }
-
-                // Get the user privileges from the role
-                ::redfish::Privileges userPrivileges =
-                    ::redfish::getUserPrivileges(userRole);
-
-                const ::redfish::Privileges requiredPrivileges{
-                    requiredPrivilegeString};
-
-                if (!userPrivileges.isSupersetOf(requiredPrivileges))
-                {
-                    BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
-                                     << " not authorized for nbd connection";
-                    conn.close("Unathourized access");
+                    BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
+                    conn.close("Failed to match EndpointId");
                     return;
                 }
 
-                auto openHandler = [&conn](
-                                       const boost::system::error_code ec,
-                                       const dbus::utility::ManagedObjectType&
-                                           objects) {
-                    const std::string* socketValue = nullptr;
-                    const std::string* endpointValue = nullptr;
-                    const std::string* endpointObjectPath = nullptr;
-
-                    if (ec)
+                for (const auto& session : sessions)
+                {
+                    if (session.second->getEndpointId() == conn.req.target())
                     {
-                        BMCWEB_LOG_ERROR << "DBus error: " << ec.message();
-                        conn.close("Failed to create mount point");
+                        BMCWEB_LOG_ERROR
+                            << "Cannot open new connection - socket is in use";
+                        conn.close("Slot is in use");
                         return;
                     }
+                }
 
-                    for (const auto& [objectPath, interfaces] : objects)
-                    {
-                        for (const auto& [interface, properties] : interfaces)
-                        {
-                            if (interface !=
-                                "xyz.openbmc_project.VirtualMedia.MountPoint")
-                            {
-                                continue;
-                            }
+                // If the socket file exists (i.e. after bmcweb crash),
+                // we cannot reuse it.
+                std::remove((*socketValue).c_str());
 
-                            for (const auto& [name, value] : properties)
-                            {
-                                if (name == "EndpointId")
-                                {
-                                    endpointValue =
-                                        std::get_if<std::string>(&value);
+                sessions[&conn] = std::make_shared<NbdProxyServer>(
+                    conn, *socketValue, *endpointValue, *endpointObjectPath);
 
-                                    if (endpointValue == nullptr)
-                                    {
-                                        BMCWEB_LOG_ERROR
-                                            << "EndpointId property value is null";
-                                    }
-                                }
-                                if (name == "Socket")
-                                {
-                                    socketValue =
-                                        std::get_if<std::string>(&value);
-                                    if (socketValue == nullptr)
-                                    {
-                                        BMCWEB_LOG_ERROR
-                                            << "Socket property value is null";
-                                    }
-                                }
-                            }
-                        }
-
-                        if ((endpointValue != nullptr) &&
-                            (socketValue != nullptr) &&
-                            *endpointValue == conn.req.target())
-                        {
-                            endpointObjectPath = &objectPath.str;
-                            break;
-                        }
-                    }
-
-                    if (objects.empty() || endpointObjectPath == nullptr)
-                    {
-                        BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
-                        conn.close("Failed to match EndpointId");
-                        return;
-                    }
-
-                    for (const auto& session : sessions)
-                    {
-                        if (session.second->getEndpointId() ==
-                            conn.req.target())
-                        {
-                            BMCWEB_LOG_ERROR
-                                << "Cannot open new connection - socket is in use";
-                            conn.close("Slot is in use");
-                            return;
-                        }
-                    }
-
-                    // If the socket file exists (i.e. after bmcweb crash),
-                    // we cannot reuse it.
-                    std::remove((*socketValue).c_str());
-
-                    sessions[&conn] = std::make_shared<NbdProxyServer>(
-                        conn, *socketValue, *endpointValue,
-                        *endpointObjectPath);
-
-                    sessions[&conn]->run();
-                };
-                crow::connections::systemBus->async_method_call(
-                    std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
-                    "/xyz/openbmc_project/VirtualMedia",
-                    "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+                sessions[&conn]->run();
+            };
+            crow::connections::systemBus->async_method_call(
+                std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
+                "/xyz/openbmc_project/VirtualMedia",
+                "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
             };
 
             crow::connections::systemBus->async_method_call(
@@ -405,18 +400,17 @@
         })
         .onclose(
             [](crow::websocket::Connection& conn, const std::string& reason) {
-                BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason
-                                 << "')";
-                auto session = sessions.find(&conn);
-                if (session == sessions.end())
-                {
-                    BMCWEB_LOG_DEBUG << "No session to close";
-                    return;
-                }
-                session->second->close();
-                // Remove reference to session in global map
-                sessions.erase(session);
-            })
+        BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason << "')";
+        auto session = sessions.find(&conn);
+        if (session == sessions.end())
+        {
+            BMCWEB_LOG_DEBUG << "No session to close";
+            return;
+        }
+        session->second->close();
+        // Remove reference to session in global map
+        sessions.erase(session);
+        })
         .onmessage([](crow::websocket::Connection& conn,
                       const std::string& data, bool) {
             BMCWEB_LOG_DEBUG << "nbd-proxy.onmessage(len = " << data.length()
diff --git a/include/obmc_console.hpp b/include/obmc_console.hpp
index fc99d41..d5eaf81 100644
--- a/include/obmc_console.hpp
+++ b/include/obmc_console.hpp
@@ -45,23 +45,23 @@
     hostSocket->async_write_some(
         boost::asio::buffer(inputBuffer.data(), inputBuffer.size()),
         [](boost::beast::error_code ec, std::size_t bytesWritten) {
-            doingWrite = false;
-            inputBuffer.erase(0, bytesWritten);
+        doingWrite = false;
+        inputBuffer.erase(0, bytesWritten);
 
-            if (ec == boost::asio::error::eof)
+        if (ec == boost::asio::error::eof)
+        {
+            for (crow::websocket::Connection* session : sessions)
             {
-                for (crow::websocket::Connection* session : sessions)
-                {
-                    session->close("Error in reading to host port");
-                }
-                return;
+                session->close("Error in reading to host port");
             }
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "Error in host serial write " << ec;
-                return;
-            }
-            doWrite();
+            return;
+        }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "Error in host serial write " << ec;
+            return;
+        }
+        doWrite();
         });
 }
 
@@ -77,23 +77,22 @@
     hostSocket->async_read_some(
         boost::asio::buffer(outputBuffer.data(), outputBuffer.size()),
         [](const boost::system::error_code& ec, std::size_t bytesRead) {
-            BMCWEB_LOG_DEBUG << "read done.  Read " << bytesRead << " bytes";
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "Couldn't read from host serial port: "
-                                 << ec;
-                for (crow::websocket::Connection* session : sessions)
-                {
-                    session->close("Error in connecting to host port");
-                }
-                return;
-            }
-            std::string_view payload(outputBuffer.data(), bytesRead);
+        BMCWEB_LOG_DEBUG << "read done.  Read " << bytesRead << " bytes";
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "Couldn't read from host serial port: " << ec;
             for (crow::websocket::Connection* session : sessions)
             {
-                session->sendBinary(payload);
+                session->close("Error in connecting to host port");
             }
-            doRead();
+            return;
+        }
+        std::string_view payload(outputBuffer.data(), bytesRead);
+        for (crow::websocket::Connection* session : sessions)
+        {
+            session->sendBinary(payload);
+        }
+        doRead();
         });
 }
 
@@ -118,20 +117,21 @@
     BMCWEB_ROUTE(app, "/console0")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .websocket()
-        .onopen([](crow::websocket::Connection& conn) {
-            BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
+        .onopen(
+            [](crow::websocket::Connection& conn) {
+        BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
 
-            sessions.insert(&conn);
-            if (hostSocket == nullptr)
-            {
-                const std::string consoleName("\0obmc-console", 13);
-                boost::asio::local::stream_protocol::endpoint ep(consoleName);
+        sessions.insert(&conn);
+        if (hostSocket == nullptr)
+        {
+            const std::string consoleName("\0obmc-console", 13);
+            boost::asio::local::stream_protocol::endpoint ep(consoleName);
 
-                hostSocket = std::make_unique<
-                    boost::asio::local::stream_protocol::socket>(
+            hostSocket =
+                std::make_unique<boost::asio::local::stream_protocol::socket>(
                     conn.getIoContext());
-                hostSocket->async_connect(ep, connectHandler);
-            }
+            hostSocket->async_connect(ep, connectHandler);
+        }
         })
         .onclose([](crow::websocket::Connection& conn,
                     [[maybe_unused]] const std::string& reason) {
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 272776c..9e79e60 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -86,49 +86,49 @@
          objectPath{std::string(objectPath)}](
             const boost::system::error_code ec,
             const std::string& introspectXml) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR
-                    << "Introspect call failed with error: " << ec.message()
-                    << " on process: " << processName << " path: " << objectPath
-                    << "\n";
-                return;
-            }
-            nlohmann::json::object_t object;
-            object["path"] = objectPath;
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR
+                << "Introspect call failed with error: " << ec.message()
+                << " on process: " << processName << " path: " << objectPath
+                << "\n";
+            return;
+        }
+        nlohmann::json::object_t object;
+        object["path"] = objectPath;
 
-            transaction->res.jsonValue["objects"].push_back(std::move(object));
+        transaction->res.jsonValue["objects"].push_back(std::move(object));
 
-            tinyxml2::XMLDocument doc;
+        tinyxml2::XMLDocument doc;
 
-            doc.Parse(introspectXml.c_str());
-            tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
-            if (pRoot == nullptr)
+        doc.Parse(introspectXml.c_str());
+        tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
+        if (pRoot == nullptr)
+        {
+            BMCWEB_LOG_ERROR << "XML document failed to parse " << processName
+                             << " " << objectPath << "\n";
+        }
+        else
+        {
+            tinyxml2::XMLElement* node = pRoot->FirstChildElement("node");
+            while (node != nullptr)
             {
-                BMCWEB_LOG_ERROR << "XML document failed to parse "
-                                 << processName << " " << objectPath << "\n";
-            }
-            else
-            {
-                tinyxml2::XMLElement* node = pRoot->FirstChildElement("node");
-                while (node != nullptr)
+                const char* childPath = node->Attribute("name");
+                if (childPath != nullptr)
                 {
-                    const char* childPath = node->Attribute("name");
-                    if (childPath != nullptr)
+                    std::string newpath;
+                    if (objectPath != "/")
                     {
-                        std::string newpath;
-                        if (objectPath != "/")
-                        {
-                            newpath += objectPath;
-                        }
-                        newpath += std::string("/") + childPath;
-                        // introspect the subobjects as well
-                        introspectObjects(processName, newpath, transaction);
+                        newpath += objectPath;
                     }
-
-                    node = node->NextSiblingElement("node");
+                    newpath += std::string("/") + childPath;
+                    // introspect the subobjects as well
+                    introspectObjects(processName, newpath, transaction);
                 }
+
+                node = node->NextSiblingElement("node");
             }
+        }
         },
         processName, objectPath, "org.freedesktop.DBus.Introspectable",
         "Introspect");
@@ -146,40 +146,39 @@
         [asyncResp, objectPath, service,
          interface](const boost::system::error_code ec,
                     const dbus::utility::DBusPropertiesMap& propertiesList) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "GetAll on path " << objectPath << " iface "
-                                 << interface << " service " << service
-                                 << " failed with code " << ec;
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "GetAll on path " << objectPath << " iface "
+                             << interface << " service " << service
+                             << " failed with code " << ec;
+            return;
+        }
 
-            nlohmann::json& dataJson = asyncResp->res.jsonValue["data"];
-            nlohmann::json& objectJson = dataJson[objectPath];
-            if (objectJson.is_null())
-            {
-                objectJson = nlohmann::json::object();
-            }
+        nlohmann::json& dataJson = asyncResp->res.jsonValue["data"];
+        nlohmann::json& objectJson = dataJson[objectPath];
+        if (objectJson.is_null())
+        {
+            objectJson = nlohmann::json::object();
+        }
 
-            for (const auto& [name, value] : propertiesList)
-            {
-                nlohmann::json& propertyJson = objectJson[name];
-                std::visit(
-                    [&propertyJson](auto&& val) {
-                        if constexpr (std::is_same_v<
-                                          std::decay_t<decltype(val)>,
-                                          sdbusplus::message::unix_fd>)
-                        {
-                            propertyJson = val.fd;
-                        }
-                        else
-                        {
+        for (const auto& [name, value] : propertiesList)
+        {
+            nlohmann::json& propertyJson = objectJson[name];
+            std::visit(
+                [&propertyJson](auto&& val) {
+                if constexpr (std::is_same_v<std::decay_t<decltype(val)>,
+                                             sdbusplus::message::unix_fd>)
+                {
+                    propertyJson = val.fd;
+                }
+                else
+                {
 
-                            propertyJson = val;
-                        }
-                    },
-                    value);
-            }
+                    propertyJson = val;
+                }
+                },
+                value);
+        }
         },
         service, objectPath, "org.freedesktop.DBus.Properties", "GetAll",
         interface);
@@ -263,63 +262,61 @@
         [transaction, objectName,
          connectionName](const boost::system::error_code ec,
                          const dbus::utility::ManagedObjectType& objects) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "GetManagedObjects on path " << objectName
-                                 << " on connection " << connectionName
-                                 << " failed with code " << ec;
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "GetManagedObjects on path " << objectName
+                             << " on connection " << connectionName
+                             << " failed with code " << ec;
+            return;
+        }
 
-            nlohmann::json& dataJson =
-                transaction->asyncResp->res.jsonValue["data"];
+        nlohmann::json& dataJson =
+            transaction->asyncResp->res.jsonValue["data"];
 
-            for (const auto& objectPath : objects)
+        for (const auto& objectPath : objects)
+        {
+            if (boost::starts_with(objectPath.first.str, objectName))
             {
-                if (boost::starts_with(objectPath.first.str, objectName))
+                BMCWEB_LOG_DEBUG << "Reading object " << objectPath.first.str;
+                nlohmann::json& objectJson = dataJson[objectPath.first.str];
+                if (objectJson.is_null())
                 {
-                    BMCWEB_LOG_DEBUG << "Reading object "
-                                     << objectPath.first.str;
-                    nlohmann::json& objectJson = dataJson[objectPath.first.str];
-                    if (objectJson.is_null())
-                    {
-                        objectJson = nlohmann::json::object();
-                    }
-                    for (const auto& interface : objectPath.second)
-                    {
-                        for (const auto& property : interface.second)
-                        {
-                            nlohmann::json& propertyJson =
-                                objectJson[property.first];
-                            std::visit(
-                                [&propertyJson](auto&& val) {
-                                    if constexpr (
-                                        std::is_same_v<
-                                            std::decay_t<decltype(val)>,
-                                            sdbusplus::message::unix_fd>)
-                                    {
-                                        propertyJson = val.fd;
-                                    }
-                                    else
-                                    {
-
-                                        propertyJson = val;
-                                    }
-                                },
-                                property.second);
-                        }
-                    }
+                    objectJson = nlohmann::json::object();
                 }
                 for (const auto& interface : objectPath.second)
                 {
-                    if (interface.first == "org.freedesktop.DBus.ObjectManager")
+                    for (const auto& property : interface.second)
                     {
-                        getManagedObjectsForEnumerate(
-                            objectPath.first.str, objectPath.first.str,
-                            connectionName, transaction);
+                        nlohmann::json& propertyJson =
+                            objectJson[property.first];
+                        std::visit(
+                            [&propertyJson](auto&& val) {
+                            if constexpr (std::is_same_v<
+                                              std::decay_t<decltype(val)>,
+                                              sdbusplus::message::unix_fd>)
+                            {
+                                propertyJson = val.fd;
+                            }
+                            else
+                            {
+
+                                propertyJson = val;
+                            }
+                            },
+                            property.second);
                     }
                 }
             }
+            for (const auto& interface : objectPath.second)
+            {
+                if (interface.first == "org.freedesktop.DBus.ObjectManager")
+                {
+                    getManagedObjectsForEnumerate(objectPath.first.str,
+                                                  objectPath.first.str,
+                                                  connectionName, transaction);
+                }
+            }
+        }
         },
         connectionName, objectManagerPath, "org.freedesktop.DBus.ObjectManager",
         "GetManagedObjects");
@@ -335,27 +332,26 @@
         [transaction, objectName, connectionName](
             const boost::system::error_code ec,
             const dbus::utility::MapperGetAncestorsResponse& objects) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "GetAncestors on path " << objectName
-                                 << " failed with code " << ec;
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "GetAncestors on path " << objectName
+                             << " failed with code " << ec;
+            return;
+        }
 
-            for (const auto& pathGroup : objects)
+        for (const auto& pathGroup : objects)
+        {
+            for (const auto& connectionGroup : pathGroup.second)
             {
-                for (const auto& connectionGroup : pathGroup.second)
+                if (connectionGroup.first == connectionName)
                 {
-                    if (connectionGroup.first == connectionName)
-                    {
-                        // Found the object manager path for this resource.
-                        getManagedObjectsForEnumerate(
-                            objectName, pathGroup.first, connectionName,
-                            transaction);
-                        return;
-                    }
+                    // Found the object manager path for this resource.
+                    getManagedObjectsForEnumerate(objectName, pathGroup.first,
+                                                  connectionName, transaction);
+                    return;
                 }
             }
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -372,66 +368,64 @@
     crow::connections::systemBus->async_method_call(
         [transaction](const boost::system::error_code ec,
                       const dbus::utility::MapperGetObject& objects) {
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "GetObject for path "
-                                 << transaction->objectPath
-                                 << " failed with code " << ec;
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "GetObject for path " << transaction->objectPath
+                             << " failed with code " << ec;
+            return;
+        }
 
-            BMCWEB_LOG_DEBUG << "GetObject for " << transaction->objectPath
-                             << " has " << objects.size() << " entries";
-            if (!objects.empty())
-            {
-                transaction->subtree->emplace_back(transaction->objectPath,
-                                                   objects);
-            }
+        BMCWEB_LOG_DEBUG << "GetObject for " << transaction->objectPath
+                         << " has " << objects.size() << " entries";
+        if (!objects.empty())
+        {
+            transaction->subtree->emplace_back(transaction->objectPath,
+                                               objects);
+        }
 
-            // Map indicating connection name, and the path where the object
-            // manager exists
-            boost::container::flat_map<std::string, std::string> connections;
+        // Map indicating connection name, and the path where the object
+        // manager exists
+        boost::container::flat_map<std::string, std::string> connections;
 
-            for (const auto& object : *(transaction->subtree))
+        for (const auto& object : *(transaction->subtree))
+        {
+            for (const auto& connection : object.second)
             {
-                for (const auto& connection : object.second)
+                std::string& objectManagerPath = connections[connection.first];
+                for (const auto& interface : connection.second)
                 {
-                    std::string& objectManagerPath =
-                        connections[connection.first];
-                    for (const auto& interface : connection.second)
+                    BMCWEB_LOG_DEBUG << connection.first << " has interface "
+                                     << interface;
+                    if (interface == "org.freedesktop.DBus.ObjectManager")
                     {
-                        BMCWEB_LOG_DEBUG << connection.first
-                                         << " has interface " << interface;
-                        if (interface == "org.freedesktop.DBus.ObjectManager")
-                        {
-                            BMCWEB_LOG_DEBUG << "found object manager path "
-                                             << object.first;
-                            objectManagerPath = object.first;
-                        }
+                        BMCWEB_LOG_DEBUG << "found object manager path "
+                                         << object.first;
+                        objectManagerPath = object.first;
                     }
                 }
             }
-            BMCWEB_LOG_DEBUG << "Got " << connections.size() << " connections";
+        }
+        BMCWEB_LOG_DEBUG << "Got " << connections.size() << " connections";
 
-            for (const auto& connection : connections)
+        for (const auto& connection : connections)
+        {
+            // If we already know where the object manager is, we don't
+            // need to search for it, we can call directly in to
+            // getManagedObjects
+            if (!connection.second.empty())
             {
-                // If we already know where the object manager is, we don't
-                // need to search for it, we can call directly in to
-                // getManagedObjects
-                if (!connection.second.empty())
-                {
-                    getManagedObjectsForEnumerate(
-                        transaction->objectPath, connection.second,
-                        connection.first, transaction);
-                }
-                else
-                {
-                    // otherwise we need to find the object manager path
-                    // before we can continue
-                    findObjectManagerPathForEnumerate(
-                        transaction->objectPath, connection.first, transaction);
-                }
+                getManagedObjectsForEnumerate(transaction->objectPath,
+                                              connection.second,
+                                              connection.first, transaction);
             }
+            else
+            {
+                // otherwise we need to find the object manager path
+                // before we can continue
+                findObjectManagerPathForEnumerate(
+                    transaction->objectPath, connection.first, transaction);
+            }
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1358,159 +1352,151 @@
         [transaction, connectionName{std::string(connectionName)}](
             const boost::system::error_code ec,
             const std::string& introspectXml) {
-            BMCWEB_LOG_DEBUG << "got xml:\n " << introspectXml;
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR
-                    << "Introspect call failed with error: " << ec.message()
-                    << " on process: " << connectionName << "\n";
-                return;
-            }
-            tinyxml2::XMLDocument doc;
+        BMCWEB_LOG_DEBUG << "got xml:\n " << introspectXml;
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR
+                << "Introspect call failed with error: " << ec.message()
+                << " on process: " << connectionName << "\n";
+            return;
+        }
+        tinyxml2::XMLDocument doc;
 
-            doc.Parse(introspectXml.data(), introspectXml.size());
-            tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
-            if (pRoot == nullptr)
+        doc.Parse(introspectXml.data(), introspectXml.size());
+        tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
+        if (pRoot == nullptr)
+        {
+            BMCWEB_LOG_ERROR << "XML document failed to parse "
+                             << connectionName << "\n";
+            return;
+        }
+        tinyxml2::XMLElement* interfaceNode =
+            pRoot->FirstChildElement("interface");
+        while (interfaceNode != nullptr)
+        {
+            const char* thisInterfaceName = interfaceNode->Attribute("name");
+            if (thisInterfaceName != nullptr)
             {
-                BMCWEB_LOG_ERROR << "XML document failed to parse "
-                                 << connectionName << "\n";
-                return;
-            }
-            tinyxml2::XMLElement* interfaceNode =
-                pRoot->FirstChildElement("interface");
-            while (interfaceNode != nullptr)
-            {
-                const char* thisInterfaceName =
-                    interfaceNode->Attribute("name");
-                if (thisInterfaceName != nullptr)
+                if (!transaction->interfaceName.empty() &&
+                    (transaction->interfaceName != thisInterfaceName))
                 {
-                    if (!transaction->interfaceName.empty() &&
-                        (transaction->interfaceName != thisInterfaceName))
-                    {
-                        interfaceNode =
-                            interfaceNode->NextSiblingElement("interface");
-                        continue;
-                    }
-
-                    tinyxml2::XMLElement* methodNode =
-                        interfaceNode->FirstChildElement("method");
-                    while (methodNode != nullptr)
-                    {
-                        const char* thisMethodName =
-                            methodNode->Attribute("name");
-                        BMCWEB_LOG_DEBUG << "Found method: " << thisMethodName;
-                        if (thisMethodName != nullptr &&
-                            thisMethodName == transaction->methodName)
-                        {
-                            BMCWEB_LOG_DEBUG
-                                << "Found method named " << thisMethodName
-                                << " on interface " << thisInterfaceName;
-                            sdbusplus::message::message m =
-                                crow::connections::systemBus->new_method_call(
-                                    connectionName.c_str(),
-                                    transaction->path.c_str(),
-                                    thisInterfaceName,
-                                    transaction->methodName.c_str());
-
-                            tinyxml2::XMLElement* argumentNode =
-                                methodNode->FirstChildElement("arg");
-
-                            std::string returnType;
-
-                            // Find the output type
-                            while (argumentNode != nullptr)
-                            {
-                                const char* argDirection =
-                                    argumentNode->Attribute("direction");
-                                const char* argType =
-                                    argumentNode->Attribute("type");
-                                if (argDirection != nullptr &&
-                                    argType != nullptr &&
-                                    std::string(argDirection) == "out")
-                                {
-                                    returnType = argType;
-                                    break;
-                                }
-                                argumentNode =
-                                    argumentNode->NextSiblingElement("arg");
-                            }
-
-                            nlohmann::json::const_iterator argIt =
-                                transaction->arguments.begin();
-
-                            argumentNode = methodNode->FirstChildElement("arg");
-
-                            while (argumentNode != nullptr)
-                            {
-                                const char* argDirection =
-                                    argumentNode->Attribute("direction");
-                                const char* argType =
-                                    argumentNode->Attribute("type");
-                                if (argDirection != nullptr &&
-                                    argType != nullptr &&
-                                    std::string(argDirection) == "in")
-                                {
-                                    if (argIt == transaction->arguments.end())
-                                    {
-                                        transaction->setErrorStatus(
-                                            "Invalid method args");
-                                        return;
-                                    }
-                                    if (convertJsonToDbus(m.get(),
-                                                          std::string(argType),
-                                                          *argIt) < 0)
-                                    {
-                                        transaction->setErrorStatus(
-                                            "Invalid method arg type");
-                                        return;
-                                    }
-
-                                    argIt++;
-                                }
-                                argumentNode =
-                                    argumentNode->NextSiblingElement("arg");
-                            }
-
-                            crow::connections::systemBus->async_send(
-                                m, [transaction, returnType](
-                                       boost::system::error_code ec2,
-                                       sdbusplus::message::message& m2) {
-                                    if (ec2)
-                                    {
-                                        transaction->methodFailed = true;
-                                        const sd_bus_error* e = m2.get_error();
-
-                                        if (e != nullptr)
-                                        {
-                                            setErrorResponse(
-                                                transaction->res,
-                                                boost::beast::http::status::
-                                                    bad_request,
-                                                e->name, e->message);
-                                        }
-                                        else
-                                        {
-                                            setErrorResponse(
-                                                transaction->res,
-                                                boost::beast::http::status::
-                                                    bad_request,
-                                                "Method call failed",
-                                                methodFailedMsg);
-                                        }
-                                        return;
-                                    }
-                                    transaction->methodPassed = true;
-
-                                    handleMethodResponse(transaction, m2,
-                                                         returnType);
-                                });
-                            break;
-                        }
-                        methodNode = methodNode->NextSiblingElement("method");
-                    }
+                    interfaceNode =
+                        interfaceNode->NextSiblingElement("interface");
+                    continue;
                 }
-                interfaceNode = interfaceNode->NextSiblingElement("interface");
+
+                tinyxml2::XMLElement* methodNode =
+                    interfaceNode->FirstChildElement("method");
+                while (methodNode != nullptr)
+                {
+                    const char* thisMethodName = methodNode->Attribute("name");
+                    BMCWEB_LOG_DEBUG << "Found method: " << thisMethodName;
+                    if (thisMethodName != nullptr &&
+                        thisMethodName == transaction->methodName)
+                    {
+                        BMCWEB_LOG_DEBUG << "Found method named "
+                                         << thisMethodName << " on interface "
+                                         << thisInterfaceName;
+                        sdbusplus::message::message m =
+                            crow::connections::systemBus->new_method_call(
+                                connectionName.c_str(),
+                                transaction->path.c_str(), thisInterfaceName,
+                                transaction->methodName.c_str());
+
+                        tinyxml2::XMLElement* argumentNode =
+                            methodNode->FirstChildElement("arg");
+
+                        std::string returnType;
+
+                        // Find the output type
+                        while (argumentNode != nullptr)
+                        {
+                            const char* argDirection =
+                                argumentNode->Attribute("direction");
+                            const char* argType =
+                                argumentNode->Attribute("type");
+                            if (argDirection != nullptr && argType != nullptr &&
+                                std::string(argDirection) == "out")
+                            {
+                                returnType = argType;
+                                break;
+                            }
+                            argumentNode =
+                                argumentNode->NextSiblingElement("arg");
+                        }
+
+                        nlohmann::json::const_iterator argIt =
+                            transaction->arguments.begin();
+
+                        argumentNode = methodNode->FirstChildElement("arg");
+
+                        while (argumentNode != nullptr)
+                        {
+                            const char* argDirection =
+                                argumentNode->Attribute("direction");
+                            const char* argType =
+                                argumentNode->Attribute("type");
+                            if (argDirection != nullptr && argType != nullptr &&
+                                std::string(argDirection) == "in")
+                            {
+                                if (argIt == transaction->arguments.end())
+                                {
+                                    transaction->setErrorStatus(
+                                        "Invalid method args");
+                                    return;
+                                }
+                                if (convertJsonToDbus(m.get(),
+                                                      std::string(argType),
+                                                      *argIt) < 0)
+                                {
+                                    transaction->setErrorStatus(
+                                        "Invalid method arg type");
+                                    return;
+                                }
+
+                                argIt++;
+                            }
+                            argumentNode =
+                                argumentNode->NextSiblingElement("arg");
+                        }
+
+                        crow::connections::systemBus->async_send(
+                            m,
+                            [transaction,
+                             returnType](boost::system::error_code ec2,
+                                         sdbusplus::message::message& m2) {
+                            if (ec2)
+                            {
+                                transaction->methodFailed = true;
+                                const sd_bus_error* e = m2.get_error();
+
+                                if (e != nullptr)
+                                {
+                                    setErrorResponse(
+                                        transaction->res,
+                                        boost::beast::http::status::bad_request,
+                                        e->name, e->message);
+                                }
+                                else
+                                {
+                                    setErrorResponse(
+                                        transaction->res,
+                                        boost::beast::http::status::bad_request,
+                                        "Method call failed", methodFailedMsg);
+                                }
+                                return;
+                            }
+                            transaction->methodPassed = true;
+
+                            handleMethodResponse(transaction, m2, returnType);
+                            });
+                        break;
+                    }
+                    methodNode = methodNode->NextSiblingElement("method");
+                }
             }
+            interfaceNode = interfaceNode->NextSiblingElement("interface");
+        }
         },
         connectionName, transaction->path,
         "org.freedesktop.DBus.Introspectable", "Introspect");
@@ -1559,23 +1545,23 @@
             const boost::system::error_code ec,
             const std::vector<std::pair<std::string, std::vector<std::string>>>&
                 interfaceNames) {
-            if (ec || interfaceNames.empty())
-            {
-                BMCWEB_LOG_ERROR << "Can't find object";
-                setErrorResponse(transaction->res,
-                                 boost::beast::http::status::not_found,
-                                 notFoundDesc, notFoundMsg);
-                return;
-            }
+        if (ec || interfaceNames.empty())
+        {
+            BMCWEB_LOG_ERROR << "Can't find object";
+            setErrorResponse(transaction->res,
+                             boost::beast::http::status::not_found,
+                             notFoundDesc, notFoundMsg);
+            return;
+        }
 
-            BMCWEB_LOG_DEBUG << "GetObject returned " << interfaceNames.size()
-                             << " object(s)";
+        BMCWEB_LOG_DEBUG << "GetObject returned " << interfaceNames.size()
+                         << " object(s)";
 
-            for (const std::pair<std::string, std::vector<std::string>>&
-                     object : interfaceNames)
-            {
-                findActionOnInterface(transaction, object.first);
-            }
+        for (const std::pair<std::string, std::vector<std::string>>& object :
+             interfaceNames)
+        {
+            findActionOnInterface(transaction, object.first);
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1593,26 +1579,26 @@
             const boost::system::error_code ec,
             const std::vector<std::pair<std::string, std::vector<std::string>>>&
                 interfaceNames) {
-            if (ec || interfaceNames.empty())
-            {
-                BMCWEB_LOG_ERROR << "Can't find object";
-                setErrorResponse(asyncResp->res,
-                                 boost::beast::http::status::method_not_allowed,
-                                 methodNotAllowedDesc, methodNotAllowedMsg);
-                return;
-            }
+        if (ec || interfaceNames.empty())
+        {
+            BMCWEB_LOG_ERROR << "Can't find object";
+            setErrorResponse(asyncResp->res,
+                             boost::beast::http::status::method_not_allowed,
+                             methodNotAllowedDesc, methodNotAllowedMsg);
+            return;
+        }
 
-            auto transaction =
-                std::make_shared<InProgressActionData>(asyncResp->res);
-            transaction->path = objectPath;
-            transaction->methodName = "Delete";
-            transaction->interfaceName = "xyz.openbmc_project.Object.Delete";
+        auto transaction =
+            std::make_shared<InProgressActionData>(asyncResp->res);
+        transaction->path = objectPath;
+        transaction->methodName = "Delete";
+        transaction->interfaceName = "xyz.openbmc_project.Object.Delete";
 
-            for (const std::pair<std::string, std::vector<std::string>>&
-                     object : interfaceNames)
-            {
-                findActionOnInterface(transaction, object.first);
-            }
+        for (const std::pair<std::string, std::vector<std::string>>& object :
+             interfaceNames)
+        {
+            findActionOnInterface(transaction, object.first);
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1627,18 +1613,18 @@
         [asyncResp](
             const boost::system::error_code ec,
             const dbus::utility::MapperGetSubTreePathsResponse& objectPaths) {
-            if (ec)
-            {
-                setErrorResponse(asyncResp->res,
-                                 boost::beast::http::status::not_found,
-                                 notFoundDesc, notFoundMsg);
-            }
-            else
-            {
-                asyncResp->res.jsonValue["status"] = "ok";
-                asyncResp->res.jsonValue["message"] = "200 OK";
-                asyncResp->res.jsonValue["data"] = objectPaths;
-            }
+        if (ec)
+        {
+            setErrorResponse(asyncResp->res,
+                             boost::beast::http::status::not_found,
+                             notFoundDesc, notFoundMsg);
+        }
+        else
+        {
+            asyncResp->res.jsonValue["status"] = "ok";
+            asyncResp->res.jsonValue["message"] = "200 OK";
+            asyncResp->res.jsonValue["data"] = objectPaths;
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1659,26 +1645,26 @@
         [objectPath, asyncResp](
             const boost::system::error_code ec,
             const dbus::utility::MapperGetSubTreeResponse& objectNames) {
-            auto transaction = std::make_shared<InProgressEnumerateData>(
-                objectPath, asyncResp);
+        auto transaction =
+            std::make_shared<InProgressEnumerateData>(objectPath, asyncResp);
 
-            transaction->subtree =
-                std::make_shared<dbus::utility::MapperGetSubTreeResponse>(
-                    objectNames);
+        transaction->subtree =
+            std::make_shared<dbus::utility::MapperGetSubTreeResponse>(
+                objectNames);
 
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "GetSubTree failed on "
-                                 << transaction->objectPath;
-                setErrorResponse(transaction->asyncResp->res,
-                                 boost::beast::http::status::not_found,
-                                 notFoundDesc, notFoundMsg);
-                return;
-            }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "GetSubTree failed on "
+                             << transaction->objectPath;
+            setErrorResponse(transaction->asyncResp->res,
+                             boost::beast::http::status::not_found,
+                             notFoundDesc, notFoundMsg);
+            return;
+        }
 
-            // Add the data for the path passed in to the results
-            // as if GetSubTree returned it, and continue on enumerating
-            getObjectAndEnumerate(transaction);
+        // Add the data for the path passed in to the results
+        // as if GetSubTree returned it, and continue on enumerating
+        getObjectAndEnumerate(transaction);
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1700,98 +1686,93 @@
         [asyncResp, path,
          propertyName](const boost::system::error_code ec,
                        const dbus::utility::MapperGetObject& objectNames) {
-            if (ec || objectNames.empty())
+        if (ec || objectNames.empty())
+        {
+            setErrorResponse(asyncResp->res,
+                             boost::beast::http::status::not_found,
+                             notFoundDesc, notFoundMsg);
+            return;
+        }
+        std::shared_ptr<nlohmann::json> response =
+            std::make_shared<nlohmann::json>(nlohmann::json::object());
+        // The mapper should never give us an empty interface names
+        // list, but check anyway
+        for (const std::pair<std::string, std::vector<std::string>>&
+                 connection : objectNames)
+        {
+            const std::vector<std::string>& interfaceNames = connection.second;
+
+            if (interfaceNames.empty())
             {
                 setErrorResponse(asyncResp->res,
                                  boost::beast::http::status::not_found,
                                  notFoundDesc, notFoundMsg);
                 return;
             }
-            std::shared_ptr<nlohmann::json> response =
-                std::make_shared<nlohmann::json>(nlohmann::json::object());
-            // The mapper should never give us an empty interface names
-            // list, but check anyway
-            for (const std::pair<std::string, std::vector<std::string>>&
-                     connection : objectNames)
+
+            for (const std::string& interface : interfaceNames)
             {
-                const std::vector<std::string>& interfaceNames =
-                    connection.second;
-
-                if (interfaceNames.empty())
-                {
-                    setErrorResponse(asyncResp->res,
-                                     boost::beast::http::status::not_found,
-                                     notFoundDesc, notFoundMsg);
-                    return;
-                }
-
-                for (const std::string& interface : interfaceNames)
-                {
-                    sdbusplus::message::message m =
-                        crow::connections::systemBus->new_method_call(
-                            connection.first.c_str(), path->c_str(),
-                            "org.freedesktop.DBus.Properties", "GetAll");
-                    m.append(interface);
-                    crow::connections::systemBus->async_send(
-                        m, [asyncResp, response,
-                            propertyName](const boost::system::error_code ec2,
-                                          sdbusplus::message::message& msg) {
-                            if (ec2)
+                sdbusplus::message::message m =
+                    crow::connections::systemBus->new_method_call(
+                        connection.first.c_str(), path->c_str(),
+                        "org.freedesktop.DBus.Properties", "GetAll");
+                m.append(interface);
+                crow::connections::systemBus->async_send(
+                    m, [asyncResp, response,
+                        propertyName](const boost::system::error_code ec2,
+                                      sdbusplus::message::message& msg) {
+                        if (ec2)
+                        {
+                            BMCWEB_LOG_ERROR << "Bad dbus request error: "
+                                             << ec2;
+                        }
+                        else
+                        {
+                            nlohmann::json properties;
+                            int r = convertDBusToJSON("a{sv}", msg, properties);
+                            if (r < 0)
                             {
-                                BMCWEB_LOG_ERROR << "Bad dbus request error: "
-                                                 << ec2;
+                                BMCWEB_LOG_ERROR << "convertDBusToJSON failed";
                             }
                             else
                             {
-                                nlohmann::json properties;
-                                int r =
-                                    convertDBusToJSON("a{sv}", msg, properties);
-                                if (r < 0)
+                                for (auto& prop : properties.items())
                                 {
-                                    BMCWEB_LOG_ERROR
-                                        << "convertDBusToJSON failed";
-                                }
-                                else
-                                {
-                                    for (auto& prop : properties.items())
-                                    {
-                                        // if property name is empty, or
-                                        // matches our search query, add it
-                                        // to the response json
+                                    // if property name is empty, or
+                                    // matches our search query, add it
+                                    // to the response json
 
-                                        if (propertyName->empty())
-                                        {
-                                            (*response)[prop.key()] =
-                                                std::move(prop.value());
-                                        }
-                                        else if (prop.key() == *propertyName)
-                                        {
-                                            *response = std::move(prop.value());
-                                        }
+                                    if (propertyName->empty())
+                                    {
+                                        (*response)[prop.key()] =
+                                            std::move(prop.value());
+                                    }
+                                    else if (prop.key() == *propertyName)
+                                    {
+                                        *response = std::move(prop.value());
                                     }
                                 }
                             }
-                            if (response.use_count() == 1)
+                        }
+                        if (response.use_count() == 1)
+                        {
+                            if (!propertyName->empty() && response->empty())
                             {
-                                if (!propertyName->empty() && response->empty())
-                                {
-                                    setErrorResponse(
-                                        asyncResp->res,
-                                        boost::beast::http::status::not_found,
-                                        propNotFoundDesc, notFoundMsg);
-                                }
-                                else
-                                {
-                                    asyncResp->res.jsonValue["status"] = "ok";
-                                    asyncResp->res.jsonValue["message"] =
-                                        "200 OK";
-                                    asyncResp->res.jsonValue["data"] =
-                                        *response;
-                                }
+                                setErrorResponse(
+                                    asyncResp->res,
+                                    boost::beast::http::status::not_found,
+                                    propNotFoundDesc, notFoundMsg);
                             }
-                        });
-                }
+                            else
+                            {
+                                asyncResp->res.jsonValue["status"] = "ok";
+                                asyncResp->res.jsonValue["message"] = "200 OK";
+                                asyncResp->res.jsonValue["data"] = *response;
+                            }
+                        }
+                    });
             }
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1872,169 +1853,142 @@
     crow::connections::systemBus->async_method_call(
         [transaction](const boost::system::error_code ec2,
                       const dbus::utility::MapperGetObject& objectNames) {
-            if (!ec2 && objectNames.empty())
-            {
-                setErrorResponse(transaction->asyncResp->res,
-                                 boost::beast::http::status::not_found,
-                                 propNotFoundDesc, notFoundMsg);
-                return;
-            }
+        if (!ec2 && objectNames.empty())
+        {
+            setErrorResponse(transaction->asyncResp->res,
+                             boost::beast::http::status::not_found,
+                             propNotFoundDesc, notFoundMsg);
+            return;
+        }
 
-            for (const std::pair<std::string, std::vector<std::string>>&
-                     connection : objectNames)
-            {
-                const std::string& connectionName = connection.first;
+        for (const std::pair<std::string, std::vector<std::string>>&
+                 connection : objectNames)
+        {
+            const std::string& connectionName = connection.first;
 
-                crow::connections::systemBus->async_method_call(
-                    [connectionName{std::string(connectionName)},
-                     transaction](const boost::system::error_code ec3,
-                                  const std::string& introspectXml) {
-                        if (ec3)
-                        {
-                            BMCWEB_LOG_ERROR
-                                << "Introspect call failed with error: "
-                                << ec3.message()
-                                << " on process: " << connectionName;
-                            transaction->setErrorStatus("Unexpected Error");
-                            return;
-                        }
-                        tinyxml2::XMLDocument doc;
+            crow::connections::systemBus->async_method_call(
+                [connectionName{std::string(connectionName)},
+                 transaction](const boost::system::error_code ec3,
+                              const std::string& introspectXml) {
+                if (ec3)
+                {
+                    BMCWEB_LOG_ERROR << "Introspect call failed with error: "
+                                     << ec3.message()
+                                     << " on process: " << connectionName;
+                    transaction->setErrorStatus("Unexpected Error");
+                    return;
+                }
+                tinyxml2::XMLDocument doc;
 
-                        doc.Parse(introspectXml.c_str());
-                        tinyxml2::XMLNode* pRoot =
-                            doc.FirstChildElement("node");
-                        if (pRoot == nullptr)
+                doc.Parse(introspectXml.c_str());
+                tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
+                if (pRoot == nullptr)
+                {
+                    BMCWEB_LOG_ERROR << "XML document failed to parse: "
+                                     << introspectXml;
+                    transaction->setErrorStatus("Unexpected Error");
+                    return;
+                }
+                tinyxml2::XMLElement* ifaceNode =
+                    pRoot->FirstChildElement("interface");
+                while (ifaceNode != nullptr)
+                {
+                    const char* interfaceName = ifaceNode->Attribute("name");
+                    BMCWEB_LOG_DEBUG << "found interface " << interfaceName;
+                    tinyxml2::XMLElement* propNode =
+                        ifaceNode->FirstChildElement("property");
+                    while (propNode != nullptr)
+                    {
+                        const char* propertyName = propNode->Attribute("name");
+                        BMCWEB_LOG_DEBUG << "Found property " << propertyName;
+                        if (propertyName == transaction->propertyName)
                         {
-                            BMCWEB_LOG_ERROR << "XML document failed to parse: "
-                                             << introspectXml;
-                            transaction->setErrorStatus("Unexpected Error");
-                            return;
-                        }
-                        tinyxml2::XMLElement* ifaceNode =
-                            pRoot->FirstChildElement("interface");
-                        while (ifaceNode != nullptr)
-                        {
-                            const char* interfaceName =
-                                ifaceNode->Attribute("name");
-                            BMCWEB_LOG_DEBUG << "found interface "
-                                             << interfaceName;
-                            tinyxml2::XMLElement* propNode =
-                                ifaceNode->FirstChildElement("property");
-                            while (propNode != nullptr)
+                            const char* argType = propNode->Attribute("type");
+                            if (argType != nullptr)
                             {
-                                const char* propertyName =
-                                    propNode->Attribute("name");
-                                BMCWEB_LOG_DEBUG << "Found property "
-                                                 << propertyName;
-                                if (propertyName == transaction->propertyName)
+                                sdbusplus::message::message m =
+                                    crow::connections::systemBus
+                                        ->new_method_call(
+                                            connectionName.c_str(),
+                                            transaction->objectPath.c_str(),
+                                            "org.freedesktop.DBus."
+                                            "Properties",
+                                            "Set");
+                                m.append(interfaceName,
+                                         transaction->propertyName);
+                                int r = sd_bus_message_open_container(
+                                    m.get(), SD_BUS_TYPE_VARIANT, argType);
+                                if (r < 0)
                                 {
-                                    const char* argType =
-                                        propNode->Attribute("type");
-                                    if (argType != nullptr)
-                                    {
-                                        sdbusplus::message::message m =
-                                            crow::connections::systemBus
-                                                ->new_method_call(
-                                                    connectionName.c_str(),
-                                                    transaction->objectPath
-                                                        .c_str(),
-                                                    "org.freedesktop.DBus."
-                                                    "Properties",
-                                                    "Set");
-                                        m.append(interfaceName,
-                                                 transaction->propertyName);
-                                        int r = sd_bus_message_open_container(
-                                            m.get(), SD_BUS_TYPE_VARIANT,
-                                            argType);
-                                        if (r < 0)
-                                        {
-                                            transaction->setErrorStatus(
-                                                "Unexpected Error");
-                                            return;
-                                        }
-                                        r = convertJsonToDbus(
-                                            m.get(), argType,
-                                            transaction->propertyValue);
-                                        if (r < 0)
-                                        {
-                                            if (r == -ERANGE)
-                                            {
-                                                transaction->setErrorStatus(
-                                                    "Provided property value "
-                                                    "is out of range for the "
-                                                    "property type");
-                                            }
-                                            else
-                                            {
-                                                transaction->setErrorStatus(
-                                                    "Invalid arg type");
-                                            }
-                                            return;
-                                        }
-                                        r = sd_bus_message_close_container(
-                                            m.get());
-                                        if (r < 0)
-                                        {
-                                            transaction->setErrorStatus(
-                                                "Unexpected Error");
-                                            return;
-                                        }
-                                        crow::connections::systemBus
-                                            ->async_send(
-                                                m,
-                                                [transaction](
-                                                    boost::system::error_code
-                                                        ec,
-                                                    sdbusplus::message::message&
-                                                        m2) {
-                                                    BMCWEB_LOG_DEBUG << "sent";
-                                                    if (ec)
-                                                    {
-                                                        const sd_bus_error* e =
-                                                            m2.get_error();
-                                                        setErrorResponse(
-                                                            transaction
-                                                                ->asyncResp
-                                                                ->res,
-                                                            boost::beast::http::
-                                                                status::
-                                                                    forbidden,
-                                                            (e) != nullptr
-                                                                ? e->name
-                                                                : ec.category()
-                                                                      .name(),
-                                                            (e) != nullptr
-                                                                ? e->message
-                                                                : ec.message());
-                                                    }
-                                                    else
-                                                    {
-                                                        transaction->asyncResp
-                                                            ->res.jsonValue
-                                                                ["status"] =
-                                                            "ok";
-                                                        transaction->asyncResp
-                                                            ->res.jsonValue
-                                                                ["message"] =
-                                                            "200 OK";
-                                                        transaction->asyncResp
-                                                            ->res
-                                                            .jsonValue["data"] =
-                                                            nullptr;
-                                                    }
-                                                });
-                                    }
+                                    transaction->setErrorStatus(
+                                        "Unexpected Error");
+                                    return;
                                 }
-                                propNode =
-                                    propNode->NextSiblingElement("property");
+                                r = convertJsonToDbus(
+                                    m.get(), argType,
+                                    transaction->propertyValue);
+                                if (r < 0)
+                                {
+                                    if (r == -ERANGE)
+                                    {
+                                        transaction->setErrorStatus(
+                                            "Provided property value "
+                                            "is out of range for the "
+                                            "property type");
+                                    }
+                                    else
+                                    {
+                                        transaction->setErrorStatus(
+                                            "Invalid arg type");
+                                    }
+                                    return;
+                                }
+                                r = sd_bus_message_close_container(m.get());
+                                if (r < 0)
+                                {
+                                    transaction->setErrorStatus(
+                                        "Unexpected Error");
+                                    return;
+                                }
+                                crow::connections::systemBus->async_send(
+                                    m,
+                                    [transaction](
+                                        boost::system::error_code ec,
+                                        sdbusplus::message::message& m2) {
+                                    BMCWEB_LOG_DEBUG << "sent";
+                                    if (ec)
+                                    {
+                                        const sd_bus_error* e = m2.get_error();
+                                        setErrorResponse(
+                                            transaction->asyncResp->res,
+                                            boost::beast::http::status::
+                                                forbidden,
+                                            (e) != nullptr
+                                                ? e->name
+                                                : ec.category().name(),
+                                            (e) != nullptr ? e->message
+                                                           : ec.message());
+                                    }
+                                    else
+                                    {
+                                        transaction->asyncResp->res
+                                            .jsonValue["status"] = "ok";
+                                        transaction->asyncResp->res
+                                            .jsonValue["message"] = "200 OK";
+                                        transaction->asyncResp->res
+                                            .jsonValue["data"] = nullptr;
+                                    }
+                                    });
                             }
-                            ifaceNode =
-                                ifaceNode->NextSiblingElement("interface");
                         }
-                    },
-                    connectionName, transaction->objectPath,
-                    "org.freedesktop.DBus.Introspectable", "Introspect");
-            }
+                        propNode = propNode->NextSiblingElement("property");
+                    }
+                    ifaceNode = ifaceNode->NextSiblingElement("interface");
+                }
+                },
+                connectionName, transaction->objectPath,
+                "org.freedesktop.DBus.Introspectable", "Introspect");
+        }
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -2177,52 +2131,51 @@
             [asyncResp, processName,
              objectPath](const boost::system::error_code ec,
                          const std::string& introspectXml) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR
-                        << "Introspect call failed with error: " << ec.message()
-                        << " on process: " << processName
-                        << " path: " << objectPath << "\n";
-                    return;
-                }
-                tinyxml2::XMLDocument doc;
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR
+                    << "Introspect call failed with error: " << ec.message()
+                    << " on process: " << processName << " path: " << objectPath
+                    << "\n";
+                return;
+            }
+            tinyxml2::XMLDocument doc;
 
-                doc.Parse(introspectXml.c_str());
-                tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
-                if (pRoot == nullptr)
+            doc.Parse(introspectXml.c_str());
+            tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
+            if (pRoot == nullptr)
+            {
+                BMCWEB_LOG_ERROR << "XML document failed to parse "
+                                 << processName << " " << objectPath << "\n";
+                asyncResp->res.jsonValue["status"] = "XML parse error";
+                asyncResp->res.result(
+                    boost::beast::http::status::internal_server_error);
+                return;
+            }
+
+            BMCWEB_LOG_DEBUG << introspectXml;
+            asyncResp->res.jsonValue["status"] = "ok";
+            asyncResp->res.jsonValue["bus_name"] = processName;
+            asyncResp->res.jsonValue["object_path"] = objectPath;
+
+            nlohmann::json& interfacesArray =
+                asyncResp->res.jsonValue["interfaces"];
+            interfacesArray = nlohmann::json::array();
+            tinyxml2::XMLElement* interface =
+                pRoot->FirstChildElement("interface");
+
+            while (interface != nullptr)
+            {
+                const char* ifaceName = interface->Attribute("name");
+                if (ifaceName != nullptr)
                 {
-                    BMCWEB_LOG_ERROR << "XML document failed to parse "
-                                     << processName << " " << objectPath
-                                     << "\n";
-                    asyncResp->res.jsonValue["status"] = "XML parse error";
-                    asyncResp->res.result(
-                        boost::beast::http::status::internal_server_error);
-                    return;
+                    nlohmann::json::object_t interface;
+                    interface["name"] = ifaceName;
+                    interfacesArray.push_back(std::move(interface));
                 }
 
-                BMCWEB_LOG_DEBUG << introspectXml;
-                asyncResp->res.jsonValue["status"] = "ok";
-                asyncResp->res.jsonValue["bus_name"] = processName;
-                asyncResp->res.jsonValue["object_path"] = objectPath;
-
-                nlohmann::json& interfacesArray =
-                    asyncResp->res.jsonValue["interfaces"];
-                interfacesArray = nlohmann::json::array();
-                tinyxml2::XMLElement* interface =
-                    pRoot->FirstChildElement("interface");
-
-                while (interface != nullptr)
-                {
-                    const char* ifaceName = interface->Attribute("name");
-                    if (ifaceName != nullptr)
-                    {
-                        nlohmann::json::object_t interface;
-                        interface["name"] = ifaceName;
-                        interfacesArray.push_back(std::move(interface));
-                    }
-
-                    interface = interface->NextSiblingElement("interface");
-                }
+                interface = interface->NextSiblingElement("interface");
+            }
             },
             processName, objectPath, "org.freedesktop.DBus.Introspectable",
             "Introspect");
@@ -2233,180 +2186,173 @@
             [asyncResp, processName, objectPath,
              interfaceName](const boost::system::error_code ec,
                             const std::string& introspectXml) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR
-                        << "Introspect call failed with error: " << ec.message()
-                        << " on process: " << processName
-                        << " path: " << objectPath << "\n";
-                    return;
-                }
-                tinyxml2::XMLDocument doc;
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR
+                    << "Introspect call failed with error: " << ec.message()
+                    << " on process: " << processName << " path: " << objectPath
+                    << "\n";
+                return;
+            }
+            tinyxml2::XMLDocument doc;
 
-                doc.Parse(introspectXml.data(), introspectXml.size());
-                tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
-                if (pRoot == nullptr)
+            doc.Parse(introspectXml.data(), introspectXml.size());
+            tinyxml2::XMLNode* pRoot = doc.FirstChildElement("node");
+            if (pRoot == nullptr)
+            {
+                BMCWEB_LOG_ERROR << "XML document failed to parse "
+                                 << processName << " " << objectPath << "\n";
+                asyncResp->res.result(
+                    boost::beast::http::status::internal_server_error);
+                return;
+            }
+
+            asyncResp->res.jsonValue["status"] = "ok";
+            asyncResp->res.jsonValue["bus_name"] = processName;
+            asyncResp->res.jsonValue["interface"] = interfaceName;
+            asyncResp->res.jsonValue["object_path"] = objectPath;
+
+            nlohmann::json& methodsArray = asyncResp->res.jsonValue["methods"];
+            methodsArray = nlohmann::json::array();
+
+            nlohmann::json& signalsArray = asyncResp->res.jsonValue["signals"];
+            signalsArray = nlohmann::json::array();
+
+            nlohmann::json& propertiesObj =
+                asyncResp->res.jsonValue["properties"];
+            propertiesObj = nlohmann::json::object();
+
+            // if we know we're the only call, build the
+            // json directly
+            tinyxml2::XMLElement* interface =
+                pRoot->FirstChildElement("interface");
+            while (interface != nullptr)
+            {
+                const char* ifaceName = interface->Attribute("name");
+
+                if (ifaceName != nullptr && ifaceName == interfaceName)
                 {
-                    BMCWEB_LOG_ERROR << "XML document failed to parse "
-                                     << processName << " " << objectPath
-                                     << "\n";
-                    asyncResp->res.result(
-                        boost::beast::http::status::internal_server_error);
-                    return;
+                    break;
                 }
 
-                asyncResp->res.jsonValue["status"] = "ok";
-                asyncResp->res.jsonValue["bus_name"] = processName;
-                asyncResp->res.jsonValue["interface"] = interfaceName;
-                asyncResp->res.jsonValue["object_path"] = objectPath;
+                interface = interface->NextSiblingElement("interface");
+            }
+            if (interface == nullptr)
+            {
+                // if we got to the end of the list and
+                // never found a match, throw 404
+                asyncResp->res.result(boost::beast::http::status::not_found);
+                return;
+            }
 
-                nlohmann::json& methodsArray =
-                    asyncResp->res.jsonValue["methods"];
-                methodsArray = nlohmann::json::array();
-
-                nlohmann::json& signalsArray =
-                    asyncResp->res.jsonValue["signals"];
-                signalsArray = nlohmann::json::array();
-
-                nlohmann::json& propertiesObj =
-                    asyncResp->res.jsonValue["properties"];
-                propertiesObj = nlohmann::json::object();
-
-                // if we know we're the only call, build the
-                // json directly
-                tinyxml2::XMLElement* interface =
-                    pRoot->FirstChildElement("interface");
-                while (interface != nullptr)
+            tinyxml2::XMLElement* methods =
+                interface->FirstChildElement("method");
+            while (methods != nullptr)
+            {
+                nlohmann::json argsArray = nlohmann::json::array();
+                tinyxml2::XMLElement* arg = methods->FirstChildElement("arg");
+                while (arg != nullptr)
                 {
-                    const char* ifaceName = interface->Attribute("name");
-
-                    if (ifaceName != nullptr && ifaceName == interfaceName)
+                    nlohmann::json thisArg;
+                    for (const char* fieldName : std::array<const char*, 3>{
+                             "name", "direction", "type"})
                     {
-                        break;
-                    }
-
-                    interface = interface->NextSiblingElement("interface");
-                }
-                if (interface == nullptr)
-                {
-                    // if we got to the end of the list and
-                    // never found a match, throw 404
-                    asyncResp->res.result(
-                        boost::beast::http::status::not_found);
-                    return;
-                }
-
-                tinyxml2::XMLElement* methods =
-                    interface->FirstChildElement("method");
-                while (methods != nullptr)
-                {
-                    nlohmann::json argsArray = nlohmann::json::array();
-                    tinyxml2::XMLElement* arg =
-                        methods->FirstChildElement("arg");
-                    while (arg != nullptr)
-                    {
-                        nlohmann::json thisArg;
-                        for (const char* fieldName : std::array<const char*, 3>{
-                                 "name", "direction", "type"})
+                        const char* fieldValue = arg->Attribute(fieldName);
+                        if (fieldValue != nullptr)
                         {
-                            const char* fieldValue = arg->Attribute(fieldName);
-                            if (fieldValue != nullptr)
+                            thisArg[fieldName] = fieldValue;
+                        }
+                    }
+                    argsArray.push_back(std::move(thisArg));
+                    arg = arg->NextSiblingElement("arg");
+                }
+
+                const char* name = methods->Attribute("name");
+                if (name != nullptr)
+                {
+                    std::string uri;
+                    uri.reserve(14 + processName.size() + objectPath.size() +
+                                interfaceName.size() + strlen(name));
+                    uri += "/bus/system/";
+                    uri += processName;
+                    uri += objectPath;
+                    uri += "/";
+                    uri += interfaceName;
+                    uri += "/";
+                    uri += name;
+
+                    nlohmann::json::object_t object;
+                    object["name"] = name;
+                    object["uri"] = std::move(uri);
+                    object["args"] = argsArray;
+
+                    methodsArray.push_back(std::move(object));
+                }
+                methods = methods->NextSiblingElement("method");
+            }
+            tinyxml2::XMLElement* signals =
+                interface->FirstChildElement("signal");
+            while (signals != nullptr)
+            {
+                nlohmann::json argsArray = nlohmann::json::array();
+
+                tinyxml2::XMLElement* arg = signals->FirstChildElement("arg");
+                while (arg != nullptr)
+                {
+                    const char* name = arg->Attribute("name");
+                    const char* type = arg->Attribute("type");
+                    if (name != nullptr && type != nullptr)
+                    {
+                        argsArray.push_back({
+                            {"name", name},
+                            {"type", type},
+                        });
+                    }
+                    arg = arg->NextSiblingElement("arg");
+                }
+                const char* name = signals->Attribute("name");
+                if (name != nullptr)
+                {
+                    nlohmann::json::object_t object;
+                    object["name"] = name;
+                    object["args"] = argsArray;
+                    signalsArray.push_back(std::move(object));
+                }
+
+                signals = signals->NextSiblingElement("signal");
+            }
+
+            tinyxml2::XMLElement* property =
+                interface->FirstChildElement("property");
+            while (property != nullptr)
+            {
+                const char* name = property->Attribute("name");
+                const char* type = property->Attribute("type");
+                if (type != nullptr && name != nullptr)
+                {
+                    sdbusplus::message::message m =
+                        crow::connections::systemBus->new_method_call(
+                            processName.c_str(), objectPath.c_str(),
+                            "org.freedesktop."
+                            "DBus."
+                            "Properties",
+                            "Get");
+                    m.append(interfaceName, name);
+                    nlohmann::json& propertyItem = propertiesObj[name];
+                    crow::connections::systemBus->async_send(
+                        m, [&propertyItem,
+                            asyncResp](boost::system::error_code& e,
+                                       sdbusplus::message::message& msg) {
+                            if (e)
                             {
-                                thisArg[fieldName] = fieldValue;
+                                return;
                             }
-                        }
-                        argsArray.push_back(std::move(thisArg));
-                        arg = arg->NextSiblingElement("arg");
-                    }
 
-                    const char* name = methods->Attribute("name");
-                    if (name != nullptr)
-                    {
-                        std::string uri;
-                        uri.reserve(14 + processName.size() +
-                                    objectPath.size() + interfaceName.size() +
-                                    strlen(name));
-                        uri += "/bus/system/";
-                        uri += processName;
-                        uri += objectPath;
-                        uri += "/";
-                        uri += interfaceName;
-                        uri += "/";
-                        uri += name;
-
-                        nlohmann::json::object_t object;
-                        object["name"] = name;
-                        object["uri"] = std::move(uri);
-                        object["args"] = argsArray;
-
-                        methodsArray.push_back(std::move(object));
-                    }
-                    methods = methods->NextSiblingElement("method");
+                            convertDBusToJSON("v", msg, propertyItem);
+                        });
                 }
-                tinyxml2::XMLElement* signals =
-                    interface->FirstChildElement("signal");
-                while (signals != nullptr)
-                {
-                    nlohmann::json argsArray = nlohmann::json::array();
-
-                    tinyxml2::XMLElement* arg =
-                        signals->FirstChildElement("arg");
-                    while (arg != nullptr)
-                    {
-                        const char* name = arg->Attribute("name");
-                        const char* type = arg->Attribute("type");
-                        if (name != nullptr && type != nullptr)
-                        {
-                            argsArray.push_back({
-                                {"name", name},
-                                {"type", type},
-                            });
-                        }
-                        arg = arg->NextSiblingElement("arg");
-                    }
-                    const char* name = signals->Attribute("name");
-                    if (name != nullptr)
-                    {
-                        nlohmann::json::object_t object;
-                        object["name"] = name;
-                        object["args"] = argsArray;
-                        signalsArray.push_back(std::move(object));
-                    }
-
-                    signals = signals->NextSiblingElement("signal");
-                }
-
-                tinyxml2::XMLElement* property =
-                    interface->FirstChildElement("property");
-                while (property != nullptr)
-                {
-                    const char* name = property->Attribute("name");
-                    const char* type = property->Attribute("type");
-                    if (type != nullptr && name != nullptr)
-                    {
-                        sdbusplus::message::message m =
-                            crow::connections::systemBus->new_method_call(
-                                processName.c_str(), objectPath.c_str(),
-                                "org.freedesktop."
-                                "DBus."
-                                "Properties",
-                                "Get");
-                        m.append(interfaceName, name);
-                        nlohmann::json& propertyItem = propertiesObj[name];
-                        crow::connections::systemBus->async_send(
-                            m, [&propertyItem,
-                                asyncResp](boost::system::error_code& e,
-                                           sdbusplus::message::message& msg) {
-                                if (e)
-                                {
-                                    return;
-                                }
-
-                                convertDBusToJSON("v", msg, propertyItem);
-                            });
-                    }
-                    property = property->NextSiblingElement("property");
-                }
+                property = property->NextSiblingElement("property");
+            }
             },
             processName, objectPath, "org.freedesktop.DBus.Introspectable",
             "Introspect");
@@ -2450,52 +2396,51 @@
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                nlohmann::json::array_t buses;
-                nlohmann::json& bus = buses.emplace_back();
-                bus["name"] = "system";
-                asyncResp->res.jsonValue["busses"] = std::move(buses);
-                asyncResp->res.jsonValue["status"] = "ok";
-            });
+        nlohmann::json::array_t buses;
+        nlohmann::json& bus = buses.emplace_back();
+        bus["name"] = "system";
+        asyncResp->res.jsonValue["busses"] = std::move(buses);
+        asyncResp->res.jsonValue["status"] = "ok";
+        });
 
     BMCWEB_ROUTE(app, "/bus/system/")
         .privileges({{"Login"}})
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                auto myCallback = [asyncResp](
-                                      const boost::system::error_code ec,
+        auto myCallback = [asyncResp](const boost::system::error_code ec,
                                       std::vector<std::string>& names) {
-                    if (ec)
-                    {
-                        BMCWEB_LOG_ERROR << "Dbus call failed with code " << ec;
-                        asyncResp->res.result(
-                            boost::beast::http::status::internal_server_error);
-                    }
-                    else
-                    {
-                        std::sort(names.begin(), names.end());
-                        asyncResp->res.jsonValue["status"] = "ok";
-                        auto& objectsSub = asyncResp->res.jsonValue["objects"];
-                        for (auto& name : names)
-                        {
-                            nlohmann::json::object_t object;
-                            object["name"] = name;
-                            objectsSub.push_back(std::move(object));
-                        }
-                    }
-                };
-                crow::connections::systemBus->async_method_call(
-                    std::move(myCallback), "org.freedesktop.DBus", "/",
-                    "org.freedesktop.DBus", "ListNames");
-            });
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "Dbus call failed with code " << ec;
+                asyncResp->res.result(
+                    boost::beast::http::status::internal_server_error);
+            }
+            else
+            {
+                std::sort(names.begin(), names.end());
+                asyncResp->res.jsonValue["status"] = "ok";
+                auto& objectsSub = asyncResp->res.jsonValue["objects"];
+                for (auto& name : names)
+                {
+                    nlohmann::json::object_t object;
+                    object["name"] = name;
+                    objectsSub.push_back(std::move(object));
+                }
+            }
+        };
+        crow::connections::systemBus->async_method_call(
+            std::move(myCallback), "org.freedesktop.DBus", "/",
+            "org.freedesktop.DBus", "ListNames");
+        });
 
     BMCWEB_ROUTE(app, "/list/")
         .privileges({{"Login"}})
         .methods(boost::beast::http::verb::get)(
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                handleList(asyncResp, "/");
-            });
+        handleList(asyncResp, "/");
+        });
 
     BMCWEB_ROUTE(app, "/xyz/<path>")
         .privileges({{"Login"}})
@@ -2503,9 +2448,9 @@
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& path) {
-                std::string objectPath = "/xyz/" + path;
-                handleDBusUrl(req, asyncResp, objectPath);
-            });
+        std::string objectPath = "/xyz/" + path;
+        handleDBusUrl(req, asyncResp, objectPath);
+        });
 
     BMCWEB_ROUTE(app, "/xyz/<path>")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
@@ -2514,9 +2459,9 @@
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& path) {
-                std::string objectPath = "/xyz/" + path;
-                handleDBusUrl(req, asyncResp, objectPath);
-            });
+        std::string objectPath = "/xyz/" + path;
+        handleDBusUrl(req, asyncResp, objectPath);
+        });
 
     BMCWEB_ROUTE(app, "/org/<path>")
         .privileges({{"Login"}})
@@ -2524,9 +2469,9 @@
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& path) {
-                std::string objectPath = "/org/" + path;
-                handleDBusUrl(req, asyncResp, objectPath);
-            });
+        std::string objectPath = "/org/" + path;
+        handleDBusUrl(req, asyncResp, objectPath);
+        });
 
     BMCWEB_ROUTE(app, "/org/<path>")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
@@ -2535,9 +2480,9 @@
             [](const crow::Request& req,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& path) {
-                std::string objectPath = "/org/" + path;
-                handleDBusUrl(req, asyncResp, objectPath);
-            });
+        std::string objectPath = "/org/" + path;
+        handleDBusUrl(req, asyncResp, objectPath);
+        });
 
     BMCWEB_ROUTE(app, "/download/dump/<str>/")
         .privileges({{"ConfigureManager"}})
@@ -2545,68 +2490,62 @@
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& dumpId) {
-                if (!validateFilename(dumpId))
-                {
-                    asyncResp->res.result(
-                        boost::beast::http::status::bad_request);
-                    return;
-                }
-                std::filesystem::path loc(
-                    "/var/lib/phosphor-debug-collector/dumps");
+        if (!validateFilename(dumpId))
+        {
+            asyncResp->res.result(boost::beast::http::status::bad_request);
+            return;
+        }
+        std::filesystem::path loc("/var/lib/phosphor-debug-collector/dumps");
 
-                loc /= dumpId;
+        loc /= dumpId;
 
-                if (!std::filesystem::exists(loc) ||
-                    !std::filesystem::is_directory(loc))
-                {
-                    BMCWEB_LOG_ERROR << loc.string() << "Not found";
-                    asyncResp->res.result(
-                        boost::beast::http::status::not_found);
-                    return;
-                }
-                std::filesystem::directory_iterator files(loc);
+        if (!std::filesystem::exists(loc) ||
+            !std::filesystem::is_directory(loc))
+        {
+            BMCWEB_LOG_ERROR << loc.string() << "Not found";
+            asyncResp->res.result(boost::beast::http::status::not_found);
+            return;
+        }
+        std::filesystem::directory_iterator files(loc);
 
-                for (const auto& file : files)
-                {
-                    std::ifstream readFile(file.path());
-                    if (!readFile.good())
-                    {
-                        continue;
-                    }
+        for (const auto& file : files)
+        {
+            std::ifstream readFile(file.path());
+            if (!readFile.good())
+            {
+                continue;
+            }
 
-                    asyncResp->res.addHeader("Content-Type",
-                                             "application/octet-stream");
+            asyncResp->res.addHeader("Content-Type",
+                                     "application/octet-stream");
 
-                    // Assuming only one dump file will be present in the dump
-                    // id directory
-                    std::string dumpFileName = file.path().filename().string();
+            // Assuming only one dump file will be present in the dump
+            // id directory
+            std::string dumpFileName = file.path().filename().string();
 
-                    // Filename should be in alphanumeric, dot and underscore
-                    // Its based on phosphor-debug-collector application
-                    // dumpfile format
-                    std::regex dumpFileRegex("[a-zA-Z0-9\\._]+");
-                    if (!std::regex_match(dumpFileName, dumpFileRegex))
-                    {
-                        BMCWEB_LOG_ERROR << "Invalid dump filename "
-                                         << dumpFileName;
-                        asyncResp->res.result(
-                            boost::beast::http::status::not_found);
-                        return;
-                    }
-                    std::string contentDispositionParam =
-                        "attachment; filename=\"" + dumpFileName + "\"";
-
-                    asyncResp->res.addHeader("Content-Disposition",
-                                             contentDispositionParam);
-
-                    asyncResp->res.body() = {
-                        std::istreambuf_iterator<char>(readFile),
-                        std::istreambuf_iterator<char>()};
-                    return;
-                }
+            // Filename should be in alphanumeric, dot and underscore
+            // Its based on phosphor-debug-collector application
+            // dumpfile format
+            std::regex dumpFileRegex("[a-zA-Z0-9\\._]+");
+            if (!std::regex_match(dumpFileName, dumpFileRegex))
+            {
+                BMCWEB_LOG_ERROR << "Invalid dump filename " << dumpFileName;
                 asyncResp->res.result(boost::beast::http::status::not_found);
                 return;
-            });
+            }
+            std::string contentDispositionParam =
+                "attachment; filename=\"" + dumpFileName + "\"";
+
+            asyncResp->res.addHeader("Content-Disposition",
+                                     contentDispositionParam);
+
+            asyncResp->res.body() = {std::istreambuf_iterator<char>(readFile),
+                                     std::istreambuf_iterator<char>()};
+            return;
+        }
+        asyncResp->res.result(boost::beast::http::status::not_found);
+        return;
+        });
 
     BMCWEB_ROUTE(app, "/bus/system/<str>/")
         .privileges({{"Login"}})
@@ -2615,8 +2554,8 @@
             [](const crow::Request&,
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& connection) {
-                introspectObjects(connection, "/", asyncResp);
-            });
+        introspectObjects(connection, "/", asyncResp);
+        });
 
     BMCWEB_ROUTE(app, "/bus/system/<str>/<path>")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
diff --git a/include/vm_websocket.hpp b/include/vm_websocket.hpp
index 2dbdaf6..ebf0a69 100644
--- a/include/vm_websocket.hpp
+++ b/include/vm_websocket.hpp
@@ -88,26 +88,26 @@
             inputBuffer->data(),
             [this, self(shared_from_this())](boost::beast::error_code ec,
                                              std::size_t bytesWritten) {
-                BMCWEB_LOG_DEBUG << "Wrote " << bytesWritten << "bytes";
-                doingWrite = false;
-                inputBuffer->consume(bytesWritten);
+            BMCWEB_LOG_DEBUG << "Wrote " << bytesWritten << "bytes";
+            doingWrite = false;
+            inputBuffer->consume(bytesWritten);
 
-                if (session == nullptr)
-                {
-                    return;
-                }
-                if (ec == boost::asio::error::eof)
-                {
-                    session->close("VM socket port closed");
-                    return;
-                }
-                if (ec)
-                {
-                    session->close("Error in writing to proxy port");
-                    BMCWEB_LOG_ERROR << "Error in VM socket write " << ec;
-                    return;
-                }
-                doWrite();
+            if (session == nullptr)
+            {
+                return;
+            }
+            if (ec == boost::asio::error::eof)
+            {
+                session->close("VM socket port closed");
+                return;
+            }
+            if (ec)
+            {
+                session->close("Error in writing to proxy port");
+                BMCWEB_LOG_ERROR << "Error in VM socket write " << ec;
+                return;
+            }
+            doWrite();
             });
     }
 
@@ -119,30 +119,29 @@
             outputBuffer->prepare(bytes),
             [this, self(shared_from_this())](
                 const boost::system::error_code& ec, std::size_t bytesRead) {
-                BMCWEB_LOG_DEBUG << "Read done.  Read " << bytesRead
-                                 << " bytes";
-                if (ec)
+            BMCWEB_LOG_DEBUG << "Read done.  Read " << bytesRead << " bytes";
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "Couldn't read from VM port: " << ec;
+                if (session != nullptr)
                 {
-                    BMCWEB_LOG_ERROR << "Couldn't read from VM port: " << ec;
-                    if (session != nullptr)
-                    {
-                        session->close("Error in connecting to VM port");
-                    }
-                    return;
+                    session->close("Error in connecting to VM port");
                 }
-                if (session == nullptr)
-                {
-                    return;
-                }
+                return;
+            }
+            if (session == nullptr)
+            {
+                return;
+            }
 
-                outputBuffer->commit(bytesRead);
-                std::string_view payload(
-                    static_cast<const char*>(outputBuffer->data().data()),
-                    bytesRead);
-                session->sendBinary(payload);
-                outputBuffer->consume(bytesRead);
+            outputBuffer->commit(bytesRead);
+            std::string_view payload(
+                static_cast<const char*>(outputBuffer->data().data()),
+                bytesRead);
+            session->sendBinary(payload);
+            outputBuffer->consume(bytesRead);
 
-                doRead();
+            doRead();
             });
     }
 
diff --git a/include/webassets.hpp b/include/webassets.hpp
index 36c3f8d..6353a42 100644
--- a/include/webassets.hpp
+++ b/include/webassets.hpp
@@ -150,31 +150,30 @@
                 [absolutePath, contentType, contentEncoding](
                     const crow::Request&,
                     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
-                    if (contentType != nullptr)
-                    {
-                        asyncResp->res.addHeader("Content-Type", contentType);
-                    }
+                if (contentType != nullptr)
+                {
+                    asyncResp->res.addHeader("Content-Type", contentType);
+                }
 
-                    if (contentEncoding != nullptr)
-                    {
-                        asyncResp->res.addHeader("Content-Encoding",
-                                                 contentEncoding);
-                    }
+                if (contentEncoding != nullptr)
+                {
+                    asyncResp->res.addHeader("Content-Encoding",
+                                             contentEncoding);
+                }
 
-                    // res.set_header("Cache-Control", "public, max-age=86400");
-                    std::ifstream inf(absolutePath);
-                    if (!inf)
-                    {
-                        BMCWEB_LOG_DEBUG << "failed to read file";
-                        asyncResp->res.result(
-                            boost::beast::http::status::internal_server_error);
-                        return;
-                    }
+                // res.set_header("Cache-Control", "public, max-age=86400");
+                std::ifstream inf(absolutePath);
+                if (!inf)
+                {
+                    BMCWEB_LOG_DEBUG << "failed to read file";
+                    asyncResp->res.result(
+                        boost::beast::http::status::internal_server_error);
+                    return;
+                }
 
-                    asyncResp->res.body() = {
-                        std::istreambuf_iterator<char>(inf),
-                        std::istreambuf_iterator<char>()};
-                });
+                asyncResp->res.body() = {std::istreambuf_iterator<char>(inf),
+                                         std::istreambuf_iterator<char>()};
+            });
         }
     }
 }
