diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp
index 64ce9cb..0db320b 100644
--- a/redfish-core/include/error_messages.hpp
+++ b/redfish-core/include/error_messages.hpp
@@ -86,14 +86,12 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ActionParameterValueFormatError formatted to JSON */
-nlohmann::json actionParameterValueFormatError(const nlohmann::json& arg1,
-                                               std::string_view arg2,
-                                               std::string_view arg3);
+nlohmann::json actionParameterValueFormatError(
+    const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3);
 
-void actionParameterValueFormatError(crow::Response& res,
-                                     const nlohmann::json& arg1,
-                                     std::string_view arg2,
-                                     std::string_view arg3);
+void actionParameterValueFormatError(
+    crow::Response& res, const nlohmann::json& arg1, std::string_view arg2,
+    std::string_view arg3);
 
 /**
  * @brief Formats ActionParameterValueNotInList message into JSON
@@ -105,9 +103,8 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ActionParameterValueFormatError formatted to JSON */
-nlohmann::json actionParameterValueNotInList(std::string_view arg1,
-                                             std::string_view arg2,
-                                             std::string_view arg3);
+nlohmann::json actionParameterValueNotInList(
+    std::string_view arg1, std::string_view arg2, std::string_view arg3);
 
 void actionParameterValueNotInList(crow::Response& res, std::string_view arg1,
                                    std::string_view arg2,
@@ -211,9 +208,8 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ResourceAlreadyExists formatted to JSON */
-nlohmann::json resourceAlreadyExists(std::string_view arg1,
-                                     std::string_view arg2,
-                                     std::string_view arg3);
+nlohmann::json resourceAlreadyExists(
+    std::string_view arg1, std::string_view arg2, std::string_view arg3);
 
 void resourceAlreadyExists(crow::Response& res, std::string_view arg1,
                            std::string_view arg2, std::string_view arg3);
@@ -461,10 +457,9 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message PropertyValueResourceConflict to JSON */
-nlohmann::json
-    propertyValueResourceConflict(std::string_view arg1,
-                                  const nlohmann::json& arg2,
-                                  const boost::urls::url_view_base& arg3);
+nlohmann::json propertyValueResourceConflict(
+    std::string_view arg1, const nlohmann::json& arg2,
+    const boost::urls::url_view_base& arg3);
 
 void propertyValueResourceConflict(crow::Response& res, std::string_view arg1,
                                    const nlohmann::json& arg2,
@@ -636,9 +631,8 @@
 nlohmann::json queryParameterValueTypeError(const nlohmann::json& arg1,
                                             std::string_view arg2);
 
-void queryParameterValueTypeError(crow::Response& res,
-                                  const nlohmann::json& arg1,
-                                  std::string_view arg2);
+void queryParameterValueTypeError(
+    crow::Response& res, const nlohmann::json& arg1, std::string_view arg2);
 
 /**
  * @brief Formats ServiceShuttingDown message into JSON
@@ -690,9 +684,8 @@
  * @param[in] arg2 Parameter of message that will replace %2 in its body.
  *
  * @returns Message SourceDoesNotSupportProtocol formatted to JSON */
-nlohmann::json
-    sourceDoesNotSupportProtocol(const boost::urls::url_view_base& arg1,
-                                 std::string_view arg2);
+nlohmann::json sourceDoesNotSupportProtocol(
+    const boost::urls::url_view_base& arg1, std::string_view arg2);
 
 void sourceDoesNotSupportProtocol(crow::Response& res,
                                   const boost::urls::url_view_base& arg1,
@@ -849,14 +842,12 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message ActionParameterValueTypeError formatted to JSON */
-nlohmann::json actionParameterValueTypeError(const nlohmann::json& arg1,
-                                             std::string_view arg2,
-                                             std::string_view arg3);
+nlohmann::json actionParameterValueTypeError(
+    const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3);
 
-void actionParameterValueTypeError(crow::Response& res,
-                                   const nlohmann::json& arg1,
-                                   std::string_view arg2,
-                                   std::string_view arg3);
+void actionParameterValueTypeError(
+    crow::Response& res, const nlohmann::json& arg1, std::string_view arg2,
+    std::string_view arg3);
 
 /**
  * @brief Formats ActionParameterValueError message into JSON
@@ -1009,9 +1000,8 @@
 nlohmann::json queryParameterValueFormatError(const nlohmann::json& arg1,
                                               std::string_view arg2);
 
-void queryParameterValueFormatError(crow::Response& res,
-                                    const nlohmann::json& arg1,
-                                    std::string_view arg2);
+void queryParameterValueFormatError(
+    crow::Response& res, const nlohmann::json& arg1, std::string_view arg2);
 
 /**
  * @brief Formats PropertyMissing message into JSON
@@ -1057,9 +1047,8 @@
  * @param[in] arg3 Parameter of message that will replace %3 in its body.
  *
  * @returns Message QueryParameterOutOfRange formatted to JSON */
-nlohmann::json queryParameterOutOfRange(std::string_view arg1,
-                                        std::string_view arg2,
-                                        std::string_view arg3);
+nlohmann::json queryParameterOutOfRange(
+    std::string_view arg1, std::string_view arg2, std::string_view arg3);
 
 void queryParameterOutOfRange(crow::Response& res, std::string_view arg1,
                               std::string_view arg2, std::string_view arg3);
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 517910c..b004bde 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -89,8 +89,8 @@
 {
     std::span<const MessageEntry>::iterator messageIt = std::ranges::find_if(
         registry, [&messageKey](const MessageEntry& messageEntry) {
-        return messageKey == messageEntry.first;
-    });
+            return messageKey == messageEntry.first;
+        });
     if (messageIt != registry.end())
     {
         return &messageIt->second;
@@ -215,12 +215,10 @@
     }
 }
 
-inline int formatEventLogEntry(const std::string& logEntryID,
-                               const std::string& messageID,
-                               const std::span<std::string_view> messageArgs,
-                               std::string timestamp,
-                               const std::string& customText,
-                               nlohmann::json::object_t& logEntryJson)
+inline int formatEventLogEntry(
+    const std::string& logEntryID, const std::string& messageID,
+    const std::span<std::string_view> messageArgs, std::string timestamp,
+    const std::string& customText, nlohmann::json::object_t& logEntryJson)
 {
     // Get the Message from the MessageRegistry
     const registries::Message* message = registries::formatMessage(messageID);
@@ -230,8 +228,8 @@
         return -1;
     }
 
-    std::string msg = redfish::registries::fillMessageArgs(messageArgs,
-                                                           message->message);
+    std::string msg =
+        redfish::registries::fillMessageArgs(messageArgs, message->message);
     if (msg.empty())
     {
         return -1;
@@ -321,8 +319,8 @@
             // Search the resourceTypes list for the subscription.
             auto resourceTypeIndex = std::ranges::find_if(
                 resourceTypes, [resType](const std::string& rtEntry) {
-                return rtEntry == resType;
-            });
+                    return rtEntry == resType;
+                });
             if (resourceTypeIndex == resourceTypes.end())
             {
                 BMCWEB_LOG_DEBUG("Not subscribed to this resource");
@@ -393,8 +391,8 @@
         msg["Name"] = "Event Log";
         msg["Events"] = logEntryArray;
 
-        std::string strMsg = msg.dump(2, ' ', true,
-                                      nlohmann::json::error_handler_t::replace);
+        std::string strMsg =
+            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
         return sendEvent(std::move(strMsg));
     }
 
@@ -435,8 +433,8 @@
         msg["Id"] = std::to_string(eventSeqNum);
         msg["Name"] = "Event Log";
         msg["Events"] = std::move(logEntryArray);
-        std::string strMsg = msg.dump(2, ' ', true,
-                                      nlohmann::json::error_handler_t::replace);
+        std::string strMsg =
+            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
         sendEvent(std::move(strMsg));
         eventSeqNum++;
     }
@@ -474,8 +472,8 @@
             msg["Context"] = customText;
         }
 
-        std::string strMsg = msg.dump(2, ' ', true,
-                                      nlohmann::json::error_handler_t::replace);
+        std::string strMsg =
+            msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
         sendEvent(std::move(strMsg));
     }
 
@@ -927,8 +925,8 @@
             boost::circular_buffer<Event>::iterator lastEvent =
                 std::find_if(messages.begin(), messages.end(),
                              [&lastEventId](const Event& event) {
-                return event.id == lastEventId;
-            });
+                                 return event.id == lastEventId;
+                             });
             // Can't find a matching ID
             if (lastEvent == messages.end())
             {
@@ -1012,8 +1010,8 @@
             subscriptionsMap,
             [](const std::pair<std::string, std::shared_ptr<Subscription>>&
                    entry) {
-            return (entry.second->subscriptionType == subscriptionTypeSSE);
-        });
+                return (entry.second->subscriptionType == subscriptionTypeSSE);
+            });
         return static_cast<size_t>(size);
     }
 
@@ -1184,94 +1182,95 @@
 
         static std::array<char, 1024> readBuffer;
 
-        inotifyConn->async_read_some(boost::asio::buffer(readBuffer),
-                                     [&](const boost::system::error_code& ec,
-                                         const std::size_t& bytesTransferred) {
-            if (ec == boost::asio::error::operation_aborted)
-            {
-                BMCWEB_LOG_DEBUG("Inotify was canceled (shutdown?)");
-                return;
-            }
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR("Callback Error: {}", ec.message());
-                return;
-            }
-            std::size_t index = 0;
-            while ((index + iEventSize) <= bytesTransferred)
-            {
-                struct inotify_event event
-                {};
-                std::memcpy(&event, &readBuffer[index], iEventSize);
-                if (event.wd == dirWatchDesc)
+        inotifyConn->async_read_some(
+            boost::asio::buffer(readBuffer),
+            [&](const boost::system::error_code& ec,
+                const std::size_t& bytesTransferred) {
+                if (ec == boost::asio::error::operation_aborted)
                 {
-                    if ((event.len == 0) ||
-                        (index + iEventSize + event.len > bytesTransferred))
-                    {
-                        index += (iEventSize + event.len);
-                        continue;
-                    }
-
-                    std::string fileName(&readBuffer[index + iEventSize]);
-                    if (fileName != "redfish")
-                    {
-                        index += (iEventSize + event.len);
-                        continue;
-                    }
-
-                    BMCWEB_LOG_DEBUG(
-                        "Redfish log file created/deleted. event.name: {}",
-                        fileName);
-                    if (event.mask == IN_CREATE)
-                    {
-                        if (fileWatchDesc != -1)
-                        {
-                            BMCWEB_LOG_DEBUG(
-                                "Remove and Add inotify watcher on "
-                                "redfish event log file");
-                            // Remove existing inotify watcher and add
-                            // with new redfish event log file.
-                            inotify_rm_watch(inotifyFd, fileWatchDesc);
-                            fileWatchDesc = -1;
-                        }
-
-                        fileWatchDesc = inotify_add_watch(
-                            inotifyFd, redfishEventLogFile, IN_MODIFY);
-                        if (fileWatchDesc == -1)
-                        {
-                            BMCWEB_LOG_ERROR("inotify_add_watch failed for "
-                                             "redfish log file.");
-                            return;
-                        }
-
-                        EventServiceManager::getInstance()
-                            .resetRedfishFilePosition();
-                        EventServiceManager::getInstance()
-                            .readEventLogsFromFile();
-                    }
-                    else if ((event.mask == IN_DELETE) ||
-                             (event.mask == IN_MOVED_TO))
-                    {
-                        if (fileWatchDesc != -1)
-                        {
-                            inotify_rm_watch(inotifyFd, fileWatchDesc);
-                            fileWatchDesc = -1;
-                        }
-                    }
+                    BMCWEB_LOG_DEBUG("Inotify was canceled (shutdown?)");
+                    return;
                 }
-                else if (event.wd == fileWatchDesc)
+                if (ec)
                 {
-                    if (event.mask == IN_MODIFY)
-                    {
-                        EventServiceManager::getInstance()
-                            .readEventLogsFromFile();
-                    }
+                    BMCWEB_LOG_ERROR("Callback Error: {}", ec.message());
+                    return;
                 }
-                index += (iEventSize + event.len);
-            }
+                std::size_t index = 0;
+                while ((index + iEventSize) <= bytesTransferred)
+                {
+                    struct inotify_event event
+                    {};
+                    std::memcpy(&event, &readBuffer[index], iEventSize);
+                    if (event.wd == dirWatchDesc)
+                    {
+                        if ((event.len == 0) ||
+                            (index + iEventSize + event.len > bytesTransferred))
+                        {
+                            index += (iEventSize + event.len);
+                            continue;
+                        }
 
-            watchRedfishEventLogFile();
-        });
+                        std::string fileName(&readBuffer[index + iEventSize]);
+                        if (fileName != "redfish")
+                        {
+                            index += (iEventSize + event.len);
+                            continue;
+                        }
+
+                        BMCWEB_LOG_DEBUG(
+                            "Redfish log file created/deleted. event.name: {}",
+                            fileName);
+                        if (event.mask == IN_CREATE)
+                        {
+                            if (fileWatchDesc != -1)
+                            {
+                                BMCWEB_LOG_DEBUG(
+                                    "Remove and Add inotify watcher on "
+                                    "redfish event log file");
+                                // Remove existing inotify watcher and add
+                                // with new redfish event log file.
+                                inotify_rm_watch(inotifyFd, fileWatchDesc);
+                                fileWatchDesc = -1;
+                            }
+
+                            fileWatchDesc = inotify_add_watch(
+                                inotifyFd, redfishEventLogFile, IN_MODIFY);
+                            if (fileWatchDesc == -1)
+                            {
+                                BMCWEB_LOG_ERROR("inotify_add_watch failed for "
+                                                 "redfish log file.");
+                                return;
+                            }
+
+                            EventServiceManager::getInstance()
+                                .resetRedfishFilePosition();
+                            EventServiceManager::getInstance()
+                                .readEventLogsFromFile();
+                        }
+                        else if ((event.mask == IN_DELETE) ||
+                                 (event.mask == IN_MOVED_TO))
+                        {
+                            if (fileWatchDesc != -1)
+                            {
+                                inotify_rm_watch(inotifyFd, fileWatchDesc);
+                                fileWatchDesc = -1;
+                            }
+                        }
+                    }
+                    else if (event.wd == fileWatchDesc)
+                    {
+                        if (event.mask == IN_MODIFY)
+                        {
+                            EventServiceManager::getInstance()
+                                .readEventLogsFromFile();
+                        }
+                    }
+                    index += (iEventSize + event.len);
+                }
+
+                watchRedfishEventLogFile();
+            });
     }
 
     static int startEventLogMonitor(boost::asio::io_context& ioc)
@@ -1296,8 +1295,8 @@
         }
 
         // Watch redfish event log file for modifications.
-        fileWatchDesc = inotify_add_watch(inotifyFd, redfishEventLogFile,
-                                          IN_MODIFY);
+        fileWatchDesc =
+            inotify_add_watch(inotifyFd, redfishEventLogFile, IN_MODIFY);
         if (fileWatchDesc == -1)
         {
             BMCWEB_LOG_ERROR("inotify_add_watch failed for redfish log file.");
@@ -1338,8 +1337,9 @@
         std::vector<std::string> invalidProps;
         msg.read(interface, props, invalidProps);
 
-        auto found = std::ranges::find_if(
-            props, [](const auto& x) { return x.first == "Readings"; });
+        auto found = std::ranges::find_if(props, [](const auto& x) {
+            return x.first == "Readings";
+        });
         if (found == props.end())
         {
             BMCWEB_LOG_INFO("Failed to get Readings from Report properties");
diff --git a/redfish-core/include/filter_expr_parser_grammar.hpp b/redfish-core/include/filter_expr_parser_grammar.hpp
index 1b422ff..939a683 100644
--- a/redfish-core/include/filter_expr_parser_grammar.hpp
+++ b/redfish-core/include/filter_expr_parser_grammar.hpp
@@ -50,8 +50,8 @@
 ///// BEGIN GRAMMAR
 
 // Two types of strings.
-const auto quotedString_def = '\'' >> lexeme[*('\\' >> char_ | ~char_('\''))] >>
-                              '\'';
+const auto quotedString_def =
+    '\'' >> lexeme[*('\\' >> char_ | ~char_('\''))] >> '\'';
 const auto unquotedString_def = char_("a-zA-Z") >> *(char_("a-zA-Z0-9[]/"));
 
 // Make sure we only parse true floating points as doubles
diff --git a/redfish-core/include/gzfile.hpp b/redfish-core/include/gzfile.hpp
index 3fa1e49..fd8ddd0 100644
--- a/redfish-core/include/gzfile.hpp
+++ b/redfish-core/include/gzfile.hpp
@@ -97,8 +97,8 @@
 
         while (pos != std::string::npos)
         {
-            std::string logEntry = bufferStr.substr(initialPos,
-                                                    pos - initialPos);
+            std::string logEntry =
+                bufferStr.substr(initialPos, pos - initialPos);
             // Since there might be consecutive delimiters like "\r\n", we need
             // to filter empty strings.
             if (!logEntry.empty())
diff --git a/redfish-core/include/query.hpp b/redfish-core/include/query.hpp
index 2d280cb..a46bd4a 100644
--- a/redfish-core/include/query.hpp
+++ b/redfish-core/include/query.hpp
@@ -153,8 +153,9 @@
 
     if constexpr (BMCWEB_REDFISH_AGGREGATION)
     {
-        needToCallHandlers = RedfishAggregator::beginAggregation(
-                                 req, asyncResp) == Result::LocalHandle;
+        needToCallHandlers =
+            RedfishAggregator::beginAggregation(req, asyncResp) ==
+            Result::LocalHandle;
 
         // If the request should be forwarded to a satellite BMC then we don't
         // want to write anything to the asyncResp since it will get overwritten
@@ -174,8 +175,8 @@
     asyncResp->res.setCompleteRequestHandler(
         [&app, handler(std::move(handler)), query{std::move(*queryOpt)},
          delegated{delegated}](crow::Response& resIn) mutable {
-        processAllParams(app, query, delegated, handler, resIn);
-    });
+            processAllParams(app, query, delegated, handler, resIn);
+        });
 
     return needToCallHandlers;
 }
diff --git a/redfish-core/include/redfish_aggregator.hpp b/redfish-core/include/redfish_aggregator.hpp
index 5ccfd2f..8477b18 100644
--- a/redfish-core/include/redfish_aggregator.hpp
+++ b/redfish-core/include/redfish_aggregator.hpp
@@ -291,8 +291,8 @@
 }
 
 // Fix HTTP headers which appear in responses from Task resources among others
-static inline void addPrefixToHeadersInResp(nlohmann::json& json,
-                                            std::string_view prefix)
+static inline void
+    addPrefixToHeadersInResp(nlohmann::json& json, std::string_view prefix)
 {
     // The passed in "HttpHeaders" should be an array of headers
     nlohmann::json::array_t* array = json.get_ptr<nlohmann::json::array_t*>();
@@ -827,33 +827,33 @@
             [handler{std::move(handler)}](
                 const boost::system::error_code& ec,
                 const dbus::utility::ManagedObjectType& objects) {
-            std::unordered_map<std::string, boost::urls::url> satelliteInfo;
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR("DBUS response error {}, {}", ec.value(),
-                                 ec.message());
+                std::unordered_map<std::string, boost::urls::url> satelliteInfo;
+                if (ec)
+                {
+                    BMCWEB_LOG_ERROR("DBUS response error {}, {}", ec.value(),
+                                     ec.message());
+                    handler(ec, satelliteInfo);
+                    return;
+                }
+
+                // Maps a chosen alias representing a satellite BMC to a url
+                // containing the information required to create a http
+                // connection to the satellite
+                findSatelliteConfigs(objects, satelliteInfo);
+
+                if (!satelliteInfo.empty())
+                {
+                    BMCWEB_LOG_DEBUG(
+                        "Redfish Aggregation enabled with {} satellite BMCs",
+                        std::to_string(satelliteInfo.size()));
+                }
+                else
+                {
+                    BMCWEB_LOG_DEBUG(
+                        "No satellite BMCs detected.  Redfish Aggregation not enabled");
+                }
                 handler(ec, satelliteInfo);
-                return;
-            }
-
-            // Maps a chosen alias representing a satellite BMC to a url
-            // containing the information required to create a http
-            // connection to the satellite
-            findSatelliteConfigs(objects, satelliteInfo);
-
-            if (!satelliteInfo.empty())
-            {
-                BMCWEB_LOG_DEBUG(
-                    "Redfish Aggregation enabled with {} satellite BMCs",
-                    std::to_string(satelliteInfo.size()));
-            }
-            else
-            {
-                BMCWEB_LOG_DEBUG(
-                    "No satellite BMCs detected.  Redfish Aggregation not enabled");
-            }
-            handler(ec, satelliteInfo);
-        });
+            });
     }
 
     // Processes the response returned by a satellite BMC and loads its
@@ -877,8 +877,8 @@
         // We need to create a json from resp's stringResponse
         if (isJsonContentType(resp.getHeaderValue("Content-Type")))
         {
-            nlohmann::json jsonVal = nlohmann::json::parse(*resp.body(),
-                                                           nullptr, false);
+            nlohmann::json jsonVal =
+                nlohmann::json::parse(*resp.body(), nullptr, false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR("Error parsing satellite response as JSON");
@@ -939,8 +939,8 @@
         // We need to create a json from resp's stringResponse
         if (isJsonContentType(resp.getHeaderValue("Content-Type")))
         {
-            nlohmann::json jsonVal = nlohmann::json::parse(*resp.body(),
-                                                           nullptr, false);
+            nlohmann::json jsonVal =
+                nlohmann::json::parse(*resp.body(), nullptr, false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR("Error parsing satellite response as JSON");
@@ -1072,8 +1072,8 @@
         if (isJsonContentType(resp.getHeaderValue("Content-Type")))
         {
             bool addedLinks = false;
-            nlohmann::json jsonVal = nlohmann::json::parse(*resp.body(),
-                                                           nullptr, false);
+            nlohmann::json jsonVal =
+                nlohmann::json::parse(*resp.body(), nullptr, false);
             if (jsonVal.is_discarded())
             {
                 BMCWEB_LOG_ERROR("Error parsing satellite response as JSON");
diff --git a/redfish-core/include/registries.hpp b/redfish-core/include/registries.hpp
index b0ddb68..3d572c2 100644
--- a/redfish-core/include/registries.hpp
+++ b/redfish-core/include/registries.hpp
@@ -54,9 +54,8 @@
 };
 using MessageEntry = std::pair<const char*, const Message>;
 
-inline std::string
-    fillMessageArgs(const std::span<const std::string_view> messageArgs,
-                    std::string_view msg)
+inline std::string fillMessageArgs(
+    const std::span<const std::string_view> messageArgs, std::string_view msg)
 {
     std::string ret;
     size_t reserve = msg.size();
@@ -90,10 +89,9 @@
     return ret;
 }
 
-inline nlohmann::json::object_t
-    getLogFromRegistry(const Header& header,
-                       std::span<const MessageEntry> registry, size_t index,
-                       std::span<const std::string_view> args)
+inline nlohmann::json::object_t getLogFromRegistry(
+    const Header& header, std::span<const MessageEntry> registry, size_t index,
+    std::span<const std::string_view> args)
 {
     const redfish::registries::MessageEntry& entry = registry[index];
     // Intentionally make a copy of the string, so we can append in the
diff --git a/redfish-core/include/snmp_trap_event_clients.hpp b/redfish-core/include/snmp_trap_event_clients.hpp
index 8e0692a..d71d59f 100644
--- a/redfish-core/include/snmp_trap_event_clients.hpp
+++ b/redfish-core/include/snmp_trap_event_clients.hpp
@@ -86,48 +86,47 @@
         objectPath, "xyz.openbmc_project.Network.Client",
         [asyncResp](const boost::system::error_code& ec,
                     const dbus::utility::DBusPropertiesMap& properties) {
-        afterGetSnmpTrapClientdata(asyncResp, ec, properties);
-    });
+            afterGetSnmpTrapClientdata(asyncResp, ec, properties);
+        });
 }
 
-inline void
-    getSnmpTrapClient(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                      const std::string& id)
+inline void getSnmpTrapClient(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const std::string& id)
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, id](const boost::system::error_code& ec,
                         dbus::utility::ManagedObjectType& resp) {
-        if (ec)
-        {
-            BMCWEB_LOG_ERROR("D-Bus response error on GetManagedObjects {}",
-                             ec);
-            messages::internalError(asyncResp->res);
-            return;
-        }
-
-        for (const auto& objpath : resp)
-        {
-            sdbusplus::message::object_path path(objpath.first);
-            const std::string snmpId = path.filename();
-            if (snmpId.empty())
+            if (ec)
             {
-                BMCWEB_LOG_ERROR("The SNMP client ID is wrong");
+                BMCWEB_LOG_ERROR("D-Bus response error on GetManagedObjects {}",
+                                 ec);
                 messages::internalError(asyncResp->res);
                 return;
             }
-            const std::string subscriptionId = "snmp" + snmpId;
-            if (id != subscriptionId)
+
+            for (const auto& objpath : resp)
             {
-                continue;
+                sdbusplus::message::object_path path(objpath.first);
+                const std::string snmpId = path.filename();
+                if (snmpId.empty())
+                {
+                    BMCWEB_LOG_ERROR("The SNMP client ID is wrong");
+                    messages::internalError(asyncResp->res);
+                    return;
+                }
+                const std::string subscriptionId = "snmp" + snmpId;
+                if (id != subscriptionId)
+                {
+                    continue;
+                }
+
+                getSnmpTrapClientdata(asyncResp, id, objpath.first);
+                return;
             }
 
-            getSnmpTrapClientdata(asyncResp, id, objpath.first);
-            return;
-        }
-
-        messages::resourceNotFound(asyncResp->res, "Subscriptions", id);
-        EventServiceManager::getInstance().deleteSubscription(id);
-    },
+            messages::resourceNotFound(asyncResp->res, "Subscriptions", id);
+            EventServiceManager::getInstance().deleteSubscription(id);
+        },
         "xyz.openbmc_project.Network.SNMP",
         "/xyz/openbmc_project/network/snmp/manager",
         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
@@ -183,21 +182,20 @@
                       const std::string& host, uint16_t snmpTrapPort)
 {
     crow::connections::systemBus->async_method_call(
-        [asyncResp, host](const boost::system::error_code& ec,
-                          const sdbusplus::message_t& msg,
-                          const std::string& dbusSNMPid) {
-        afterSnmpClientCreate(asyncResp, ec, msg, host, dbusSNMPid);
-    },
+        [asyncResp,
+         host](const boost::system::error_code& ec,
+               const sdbusplus::message_t& msg, const std::string& dbusSNMPid) {
+            afterSnmpClientCreate(asyncResp, ec, msg, host, dbusSNMPid);
+        },
         "xyz.openbmc_project.Network.SNMP",
         "/xyz/openbmc_project/network/snmp/manager",
         "xyz.openbmc_project.Network.Client.Create", "Client", host,
         snmpTrapPort);
 }
 
-inline void
-    getSnmpSubscriptionList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                            const std::string& snmpId,
-                            nlohmann::json& memberArray)
+inline void getSnmpSubscriptionList(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& snmpId, nlohmann::json& memberArray)
 {
     const std::string subscriptionId = "snmp" + snmpId;
 
@@ -227,20 +225,20 @@
 
     crow::connections::systemBus->async_method_call(
         [asyncResp, param](const boost::system::error_code& ec) {
-        if (ec)
-        {
-            // The snmp trap id is incorrect
-            if (ec.value() == EBADR)
+            if (ec)
             {
-                messages::resourceNotFound(asyncResp->res, "Subscription",
-                                           param);
+                // The snmp trap id is incorrect
+                if (ec.value() == EBADR)
+                {
+                    messages::resourceNotFound(asyncResp->res, "Subscription",
+                                               param);
+                    return;
+                }
+                messages::internalError(asyncResp->res);
                 return;
             }
-            messages::internalError(asyncResp->res);
-            return;
-        }
-        messages::success(asyncResp->res);
-    },
+            messages::success(asyncResp->res);
+        },
         "xyz.openbmc_project.Network.SNMP", static_cast<std::string>(snmpPath),
         "xyz.openbmc_project.Object.Delete", "Delete");
 }
diff --git a/redfish-core/include/utils/chassis_utils.hpp b/redfish-core/include/utils/chassis_utils.hpp
index 410a289..889b6f7 100644
--- a/redfish-core/include/utils/chassis_utils.hpp
+++ b/redfish-core/include/utils/chassis_utils.hpp
@@ -33,33 +33,33 @@
          chassisId](const boost::system::error_code& ec,
                     const dbus::utility::MapperGetSubTreePathsResponse&
                         chassisPaths) mutable {
-        BMCWEB_LOG_DEBUG("getValidChassisPath respHandler enter");
-        if (ec)
-        {
-            BMCWEB_LOG_ERROR("getValidChassisPath respHandler DBUS error: {}",
-                             ec);
-            messages::internalError(asyncResp->res);
-            return;
-        }
+            BMCWEB_LOG_DEBUG("getValidChassisPath respHandler enter");
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR(
+                    "getValidChassisPath respHandler DBUS error: {}", ec);
+                messages::internalError(asyncResp->res);
+                return;
+            }
 
-        std::optional<std::string> chassisPath;
-        for (const std::string& chassis : chassisPaths)
-        {
-            sdbusplus::message::object_path path(chassis);
-            std::string chassisName = path.filename();
-            if (chassisName.empty())
+            std::optional<std::string> chassisPath;
+            for (const std::string& chassis : chassisPaths)
             {
-                BMCWEB_LOG_ERROR("Failed to find '/' in {}", chassis);
-                continue;
+                sdbusplus::message::object_path path(chassis);
+                std::string chassisName = path.filename();
+                if (chassisName.empty())
+                {
+                    BMCWEB_LOG_ERROR("Failed to find '/' in {}", chassis);
+                    continue;
+                }
+                if (chassisName == chassisId)
+                {
+                    chassisPath = chassis;
+                    break;
+                }
             }
-            if (chassisName == chassisId)
-            {
-                chassisPath = chassis;
-                break;
-            }
-        }
-        callback(chassisPath);
-    });
+            callback(chassisPath);
+        });
     BMCWEB_LOG_DEBUG("checkChassisId exit");
 }
 
diff --git a/redfish-core/include/utils/collection.hpp b/redfish-core/include/utils/collection.hpp
index 9efa7d3..6528a98 100644
--- a/redfish-core/include/utils/collection.hpp
+++ b/redfish-core/include/utils/collection.hpp
@@ -92,24 +92,22 @@
  *
  * @return void
  */
-inline void
-    getCollectionToKey(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                       const boost::urls::url& collectionPath,
-                       std::span<const std::string_view> interfaces,
-                       const std::string& subtree,
-                       const nlohmann::json::json_pointer& jsonKeyName)
+inline void getCollectionToKey(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const boost::urls::url& collectionPath,
+    std::span<const std::string_view> interfaces, const std::string& subtree,
+    const nlohmann::json::json_pointer& jsonKeyName)
 {
     BMCWEB_LOG_DEBUG("Get collection members for: {}", collectionPath.buffer());
-    dbus::utility::getSubTreePaths(subtree, 0, interfaces,
-                                   std::bind_front(handleCollectionMembers,
-                                                   asyncResp, collectionPath,
-                                                   jsonKeyName));
+    dbus::utility::getSubTreePaths(
+        subtree, 0, interfaces,
+        std::bind_front(handleCollectionMembers, asyncResp, collectionPath,
+                        jsonKeyName));
 }
-inline void
-    getCollectionMembers(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                         const boost::urls::url& collectionPath,
-                         std::span<const std::string_view> interfaces,
-                         const std::string& subtree)
+inline void getCollectionMembers(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const boost::urls::url& collectionPath,
+    std::span<const std::string_view> interfaces, const std::string& subtree)
 {
     getCollectionToKey(asyncResp, collectionPath, interfaces, subtree,
                        nlohmann::json::json_pointer("/Members"));
diff --git a/redfish-core/include/utils/dbus_utils.hpp b/redfish-core/include/utils/dbus_utils.hpp
index dbb6fd1..3fcd2c7 100644
--- a/redfish-core/include/utils/dbus_utils.hpp
+++ b/redfish-core/include/utils/dbus_utils.hpp
@@ -34,11 +34,10 @@
 
 namespace details
 {
-void afterSetProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                      const std::string& redfishPropertyName,
-                      const nlohmann::json& propertyValue,
-                      const boost::system::error_code& ec,
-                      const sdbusplus::message_t& msg);
+void afterSetProperty(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& redfishPropertyName, const nlohmann::json& propertyValue,
+    const boost::system::error_code& ec, const sdbusplus::message_t& msg);
 
 void afterSetPropertyAction(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                             const std::string& redfishActionName,
@@ -48,12 +47,11 @@
 } // namespace details
 
 template <typename PropertyType>
-void setDbusProperty(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                     std::string_view redfishPropertyName,
-                     std::string_view processName,
-                     const sdbusplus::message::object_path& path,
-                     std::string_view interface, std::string_view dbusProperty,
-                     const PropertyType& prop)
+void setDbusProperty(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    std::string_view redfishPropertyName, std::string_view processName,
+    const sdbusplus::message::object_path& path, std::string_view interface,
+    std::string_view dbusProperty, const PropertyType& prop)
 {
     std::string processNameStr(processName);
     std::string interfaceStr(interface);
@@ -65,20 +63,18 @@
         [asyncResp, redfishPropertyNameStr = std::string{redfishPropertyName},
          jsonProp = nlohmann::json(prop)](const boost::system::error_code& ec,
                                           const sdbusplus::message_t& msg) {
-        details::afterSetProperty(asyncResp, redfishPropertyNameStr, jsonProp,
-                                  ec, msg);
-    });
+            details::afterSetProperty(asyncResp, redfishPropertyNameStr,
+                                      jsonProp, ec, msg);
+        });
 }
 
 template <typename DbusPropertyType>
-void setDbusPropertyAction(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-                           std::string_view processName,
-                           const sdbusplus::message::object_path& path,
-                           std::string_view interface,
-                           std::string_view dbusProperty,
-                           std::string_view redfishActionParameterName,
-                           std::string_view redfishActionName,
-                           const DbusPropertyType& prop)
+void setDbusPropertyAction(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    std::string_view processName, const sdbusplus::message::object_path& path,
+    std::string_view interface, std::string_view dbusProperty,
+    std::string_view redfishActionParameterName,
+    std::string_view redfishActionName, const DbusPropertyType& prop)
 {
     std::string processNameStr(processName);
     std::string interfaceStr(interface);
@@ -93,9 +89,10 @@
          redfishActionNameStr = std::string{redfishActionName}](
             const boost::system::error_code& ec,
             const sdbusplus::message_t& msg) {
-        details::afterSetPropertyAction(asyncResp, redfishActionNameStr,
-                                        redfishActionParameterName, ec, msg);
-    });
+            details::afterSetPropertyAction(asyncResp, redfishActionNameStr,
+                                            redfishActionParameterName, ec,
+                                            msg);
+        });
 }
 
 } // namespace redfish
diff --git a/redfish-core/include/utils/json_utils.hpp b/redfish-core/include/utils/json_utils.hpp
index f6ac70b..bc1a69a 100644
--- a/redfish-core/include/utils/json_utils.hpp
+++ b/redfish-core/include/utils/json_utils.hpp
@@ -209,8 +209,8 @@
         value = static_cast<Type>(*jsonPtr);
     }
 
-    else if constexpr ((std::is_unsigned_v<Type>)&&(
-                           !std::is_same_v<bool, Type>))
+    else if constexpr ((std::is_unsigned_v<Type>) &&
+                       (!std::is_same_v<bool, Type>))
     {
         uint64_t* jsonPtr = jsonValue.get_ptr<uint64_t*>();
         if (jsonPtr == nullptr)
@@ -560,15 +560,16 @@
                 break;
             }
 
-            result = std::visit(
-                         [&item, &unpackSpec, &res](auto&& val) {
-                using ContainedT =
-                    std::remove_pointer_t<std::decay_t<decltype(val)>>;
-                return details::unpackValue<ContainedT>(
-                    item.second, unpackSpec.key, res, *val);
-            },
-                         unpackSpec.value) &&
-                     result;
+            result =
+                std::visit(
+                    [&item, &unpackSpec, &res](auto&& val) {
+                        using ContainedT =
+                            std::remove_pointer_t<std::decay_t<decltype(val)>>;
+                        return details::unpackValue<ContainedT>(
+                            item.second, unpackSpec.key, res, *val);
+                    },
+                    unpackSpec.value) &&
+                result;
 
             unpackSpec.complete = true;
             break;
@@ -587,10 +588,10 @@
         {
             bool isOptional = std::visit(
                 [](auto&& val) {
-                using ContainedType =
-                    std::remove_pointer_t<std::decay_t<decltype(val)>>;
-                return details::IsOptional<ContainedType>::value;
-            },
+                    using ContainedType =
+                        std::remove_pointer_t<std::decay_t<decltype(val)>>;
+                    return details::IsOptional<ContainedType>::value;
+                },
                 perUnpack.value);
             if (isOptional)
             {
@@ -679,8 +680,8 @@
     }
     std::erase_if(*object,
                   [](const std::pair<std::string, nlohmann::json>& item) {
-        return item.first.starts_with("@odata.");
-    });
+                      return item.first.starts_with("@odata.");
+                  });
     if (object->empty())
     {
         //  If the update request only contains OData annotations, the service
diff --git a/redfish-core/include/utils/query_param.hpp b/redfish-core/include/utils/query_param.hpp
index 3ec4dc3..5de3967 100644
--- a/redfish-core/include/utils/query_param.hpp
+++ b/redfish-core/include/utils/query_param.hpp
@@ -310,8 +310,8 @@
 
 inline QueryError getNumericParam(std::string_view value, size_t& param)
 {
-    std::from_chars_result r = std::from_chars(value.begin(), value.end(),
-                                               param);
+    std::from_chars_result r =
+        std::from_chars(value.begin(), value.end(), param);
 
     // If the number wasn't representable in the type, it's out of range
     if (r.ec == std::errc::result_out_of_range)
@@ -387,8 +387,8 @@
     return query.filter.has_value();
 }
 
-inline std::optional<Query> parseParameters(boost::urls::params_view urlParams,
-                                            crow::Response& res)
+inline std::optional<Query>
+    parseParameters(boost::urls::params_view urlParams, crow::Response& res)
 {
     Query ret{};
     for (const boost::urls::params_view::value_type& it : urlParams)
@@ -698,9 +698,8 @@
 // Isn't a concern until https://gerrit.openbmc.org/c/openbmc/bmcweb/+/60556
 // lands.  May want to avoid forwarding query params when request is uptree from
 // a top level collection.
-inline std::vector<ExpandNode>
-    findNavigationReferences(ExpandType eType, int depth, int skipDepth,
-                             nlohmann::json& jsonResponse)
+inline std::vector<ExpandNode> findNavigationReferences(
+    ExpandType eType, int depth, int skipDepth, nlohmann::json& jsonResponse)
 {
     std::vector<ExpandNode> ret;
     const nlohmann::json::json_pointer root = nlohmann::json::json_pointer("");
@@ -790,8 +789,9 @@
     if (finalCodeIndex != std::numeric_limits<size_t>::max() &&
         subResponseCodeIndex != std::numeric_limits<size_t>::max())
     {
-        return finalCodeIndex <= subResponseCodeIndex ? finalCode
-                                                      : subResponseCode;
+        return finalCodeIndex <= subResponseCodeIndex
+                   ? finalCode
+                   : subResponseCode;
     }
     if (subResponseCode == 500 || finalCode == 500)
     {
@@ -832,8 +832,7 @@
     // class manages the final "merge" of the json resources.
     MultiAsyncResp(crow::App& appIn,
                    std::shared_ptr<bmcweb::AsyncResp> finalResIn) :
-        app(appIn),
-        finalRes(std::move(finalResIn))
+        app(appIn), finalRes(std::move(finalResIn))
     {}
 
     void addAwaitingResponse(
diff --git a/redfish-core/include/utils/sw_utils.hpp b/redfish-core/include/utils/sw_utils.hpp
index 8455145..fc15783 100644
--- a/redfish-core/include/utils/sw_utils.hpp
+++ b/redfish-core/include/utils/sw_utils.hpp
@@ -99,178 +99,193 @@
          populateLinkToImages](
             const boost::system::error_code& ec,
             const dbus::utility::MapperEndPoints& functionalSw) {
-        BMCWEB_LOG_DEBUG("populateSoftwareInformation enter");
-        if (ec)
-        {
-            BMCWEB_LOG_ERROR("error_code = {}", ec);
-            BMCWEB_LOG_ERROR("error msg = {}", ec.message());
-            messages::internalError(asyncResp->res);
-            return;
-        }
-
-        if (functionalSw.empty())
-        {
-            // Could keep going and try to populate SoftwareImages but
-            // something is seriously wrong, so just fail
-            BMCWEB_LOG_ERROR("Zero functional software in system");
-            messages::internalError(asyncResp->res);
-            return;
-        }
-
-        std::vector<std::string> functionalSwIds;
-        // example functionalSw:
-        // v as 2 "/xyz/openbmc_project/software/ace821ef"
-        //        "/xyz/openbmc_project/software/230fb078"
-        for (const auto& sw : functionalSw)
-        {
-            sdbusplus::message::object_path path(sw);
-            std::string leaf = path.filename();
-            if (leaf.empty())
+            BMCWEB_LOG_DEBUG("populateSoftwareInformation enter");
+            if (ec)
             {
-                continue;
-            }
-
-            functionalSwIds.push_back(leaf);
-        }
-
-        constexpr std::array<std::string_view, 1> interfaces = {
-            "xyz.openbmc_project.Software.Version"};
-        dbus::utility::getSubTree(
-            "/xyz/openbmc_project/software", 0, interfaces,
-            [asyncResp, swVersionPurpose, activeVersionPropName,
-             populateLinkToImages, functionalSwIds](
-                const boost::system::error_code& ec2,
-                const dbus::utility::MapperGetSubTreeResponse& subtree) {
-            if (ec2)
-            {
-                BMCWEB_LOG_ERROR("error_code = {}", ec2);
-                BMCWEB_LOG_ERROR("error msg = {}", ec2.message());
+                BMCWEB_LOG_ERROR("error_code = {}", ec);
+                BMCWEB_LOG_ERROR("error msg = {}", ec.message());
                 messages::internalError(asyncResp->res);
                 return;
             }
 
-            BMCWEB_LOG_DEBUG("Found {} images", subtree.size());
-
-            for (const std::pair<std::string,
-                                 std::vector<std::pair<
-                                     std::string, std::vector<std::string>>>>&
-                     obj : subtree)
+            if (functionalSw.empty())
             {
-                sdbusplus::message::object_path path(obj.first);
-                std::string swId = path.filename();
-                if (swId.empty())
-                {
-                    messages::internalError(asyncResp->res);
-                    BMCWEB_LOG_ERROR("Invalid software ID");
+                // Could keep going and try to populate SoftwareImages but
+                // something is seriously wrong, so just fail
+                BMCWEB_LOG_ERROR("Zero functional software in system");
+                messages::internalError(asyncResp->res);
+                return;
+            }
 
-                    return;
+            std::vector<std::string> functionalSwIds;
+            // example functionalSw:
+            // v as 2 "/xyz/openbmc_project/software/ace821ef"
+            //        "/xyz/openbmc_project/software/230fb078"
+            for (const auto& sw : functionalSw)
+            {
+                sdbusplus::message::object_path path(sw);
+                std::string leaf = path.filename();
+                if (leaf.empty())
+                {
+                    continue;
                 }
 
-                bool runningImage = false;
-                // Look at Ids from
-                // /xyz/openbmc_project/software/functional
-                // to determine if this is a running image
-                if (std::ranges::find(functionalSwIds, swId) !=
-                    functionalSwIds.end())
-                {
-                    runningImage = true;
-                }
+                functionalSwIds.push_back(leaf);
+            }
 
-                // Now grab its version info
-                sdbusplus::asio::getAllProperties(
-                    *crow::connections::systemBus, obj.second[0].first,
-                    obj.first, "xyz.openbmc_project.Software.Version",
-                    [asyncResp, swId, runningImage, swVersionPurpose,
-                     activeVersionPropName, populateLinkToImages](
-                        const boost::system::error_code& ec3,
-                        const dbus::utility::DBusPropertiesMap&
-                            propertiesList) {
-                    if (ec3)
+            constexpr std::array<std::string_view, 1> interfaces = {
+                "xyz.openbmc_project.Software.Version"};
+            dbus::utility::getSubTree(
+                "/xyz/openbmc_project/software", 0, interfaces,
+                [asyncResp, swVersionPurpose, activeVersionPropName,
+                 populateLinkToImages, functionalSwIds](
+                    const boost::system::error_code& ec2,
+                    const dbus::utility::MapperGetSubTreeResponse& subtree) {
+                    if (ec2)
                     {
-                        BMCWEB_LOG_ERROR("error_code = {}", ec3);
-                        BMCWEB_LOG_ERROR("error msg = {}", ec3.message());
-                        // Have seen the code update app delete the D-Bus
-                        // object, during code update, between the call to
-                        // mapper and here. Just leave these properties off if
-                        // resource not found.
-                        if (ec3.value() == EBADR)
+                        BMCWEB_LOG_ERROR("error_code = {}", ec2);
+                        BMCWEB_LOG_ERROR("error msg = {}", ec2.message());
+                        messages::internalError(asyncResp->res);
+                        return;
+                    }
+
+                    BMCWEB_LOG_DEBUG("Found {} images", subtree.size());
+
+                    for (const std::pair<
+                             std::string,
+                             std::vector<std::pair<
+                                 std::string, std::vector<std::string>>>>& obj :
+                         subtree)
+                    {
+                        sdbusplus::message::object_path path(obj.first);
+                        std::string swId = path.filename();
+                        if (swId.empty())
                         {
+                            messages::internalError(asyncResp->res);
+                            BMCWEB_LOG_ERROR("Invalid software ID");
+
                             return;
                         }
-                        messages::internalError(asyncResp->res);
-                        return;
-                    }
-                    // example propertiesList
-                    // a{sv} 2 "Version" s
-                    // "IBM-witherspoon-OP9-v2.0.10-2.22" "Purpose"
-                    // s
-                    // "xyz.openbmc_project.Software.Version.VersionPurpose.Host"
-                    const std::string* version = nullptr;
-                    const std::string* swInvPurpose = nullptr;
 
-                    const bool success = sdbusplus::unpackPropertiesNoThrow(
-                        dbus_utils::UnpackErrorPrinter(), propertiesList,
-                        "Purpose", swInvPurpose, "Version", version);
-
-                    if (!success)
-                    {
-                        messages::internalError(asyncResp->res);
-                        return;
-                    }
-
-                    if (version == nullptr || version->empty())
-                    {
-                        messages::internalError(asyncResp->res);
-                        return;
-                    }
-                    if (swInvPurpose == nullptr ||
-                        *swInvPurpose != swVersionPurpose)
-                    {
-                        // Not purpose we're looking for
-                        return;
-                    }
-
-                    BMCWEB_LOG_DEBUG("Image ID: {}", swId);
-                    BMCWEB_LOG_DEBUG("Running image: {}", runningImage);
-                    BMCWEB_LOG_DEBUG("Image purpose: {}", *swInvPurpose);
-
-                    if (populateLinkToImages)
-                    {
-                        nlohmann::json& softwareImageMembers =
-                            asyncResp->res.jsonValue["Links"]["SoftwareImages"];
-                        // Firmware images are at
-                        // /redfish/v1/UpdateService/FirmwareInventory/<Id>
-                        // e.g. .../FirmwareInventory/82d3ec86
-                        nlohmann::json::object_t member;
-                        member["@odata.id"] = boost::urls::format(
-                            "/redfish/v1/UpdateService/FirmwareInventory/{}",
-                            swId);
-                        softwareImageMembers.emplace_back(std::move(member));
-                        asyncResp->res
-                            .jsonValue["Links"]["SoftwareImages@odata.count"] =
-                            softwareImageMembers.size();
-
-                        if (runningImage)
+                        bool runningImage = false;
+                        // Look at Ids from
+                        // /xyz/openbmc_project/software/functional
+                        // to determine if this is a running image
+                        if (std::ranges::find(functionalSwIds, swId) !=
+                            functionalSwIds.end())
                         {
-                            nlohmann::json::object_t runningMember;
-                            runningMember["@odata.id"] = boost::urls::format(
-                                "/redfish/v1/UpdateService/FirmwareInventory/{}",
-                                swId);
-                            // Create the link to the running image
-                            asyncResp->res
-                                .jsonValue["Links"]["ActiveSoftwareImage"] =
-                                std::move(runningMember);
+                            runningImage = true;
                         }
-                    }
-                    if (!activeVersionPropName.empty() && runningImage)
-                    {
-                        asyncResp->res.jsonValue[activeVersionPropName] =
-                            *version;
+
+                        // Now grab its version info
+                        sdbusplus::asio::getAllProperties(
+                            *crow::connections::systemBus, obj.second[0].first,
+                            obj.first, "xyz.openbmc_project.Software.Version",
+                            [asyncResp, swId, runningImage, swVersionPurpose,
+                             activeVersionPropName, populateLinkToImages](
+                                const boost::system::error_code& ec3,
+                                const dbus::utility::DBusPropertiesMap&
+                                    propertiesList) {
+                                if (ec3)
+                                {
+                                    BMCWEB_LOG_ERROR("error_code = {}", ec3);
+                                    BMCWEB_LOG_ERROR("error msg = {}",
+                                                     ec3.message());
+                                    // Have seen the code update app delete the
+                                    // D-Bus object, during code update, between
+                                    // the call to mapper and here. Just leave
+                                    // these properties off if resource not
+                                    // found.
+                                    if (ec3.value() == EBADR)
+                                    {
+                                        return;
+                                    }
+                                    messages::internalError(asyncResp->res);
+                                    return;
+                                }
+                                // example propertiesList
+                                // a{sv} 2 "Version" s
+                                // "IBM-witherspoon-OP9-v2.0.10-2.22" "Purpose"
+                                // s
+                                // "xyz.openbmc_project.Software.Version.VersionPurpose.Host"
+                                const std::string* version = nullptr;
+                                const std::string* swInvPurpose = nullptr;
+
+                                const bool success =
+                                    sdbusplus::unpackPropertiesNoThrow(
+                                        dbus_utils::UnpackErrorPrinter(),
+                                        propertiesList, "Purpose", swInvPurpose,
+                                        "Version", version);
+
+                                if (!success)
+                                {
+                                    messages::internalError(asyncResp->res);
+                                    return;
+                                }
+
+                                if (version == nullptr || version->empty())
+                                {
+                                    messages::internalError(asyncResp->res);
+                                    return;
+                                }
+                                if (swInvPurpose == nullptr ||
+                                    *swInvPurpose != swVersionPurpose)
+                                {
+                                    // Not purpose we're looking for
+                                    return;
+                                }
+
+                                BMCWEB_LOG_DEBUG("Image ID: {}", swId);
+                                BMCWEB_LOG_DEBUG("Running image: {}",
+                                                 runningImage);
+                                BMCWEB_LOG_DEBUG("Image purpose: {}",
+                                                 *swInvPurpose);
+
+                                if (populateLinkToImages)
+                                {
+                                    nlohmann::json& softwareImageMembers =
+                                        asyncResp->res
+                                            .jsonValue["Links"]
+                                                      ["SoftwareImages"];
+                                    // Firmware images are at
+                                    // /redfish/v1/UpdateService/FirmwareInventory/<Id>
+                                    // e.g. .../FirmwareInventory/82d3ec86
+                                    nlohmann::json::object_t member;
+                                    member["@odata.id"] = boost::urls::format(
+                                        "/redfish/v1/UpdateService/FirmwareInventory/{}",
+                                        swId);
+                                    softwareImageMembers.emplace_back(
+                                        std::move(member));
+                                    asyncResp->res.jsonValue
+                                        ["Links"]
+                                        ["SoftwareImages@odata.count"] =
+                                        softwareImageMembers.size();
+
+                                    if (runningImage)
+                                    {
+                                        nlohmann::json::object_t runningMember;
+                                        runningMember["@odata.id"] =
+                                            boost::urls::format(
+                                                "/redfish/v1/UpdateService/FirmwareInventory/{}",
+                                                swId);
+                                        // Create the link to the running image
+                                        asyncResp->res
+                                            .jsonValue["Links"]
+                                                      ["ActiveSoftwareImage"] =
+                                            std::move(runningMember);
+                                    }
+                                }
+                                if (!activeVersionPropName.empty() &&
+                                    runningImage)
+                                {
+                                    asyncResp->res
+                                        .jsonValue[activeVersionPropName] =
+                                        *version;
+                                }
+                            });
                     }
                 });
-            }
         });
-    });
 }
 
 /**
@@ -351,38 +366,38 @@
         [asyncResp,
          swId](const boost::system::error_code& ec,
                const dbus::utility::DBusPropertiesMap& propertiesList) {
-        if (ec)
-        {
-            // not all swtypes are updateable, this is ok
+            if (ec)
+            {
+                // not all swtypes are updateable, this is ok
+                asyncResp->res.jsonValue["Status"]["State"] =
+                    resource::State::Enabled;
+                return;
+            }
+
+            const std::string* swInvActivation = nullptr;
+
+            const bool success = sdbusplus::unpackPropertiesNoThrow(
+                dbus_utils::UnpackErrorPrinter(), propertiesList, "Activation",
+                swInvActivation);
+
+            if (!success)
+            {
+                messages::internalError(asyncResp->res);
+                return;
+            }
+
+            if (swInvActivation == nullptr)
+            {
+                messages::internalError(asyncResp->res);
+                return;
+            }
+
+            BMCWEB_LOG_DEBUG("getSwStatus: Activation {}", *swInvActivation);
             asyncResp->res.jsonValue["Status"]["State"] =
-                resource::State::Enabled;
-            return;
-        }
-
-        const std::string* swInvActivation = nullptr;
-
-        const bool success = sdbusplus::unpackPropertiesNoThrow(
-            dbus_utils::UnpackErrorPrinter(), propertiesList, "Activation",
-            swInvActivation);
-
-        if (!success)
-        {
-            messages::internalError(asyncResp->res);
-            return;
-        }
-
-        if (swInvActivation == nullptr)
-        {
-            messages::internalError(asyncResp->res);
-            return;
-        }
-
-        BMCWEB_LOG_DEBUG("getSwStatus: Activation {}", *swInvActivation);
-        asyncResp->res.jsonValue["Status"]["State"] =
-            getRedfishSwState(*swInvActivation);
-        asyncResp->res.jsonValue["Status"]["Health"] =
-            getRedfishSwHealth(*swInvActivation);
-    });
+                getRedfishSwState(*swInvActivation);
+            asyncResp->res.jsonValue["Status"]["Health"] =
+                getRedfishSwHealth(*swInvActivation);
+        });
 }
 
 inline void handleUpdateableEndpoints(
