diff --git a/platform-mc/terminus.cpp b/platform-mc/terminus.cpp
index ba299be..c262842 100644
--- a/platform-mc/terminus.cpp
+++ b/platform-mc/terminus.cpp
@@ -14,10 +14,11 @@
 namespace platform_mc
 {
 
-Terminus::Terminus(pldm_tid_t tid, uint64_t supportedTypes) :
+Terminus::Terminus(pldm_tid_t tid, uint64_t supportedTypes,
+                   sdeventplus::Event& event) :
     initialized(false), maxBufferSize(PLDM_PLATFORM_EVENT_MSG_MAX_BUFFER_SIZE),
     synchronyConfigurationSupported(0), pollEvent(false), tid(tid),
-    supportedTypes(supportedTypes)
+    supportedTypes(supportedTypes), event(event)
 {}
 
 bool Terminus::doesSupportType(uint8_t type)
@@ -119,11 +120,6 @@
 
 void Terminus::parseTerminusPDRs()
 {
-    std::vector<std::shared_ptr<pldm_numeric_sensor_value_pdr>>
-        numericSensorPdrs{};
-    std::vector<std::shared_ptr<pldm_compact_numeric_sensor_pdr>>
-        compactNumericSensorPdrs{};
-
     for (auto& pdr : pdrs)
     {
         auto pdrHdr = new (pdr.data()) pldm_pdr_hdr;
@@ -228,15 +224,48 @@
                    tid, "PATH", inventoryPath);
     }
 
-    for (auto pdr : numericSensorPdrs)
+    addNextSensorFromPDRs();
+}
+
+void Terminus::addNextSensorFromPDRs()
+{
+    sensorCreationEvent.reset();
+
+    if (terminusName.empty())
     {
-        addNumericSensor(pdr);
+        lg2::error(
+            "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
+            "TID", tid);
+        return;
     }
 
-    for (auto pdr : compactNumericSensorPdrs)
+    auto pdrIt = sensorPdrIt;
+
+    if (pdrIt < numericSensorPdrs.size())
     {
-        addCompactNumericSensor(pdr);
+        const auto& pdr = numericSensorPdrs[pdrIt];
+        // Defer adding the next Numeric Sensor
+        sensorCreationEvent = std::make_unique<sdeventplus::source::Defer>(
+            event,
+            std::bind(std::mem_fn(&Terminus::addNumericSensor), this, pdr));
     }
+    else if (pdrIt < numericSensorPdrs.size() + compactNumericSensorPdrs.size())
+    {
+        pdrIt -= numericSensorPdrs.size();
+        const auto& pdr = compactNumericSensorPdrs[pdrIt];
+        // Defer adding the next Compact Numeric Sensor
+        sensorCreationEvent = std::make_unique<sdeventplus::source::Defer>(
+            event, std::bind(std::mem_fn(&Terminus::addCompactNumericSensor),
+                             this, pdr));
+    }
+    else
+    {
+        sensorPdrIt = 0;
+        return;
+    }
+
+    // Move the iteration to the next sensor PDR
+    sensorPdrIt++;
 }
 
 std::shared_ptr<SensorAuxiliaryNames> Terminus::getSensorAuxiliaryNames(
@@ -391,20 +420,12 @@
 void Terminus::addNumericSensor(
     const std::shared_ptr<pldm_numeric_sensor_value_pdr> pdr)
 {
-    if (terminusName.empty())
-    {
-        lg2::error(
-            "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
-            "TID", tid);
-        return;
-    }
-
     if (!pdr)
     {
         lg2::error(
             "Terminus ID {TID}: Skip adding Numeric Sensor - invalid pointer to PDR.",
             "TID", tid);
-        return;
+        addNextSensorFromPDRs();
     }
 
     auto sensorId = pdr->sensor_id;
@@ -415,7 +436,7 @@
         lg2::error(
             "Terminus ID {TID}: Failed to get name for Numeric Sensor {SID}",
             "TID", tid, "SID", sensorId);
-        return;
+        addNextSensorFromPDRs();
     }
 
     std::string sensorName = sensorNames.front();
@@ -433,6 +454,8 @@
             "Failed to create NumericSensor. error - {ERROR} sensorname - {NAME}",
             "ERROR", e, "NAME", sensorName);
     }
+
+    addNextSensorFromPDRs();
 }
 
 std::shared_ptr<SensorAuxiliaryNames> Terminus::parseCompactNumericSensorNames(
@@ -503,20 +526,12 @@
 void Terminus::addCompactNumericSensor(
     const std::shared_ptr<pldm_compact_numeric_sensor_pdr> pdr)
 {
-    if (terminusName.empty())
-    {
-        lg2::error(
-            "Terminus ID {TID}: DOES NOT have name. Skip Adding sensors.",
-            "TID", tid);
-        return;
-    }
-
     if (!pdr)
     {
         lg2::error(
             "Terminus ID {TID}: Skip adding Compact Numeric Sensor - invalid pointer to PDR.",
             "TID", tid);
-        return;
+        addNextSensorFromPDRs();
     }
 
     auto sensorId = pdr->sensor_id;
@@ -527,7 +542,7 @@
         lg2::error(
             "Terminus ID {TID}: Failed to get name for Compact Numeric Sensor {SID}",
             "TID", tid, "SID", sensorId);
-        return;
+        addNextSensorFromPDRs();
     }
 
     std::string sensorName = sensorNames.front();
@@ -545,6 +560,8 @@
             "Failed to create Compact NumericSensor. error - {ERROR} sensorname - {NAME}",
             "ERROR", e, "NAME", sensorName);
     }
+
+    addNextSensorFromPDRs();
 }
 
 std::shared_ptr<NumericSensor> Terminus::getSensorObject(SensorId id)
