diff --git a/platform-mc/sensor_manager.cpp b/platform-mc/sensor_manager.cpp
index 2f9eaa5..46e0786 100644
--- a/platform-mc/sensor_manager.cpp
+++ b/platform-mc/sensor_manager.cpp
@@ -33,21 +33,11 @@
                   tid);
         return;
     }
-    // numeric sensor
-    auto terminus = termini[tid];
-    for (auto& sensor : terminus->numericSensors)
-    {
-        roundRobinSensors[tid].push(sensor);
-    }
+
+    roundRobinSensorItMap[tid] = 0;
 
     updateAvailableState(tid, true);
 
-    if (!roundRobinSensors[tid].size())
-    {
-        lg2::info("Terminus ID {TID}: no sensors to poll.", "TID", tid);
-        return;
-    }
-
     sensorPollTimers[tid] = std::make_unique<sdbusplus::Timer>(
         event.get(),
         std::bind_front(&SensorManager::doSensorPolling, this, tid));
@@ -85,6 +75,11 @@
 
     // numeric sensor
     auto terminus = termini[tid];
+    if (!terminus)
+    {
+        return;
+    }
+
     for (auto& sensor : terminus->numericSensors)
     {
         sensor->updateReading(true, false,
@@ -101,7 +96,7 @@
         sensorPollTimers.erase(tid);
     }
 
-    roundRobinSensors.erase(tid);
+    roundRobinSensorItMap.erase(tid);
 
     if (doSensorPollingTaskHandles.contains(tid))
     {
@@ -203,6 +198,13 @@
         }
 
         auto& terminus = termini[tid];
+        if (!terminus)
+        {
+            lg2::info(
+                "Terminus ID {TID} does not have a valid Terminus object {NOW}.",
+                "TID", tid, "NOW", pldm::utils::getCurrentSystemTime());
+            co_return PLDM_ERROR;
+        }
 
         if (manager && terminus->pollEvent)
         {
@@ -216,7 +218,19 @@
         }
 
         sd_event_now(event.get(), CLOCK_MONOTONIC, &t1);
-        auto toBeUpdated = roundRobinSensors[tid].size();
+
+        auto& numericSensors = terminus->numericSensors;
+        auto toBeUpdated = numericSensors.size();
+
+        if (!roundRobinSensorItMap.contains(tid))
+        {
+            lg2::info(
+                "Terminus ID {TID} does not have a round robin sensor iteration {NOW}.",
+                "TID", tid, "NOW", pldm::utils::getCurrentSystemTime());
+            co_return PLDM_ERROR;
+        }
+        auto& sensorIt = roundRobinSensorItMap[tid];
+
         while (((t1 - t0) < pollingTimeInUsec) && (toBeUpdated > 0))
         {
             if (!getAvailableState(tid))
@@ -227,7 +241,12 @@
                 co_await stdexec::just_stopped();
             }
 
-            auto sensor = roundRobinSensors[tid].front();
+            if (sensorIt >= numericSensors.size())
+            {
+                sensorIt = 0;
+            }
+
+            auto sensor = numericSensors[sensorIt];
 
             sd_event_now(event.get(), CLOCK_MONOTONIC, &t1);
             elapsed = t1 - sensor->timeStamp;
@@ -255,11 +274,8 @@
             }
 
             toBeUpdated--;
-            if (roundRobinSensors.contains(tid))
-            {
-                roundRobinSensors[tid].pop();
-                roundRobinSensors[tid].push(std::move(sensor));
-            }
+            sensorIt++;
+
             sd_event_now(event.get(), CLOCK_MONOTONIC, &t1);
         }
 
