diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index efd31fa..d500a00 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -48,8 +48,7 @@
     std::map<sdbusplus::message::object_path,
              std::map<std::string, std::map<std::string, DbusVariant>>>;
 
-static constexpr int sensorListUpdatePeriod = 10;
-static constexpr int sensorMapUpdatePeriod = 2;
+static constexpr int sensorMapUpdatePeriod = 10;
 
 constexpr size_t maxSDRTotalSize =
     76; // Largest SDR Record Size (type 01) + SDR Overheader Size
@@ -210,7 +209,8 @@
     }
 }
 
-static bool getSensorMap(std::string sensorConnection, std::string sensorPath,
+static bool getSensorMap(boost::asio::yield_context yield,
+                         std::string sensorConnection, std::string sensorPath,
                          SensorMap &sensorMap)
 {
     static boost::container::flat_map<
@@ -232,22 +232,16 @@
         updateTimeMap[sensorConnection] = now;
 
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        auto managedObj = dbus->new_method_call(
-            sensorConnection.c_str(), "/", "org.freedesktop.DBus.ObjectManager",
-            "GetManagedObjects");
-
-        ManagedObjectType managedObjects;
-        try
-        {
-            auto reply = dbus->call(managedObj);
-            reply.read(managedObjects);
-        }
-        catch (sdbusplus::exception_t &)
+        boost::system::error_code ec;
+        auto managedObjects = dbus->yield_method_call<ManagedObjectType>(
+            yield, ec, sensorConnection.c_str(), "/",
+            "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+        if (ec)
         {
             phosphor::logging::log<phosphor::logging::level::ERR>(
-                "Error getting managed objects from connection",
-                phosphor::logging::entry("CONNECTION=%s",
-                                         sensorConnection.c_str()));
+                "GetMangagedObjects for getSensorMap failed",
+                phosphor::logging::entry("ERROR=%s", ec.message().c_str()));
+
             return false;
         }
 
@@ -402,7 +396,7 @@
 }
 
 ipmi::RspType<uint8_t, uint8_t, uint8_t, std::optional<uint8_t>>
-    ipmiSenGetSensorReading(uint8_t sensnum)
+    ipmiSenGetSensorReading(boost::asio::yield_context yield, uint8_t sensnum)
 {
     std::string connection;
     std::string path;
@@ -414,7 +408,7 @@
     }
 
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(yield, connection, path, sensorMap))
     {
         return ipmi::responseResponseError();
     }
@@ -523,13 +517,13 @@
  *  @returns IPMI completion code
  */
 ipmi::RspType<> ipmiSenSetSensorThresholds(
-    uint8_t sensorNum, bool lowerNonCriticalThreshMask,
-    bool lowerCriticalThreshMask, bool lowerNonRecovThreshMask,
-    bool upperNonCriticalThreshMask, bool upperCriticalThreshMask,
-    bool upperNonRecovThreshMask, uint2_t reserved, uint8_t lowerNonCritical,
-    uint8_t lowerCritical, uint8_t lowerNonRecoverable,
-    uint8_t upperNonCritical, uint8_t upperCritical,
-    uint8_t upperNonRecoverable)
+    boost::asio::yield_context yield, uint8_t sensorNum,
+    bool lowerNonCriticalThreshMask, bool lowerCriticalThreshMask,
+    bool lowerNonRecovThreshMask, bool upperNonCriticalThreshMask,
+    bool upperCriticalThreshMask, bool upperNonRecovThreshMask,
+    uint2_t reserved, uint8_t lowerNonCritical, uint8_t lowerCritical,
+    uint8_t lowerNonRecoverable, uint8_t upperNonCritical,
+    uint8_t upperCritical, uint8_t upperNonRecoverable)
 {
     constexpr uint8_t thresholdMask = 0xFF;
 
@@ -561,7 +555,7 @@
         return ipmi::response(status);
     }
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(yield, connection, path, sensorMap))
     {
         return ipmi::responseResponseError();
     }
@@ -750,7 +744,8 @@
               uint8_t, // upperNC
               uint8_t, // upperCrit
               uint8_t> // upperNRecoverable
-    ipmiSenGetSensorThresholds(uint8_t sensorNumber)
+    ipmiSenGetSensorThresholds(boost::asio::yield_context yield,
+                               uint8_t sensorNumber)
 {
     std::string connection;
     std::string path;
@@ -762,7 +757,7 @@
     }
 
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(yield, connection, path, sensorMap))
     {
         return ipmi::responseResponseError();
     }
@@ -832,7 +827,8 @@
               uint8_t, // assertionEnabledMsb
               uint8_t, // deassertionEnabledLsb
               uint8_t> // deassertionEnabledMsb
-    ipmiSenGetSensorEventEnable(uint8_t sensorNum)
+    ipmiSenGetSensorEventEnable(boost::asio::yield_context yield,
+                                uint8_t sensorNum)
 {
     std::string connection;
     std::string path;
@@ -850,7 +846,7 @@
     }
 
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(yield, connection, path, sensorMap))
     {
         return ipmi::responseResponseError();
     }
@@ -926,7 +922,8 @@
               std::bitset<16>, // assertions
               std::bitset<16>  // deassertion
               >
-    ipmiSenGetSensorEventStatus(uint8_t sensorNum)
+    ipmiSenGetSensorEventStatus(boost::asio::yield_context yield,
+                                uint8_t sensorNum)
 {
     if (sensorNum == 0xFF)
     {
@@ -945,7 +942,7 @@
     }
 
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(yield, connection, path, sensorMap))
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiSenGetSensorEventStatus: Sensor Mapping Error",
@@ -1072,7 +1069,7 @@
               uint32_t, // most recent erase
               uint8_t   // operationSupport
               >
-    ipmiStorageGetSDRRepositoryInfo(void)
+    ipmiStorageGetSDRRepositoryInfo(ipmi::Context::ptr ctx)
 {
     constexpr const uint16_t unspecifiedFreeSpace = 0xFFFF;
     if (sensorTree.empty() && !getSensorSubtree(sensorTree))
@@ -1081,7 +1078,7 @@
     }
 
     size_t fruCount = 0;
-    ipmi::Cc ret = ipmi::storage::getFruSdrCount(fruCount);
+    ipmi::Cc ret = ipmi::storage::getFruSdrCount(ctx, fruCount);
     if (ret != ipmi::ccSuccess)
     {
         return ipmi::response(ret);
@@ -1149,8 +1146,8 @@
 ipmi::RspType<uint16_t,            // next record ID
               std::vector<uint8_t> // payload
               >
-    ipmiStorageGetSDR(uint16_t reservationID, uint16_t recordID, uint8_t offset,
-                      uint8_t bytesToRead)
+    ipmiStorageGetSDR(ipmi::Context::ptr ctx, uint16_t reservationID,
+                      uint16_t recordID, uint8_t offset, uint8_t bytesToRead)
 {
     constexpr uint16_t lastRecordIndex = 0xFFFF;
 
@@ -1167,7 +1164,7 @@
     }
 
     size_t fruCount = 0;
-    ipmi::Cc ret = ipmi::storage::getFruSdrCount(fruCount);
+    ipmi::Cc ret = ipmi::storage::getFruSdrCount(ctx, fruCount);
     if (ret != ipmi::ccSuccess)
     {
         return ipmi::response(ret);
@@ -1217,7 +1214,7 @@
             {
                 return ipmi::responseInvalidFieldRequest();
             }
-            ret = ipmi::storage::getFruSdrs(fruIndex, data);
+            ret = ipmi::storage::getFruSdrs(ctx, fruIndex, data);
             if (ret != IPMI_CC_OK)
             {
                 return ipmi::response(ret);
@@ -1255,7 +1252,7 @@
     }
 
     SensorMap sensorMap;
-    if (!getSensorMap(connection, path, sensorMap))
+    if (!getSensorMap(ctx->yield, connection, path, sensorMap))
     {
         return ipmi::responseResponseError();
     }
