diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index ee8447d..8f45fca 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -10,6 +10,7 @@
 #include <query.hpp>
 #include <registries/privilege_registry.hpp>
 
+#include <map>
 #include <tuple>
 #include <variant>
 
@@ -335,7 +336,7 @@
     AddReport& operator=(const AddReport&) = delete;
     AddReport& operator=(AddReport&&) = delete;
 
-    void insert(const boost::container::flat_map<std::string, std::string>& el)
+    void insert(const std::map<std::string, std::string>& el)
     {
         uriToDbus.insert(el.begin(), el.end());
     }
@@ -403,8 +404,7 @@
                 chassis, sensorType,
                 [asyncResp, addReportReq](
                     const boost::beast::http::status status,
-                    const boost::container::flat_map<std::string, std::string>&
-                        uriToDbus) {
+                    const std::map<std::string, std::string>& uriToDbus) {
                 if (status != boost::beast::http::status::ok)
                 {
                     BMCWEB_LOG_ERROR
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 489c49d..09e21e8 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -18,7 +18,6 @@
 #include <app.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/split.hpp>
-#include <boost/container/flat_map.hpp>
 #include <boost/range/algorithm/replace_copy_if.hpp>
 #include <dbus_singleton.hpp>
 #include <dbus_utility.hpp>
@@ -29,6 +28,9 @@
 #include <utils/query_param.hpp>
 
 #include <cmath>
+#include <iterator>
+#include <map>
+#include <set>
 #include <utility>
 #include <variant>
 
@@ -180,7 +182,7 @@
   public:
     using DataCompleteCb = std::function<void(
         const boost::beast::http::status status,
-        const boost::container::flat_map<std::string, std::string>& uriToDbus)>;
+        const std::map<std::string, std::string>& uriToDbus)>;
 
     struct SensorData
     {
@@ -234,7 +236,7 @@
 
         if (dataComplete && metadata)
         {
-            boost::container::flat_map<std::string, std::string> map;
+            std::map<std::string, std::string> map;
             if (asyncResp->res.result() == boost::beast::http::status::ok)
             {
                 for (auto& sensor : *metadata)
@@ -340,7 +342,7 @@
 template <typename Callback>
 void getObjectsWithConnection(
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
+    const std::shared_ptr<std::set<std::string>>& sensorNames,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getObjectsWithConnection enter";
@@ -366,11 +368,8 @@
 
         // Make unique list of connections only for requested sensor types and
         // found in the chassis
-        boost::container::flat_set<std::string> connections;
+        std::set<std::string> connections;
         std::set<std::pair<std::string, std::string>> objectsWithConnection;
-        // Intrinsic to avoid malloc.  Most systems will have < 8 sensor
-        // producers
-        connections.reserve(8);
 
         BMCWEB_LOG_DEBUG << "sensorNames list count: " << sensorNames->size();
         for (const std::string& tsensor : *sensorNames)
@@ -414,13 +413,12 @@
  * @param callback Callback for processing gathered connections
  */
 template <typename Callback>
-void getConnections(
-    std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>> sensorNames,
-    Callback&& callback)
+void getConnections(std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
+                    const std::shared_ptr<std::set<std::string>> sensorNames,
+                    Callback&& callback)
 {
     auto objectsWithConnectionCb =
-        [callback](const boost::container::flat_set<std::string>& connections,
+        [callback](const std::set<std::string>& connections,
                    const std::set<std::pair<std::string, std::string>>&
                    /*objectsWithConnection*/) { callback(connections); };
     getObjectsWithConnection(sensorsAsyncResp, sensorNames,
@@ -439,8 +437,7 @@
 inline void reduceSensorList(
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     const std::vector<std::string>* allSensors,
-    const std::shared_ptr<boost::container::flat_set<std::string>>&
-        activeSensors)
+    const std::shared_ptr<std::set<std::string>>& activeSensors)
 {
     if (sensorsAsyncResp == nullptr)
     {
@@ -632,9 +629,8 @@
                     return;
                 }
             }
-            const std::shared_ptr<boost::container::flat_set<std::string>>
-                culledSensorList =
-                    std::make_shared<boost::container::flat_set<std::string>>();
+            const std::shared_ptr<std::set<std::string>> culledSensorList =
+                std::make_shared<std::set<std::string>>();
             reduceSensorList(sensorsAsyncResp, &nodeSensorList,
                              culledSensorList);
             callback(culledSensorList);
@@ -660,8 +656,7 @@
  *
  * The callback must have the following signature:
  *   @code
- *   callback(std::shared_ptr<boost::container::flat_map<std::string,
- *                std::string>> objectMgrPaths)
+ *   callback(std::shared_ptr<std::map<std::string,std::string>> objectMgrPaths)
  *   @endcode
  *
  * @param sensorsAsyncResp Pointer to object holding response data.
@@ -691,9 +686,8 @@
         }
 
         // Loop over returned object paths
-        std::shared_ptr<boost::container::flat_map<std::string, std::string>>
-            objectMgrPaths = std::make_shared<
-                boost::container::flat_map<std::string, std::string>>();
+        std::shared_ptr<std::map<std::string, std::string>> objectMgrPaths =
+            std::make_shared<std::map<std::string, std::string>>();
         for (const std::pair<
                  std::string,
                  std::vector<std::pair<std::string, std::vector<std::string>>>>&
@@ -1187,8 +1181,8 @@
                 crow::connections::systemBus->async_method_call(
                     [path, sensorsAsyncResp](
                         const boost::system::error_code& err,
-                        const boost::container::flat_map<
-                            std::string, dbus::utility::DbusVariantType>& ret) {
+                        const std::map<std::string,
+                                       dbus::utility::DbusVariantType>& ret) {
                     if (err)
                     {
                         return; // don't have to have this
@@ -1595,9 +1589,8 @@
 static void getInventoryItemsData(
     std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
     std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
-    std::shared_ptr<boost::container::flat_set<std::string>> invConnections,
-    std::shared_ptr<boost::container::flat_map<std::string, std::string>>
-        objectMgrPaths,
+    std::shared_ptr<std::set<std::string>> invConnections,
+    std::shared_ptr<std::map<std::string, std::string>> objectMgrPaths,
     Callback&& callback, size_t invConnectionsIndex = 0)
 {
     BMCWEB_LOG_DEBUG << "getInventoryItemsData enter";
@@ -1611,7 +1604,8 @@
     }
 
     // Get inventory item data from current connection
-    auto it = invConnections->nth(invConnectionsIndex);
+    auto it = invConnections->begin();
+    std::advance(it, invConnectionsIndex);
     if (it != invConnections->end())
     {
         const std::string& invConnection = *it;
@@ -1683,8 +1677,7 @@
  *
  * The callback must have the following signature:
  *   @code
- *   callback(std::shared_ptr<boost::container::flat_set<std::string>>
- *            invConnections)
+ *   callback(std::shared_ptr<std::set<std::string>> invConnections)
  *   @endcode
  *
  * @param sensorsAsyncResp Pointer to object holding response data.
@@ -1722,10 +1715,8 @@
         }
 
         // Make unique list of connections for desired inventory items
-        std::shared_ptr<boost::container::flat_set<std::string>>
-            invConnections =
-                std::make_shared<boost::container::flat_set<std::string>>();
-        invConnections->reserve(8);
+        std::shared_ptr<std::set<std::string>> invConnections =
+            std::make_shared<std::set<std::string>>();
 
         // Loop through objects from GetSubTree
         for (const std::pair<
@@ -1783,9 +1774,8 @@
 template <typename Callback>
 static void getInventoryItemAssociations(
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
-    const std::shared_ptr<boost::container::flat_map<std::string, std::string>>&
-        objectMgrPaths,
+    const std::shared_ptr<std::set<std::string>>& sensorNames,
+    const std::shared_ptr<std::map<std::string, std::string>>& objectMgrPaths,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getInventoryItemAssociations enter";
@@ -1951,8 +1941,7 @@
 void getInventoryLedData(
     std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
     std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
-    std::shared_ptr<boost::container::flat_map<std::string, std::string>>
-        ledConnections,
+    std::shared_ptr<std::map<std::string, std::string>> ledConnections,
     Callback&& callback, size_t ledConnectionsIndex = 0)
 {
     BMCWEB_LOG_DEBUG << "getInventoryLedData enter";
@@ -1966,7 +1955,8 @@
     }
 
     // Get inventory item data from current connection
-    auto it = ledConnections->nth(ledConnectionsIndex);
+    auto it = ledConnections->begin();
+    std::advance(it, ledConnectionsIndex);
     if (it != ledConnections->end())
     {
         const std::string& ledPath = (*it).first;
@@ -2078,9 +2068,8 @@
         }
 
         // Build map of LED object paths to connections
-        std::shared_ptr<boost::container::flat_map<std::string, std::string>>
-            ledConnections = std::make_shared<
-                boost::container::flat_map<std::string, std::string>>();
+        std::shared_ptr<std::map<std::string, std::string>> ledConnections =
+            std::make_shared<std::map<std::string, std::string>>();
 
         // Loop through objects from GetSubTree
         for (const std::pair<
@@ -2141,8 +2130,7 @@
 void getPowerSupplyAttributesData(
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     std::shared_ptr<std::vector<InventoryItem>> inventoryItems,
-    const boost::container::flat_map<std::string, std::string>&
-        psAttributesConnections,
+    const std::map<std::string, std::string>& psAttributesConnections,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getPowerSupplyAttributesData enter";
@@ -2155,7 +2143,7 @@
     }
 
     // Assuming just one connection (service) for now
-    auto it = psAttributesConnections.nth(0);
+    auto it = psAttributesConnections.begin();
 
     const std::string& psAttributesPath = (*it).first;
     const std::string& psAttributesConnection = (*it).second;
@@ -2265,8 +2253,7 @@
         // Currently we only support 1 power supply attribute, use this for
         // all the power supplies. Build map of object path to connection.
         // Assume just 1 connection and 1 path for now.
-        boost::container::flat_map<std::string, std::string>
-            psAttributesConnections;
+        std::map<std::string, std::string> psAttributesConnections;
 
         if (subtree[0].first.empty() || subtree[0].second.empty())
         {
@@ -2329,9 +2316,8 @@
 template <typename Callback>
 static void getInventoryItems(
     std::shared_ptr<SensorsAsyncResp> sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>> sensorNames,
-    std::shared_ptr<boost::container::flat_map<std::string, std::string>>
-        objectMgrPaths,
+    const std::shared_ptr<std::set<std::string>> sensorNames,
+    std::shared_ptr<std::map<std::string, std::string>> objectMgrPaths,
     Callback&& callback)
 {
     BMCWEB_LOG_DEBUG << "getInventoryItems enter";
@@ -2343,8 +2329,7 @@
         auto getInventoryItemsConnectionsCb =
             [sensorsAsyncResp, inventoryItems, objectMgrPaths,
              callback{std::forward<const Callback>(callback)}](
-                std::shared_ptr<boost::container::flat_set<std::string>>
-                    invConnections) {
+                std::shared_ptr<std::set<std::string>> invConnections) {
             BMCWEB_LOG_DEBUG << "getInventoryItemsConnectionsCb enter";
             auto getInventoryItemsDataCb = [sensorsAsyncResp, inventoryItems,
                                             callback{std::move(callback)}]() {
@@ -2470,10 +2455,9 @@
  */
 inline void getSensorData(
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames,
-    const boost::container::flat_set<std::string>& connections,
-    const std::shared_ptr<boost::container::flat_map<std::string, std::string>>&
-        objectMgrPaths,
+    const std::shared_ptr<std::set<std::string>>& sensorNames,
+    const std::set<std::string>& connections,
+    const std::shared_ptr<std::map<std::string, std::string>>& objectMgrPaths,
     const std::shared_ptr<std::vector<InventoryItem>>& inventoryItems)
 {
     BMCWEB_LOG_DEBUG << "getSensorData enter";
@@ -2679,18 +2663,17 @@
     BMCWEB_LOG_DEBUG << "getSensorData exit";
 }
 
-inline void processSensorList(
-    const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames)
+inline void
+    processSensorList(const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
+                      const std::shared_ptr<std::set<std::string>>& sensorNames)
 {
-    auto getConnectionCb =
-        [sensorsAsyncResp, sensorNames](
-            const boost::container::flat_set<std::string>& connections) {
+    auto getConnectionCb = [sensorsAsyncResp, sensorNames](
+                               const std::set<std::string>& connections) {
         BMCWEB_LOG_DEBUG << "getConnectionCb enter";
         auto getObjectManagerPathsCb =
-            [sensorsAsyncResp, sensorNames,
-             connections](const std::shared_ptr<boost::container::flat_map<
-                              std::string, std::string>>& objectMgrPaths) {
+            [sensorsAsyncResp, sensorNames, connections](
+                const std::shared_ptr<std::map<std::string, std::string>>&
+                    objectMgrPaths) {
             BMCWEB_LOG_DEBUG << "getObjectManagerPathsCb enter";
             auto getInventoryItemsCb =
                 [sensorsAsyncResp, sensorNames, connections, objectMgrPaths](
@@ -2732,8 +2715,7 @@
     BMCWEB_LOG_DEBUG << "getChassisData enter";
     auto getChassisCb =
         [sensorsAsyncResp](
-            const std::shared_ptr<boost::container::flat_set<std::string>>&
-                sensorNames) {
+            const std::shared_ptr<std::set<std::string>>& sensorNames) {
         BMCWEB_LOG_DEBUG << "getChassisCb enter";
         processSensorList(sensorsAsyncResp, sensorNames);
         BMCWEB_LOG_DEBUG << "getChassisCb exit";
@@ -2758,12 +2740,12 @@
  * @param sensorsModified  The list of sensors that were found as a result of
  *                         repeated calls to this function
  */
-inline bool findSensorNameUsingSensorPath(
-    std::string_view sensorName,
-    boost::container::flat_set<std::string>& sensorsList,
-    boost::container::flat_set<std::string>& sensorsModified)
+inline bool
+    findSensorNameUsingSensorPath(std::string_view sensorName,
+                                  std::set<std::string>& sensorsList,
+                                  std::set<std::string>& sensorsModified)
 {
-    for (auto& chassisSensor : sensorsList)
+    for (const auto& chassisSensor : sensorsList)
     {
         sdbusplus::message::object_path path(chassisSensor);
         std::string thisSensorName = path.filename();
@@ -2828,13 +2810,11 @@
 
     auto getChassisSensorListCb =
         [sensorAsyncResp, overrideMap](
-            const std::shared_ptr<boost::container::flat_set<std::string>>&
-                sensorsList) {
+            const std::shared_ptr<std::set<std::string>>& sensorsList) {
         // Match sensor names in the PATCH request to those managed by the
         // chassis node
-        const std::shared_ptr<boost::container::flat_set<std::string>>
-            sensorNames =
-                std::make_shared<boost::container::flat_set<std::string>>();
+        const std::shared_ptr<std::set<std::string>> sensorNames =
+            std::make_shared<std::set<std::string>>();
         for (const auto& item : overrideMap)
         {
             const auto& sensor = item.first;
@@ -2849,10 +2829,10 @@
         }
         // Get the connection to which the memberId belongs
         auto getObjectsWithConnectionCb =
-            [sensorAsyncResp, overrideMap](
-                const boost::container::flat_set<std::string>& /*connections*/,
-                const std::set<std::pair<std::string, std::string>>&
-                    objectsWithConnection) {
+            [sensorAsyncResp,
+             overrideMap](const std::set<std::string>& /*connections*/,
+                          const std::set<std::pair<std::string, std::string>>&
+                              objectsWithConnection) {
             if (objectsWithConnection.size() != overrideMap.size())
             {
                 BMCWEB_LOG_INFO
@@ -2946,11 +2926,11 @@
     }
 
     auto asyncResp = std::make_shared<bmcweb::AsyncResp>();
-    auto callback =
-        [asyncResp, mapCompleteCb{std::move(mapComplete)}](
-            const boost::beast::http::status status,
-            const boost::container::flat_map<std::string, std::string>&
-                uriToDbus) { mapCompleteCb(status, uriToDbus); };
+    auto callback = [asyncResp, mapCompleteCb{std::move(mapComplete)}](
+                        const boost::beast::http::status status,
+                        const std::map<std::string, std::string>& uriToDbus) {
+        mapCompleteCb(status, uriToDbus);
+    };
 
     auto resp = std::make_shared<SensorsAsyncResp>(
         asyncResp, chassis, pathIt->second, node, std::move(callback));
@@ -2962,13 +2942,13 @@
 
 inline void getChassisCallback(
     const std::shared_ptr<SensorsAsyncResp>& asyncResp,
-    const std::shared_ptr<boost::container::flat_set<std::string>>& sensorNames)
+    const std::shared_ptr<std::set<std::string>>& sensorNames)
 {
     BMCWEB_LOG_DEBUG << "getChassisCallback enter";
 
     nlohmann::json& entriesArray =
         asyncResp->asyncResp->res.jsonValue["Members"];
-    for (auto& sensor : *sensorNames)
+    for (const auto& sensor : *sensorNames)
     {
         BMCWEB_LOG_DEBUG << "Adding sensor: " << sensor;
 
@@ -3097,9 +3077,8 @@
         BMCWEB_LOG_DEBUG << "Found sensor path for sensor '" << sensorName
                          << "': " << sensorPath;
 
-        const std::shared_ptr<boost::container::flat_set<std::string>>
-            sensorList =
-                std::make_shared<boost::container::flat_set<std::string>>();
+        const std::shared_ptr<std::set<std::string>> sensorList =
+            std::make_shared<std::set<std::string>>();
 
         sensorList->emplace(sensorPath);
         processSensorList(asyncResp, sensorList);
