diff --git a/src/cpu.cpp b/src/cpu.cpp
index 7e52bd4..ed4eabb 100644
--- a/src/cpu.cpp
+++ b/src/cpu.cpp
@@ -119,8 +119,12 @@
 }
 
 static constexpr uint8_t maxOldVersionCount = 0xff;
-void Cpu::infoUpdate(void)
+void Cpu::infoUpdate(uint8_t* smbiosTableStorage,
+                     const std::string& motherboard)
 {
+    storage = smbiosTableStorage;
+    motherboardPath = motherboard;
+
     uint8_t* dataIn = storage;
 
     dataIn = getSMBIOSTypePtr(dataIn, processorsType);
diff --git a/src/dimm.cpp b/src/dimm.cpp
index d106d47..c84bc51 100644
--- a/src/dimm.cpp
+++ b/src/dimm.cpp
@@ -39,8 +39,12 @@
     sdbusplus::server::xyz::openbmc_project::inventory::item::Dimm::Ecc;
 
 static constexpr uint16_t maxOldDimmSize = 0x7fff;
-void Dimm::memoryInfoUpdate(void)
+void Dimm::memoryInfoUpdate(uint8_t* smbiosTableStorage,
+                            const std::string& motherboard)
 {
+    storage = smbiosTableStorage;
+    motherboardPath = motherboard;
+
     uint8_t* dataIn = storage;
 
     dataIn = getSMBIOSTypePtr(dataIn, memoryDeviceType);
diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index dd1d8e3..856d817 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -445,7 +445,6 @@
             phosphor::logging::entry("ERROR=%s", e.what()));
     }
 
-    cpus.clear();
     int num = getTotalCpuSlot();
     if (num == -1)
     {
@@ -454,18 +453,30 @@
         return;
     }
 
+    // In case the new size is smaller than old, trim the vector
+    if (num < cpus.size())
+    {
+        cpus.erase(cpus.begin() + num, cpus.end());
+    }
+
     for (int index = 0; index < num; index++)
     {
         std::string path = cpuPath + std::to_string(index);
-        cpus.emplace_back(std::make_unique<phosphor::smbios::Cpu>(
-            bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
-            motherboardPath));
+        if (index + 1 > cpus.size())
+        {
+            cpus.emplace_back(std::make_unique<phosphor::smbios::Cpu>(
+                bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
+                motherboardPath));
+        }
+        else
+        {
+            cpus[index]->infoUpdate(smbiosDir.dir[smbiosDirIndex].dataStorage,
+                                    motherboardPath);
+        }
     }
 
 #ifdef DIMM_DBUS
 
-    dimms.clear();
-
     num = getTotalDimmSlot();
     if (num == -1)
     {
@@ -474,17 +485,30 @@
         return;
     }
 
+    // In case the new size is smaller than old, trim the vector
+    if (num < dimms.size())
+    {
+        dimms.erase(dimms.begin() + num, dimms.end());
+    }
+
     for (int index = 0; index < num; index++)
     {
         std::string path = dimmPath + std::to_string(index);
-        dimms.emplace_back(std::make_unique<phosphor::smbios::Dimm>(
-            bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
-            motherboardPath));
+        if (index + 1 > dimms.size())
+        {
+            dimms.emplace_back(std::make_unique<phosphor::smbios::Dimm>(
+                bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
+                motherboardPath));
+        }
+        else
+        {
+            dimms[index]->memoryInfoUpdate(
+                smbiosDir.dir[smbiosDirIndex].dataStorage, motherboardPath);
+        }
     }
 
 #endif
 
-    pcies.clear();
     num = getTotalPcieSlot();
     if (num == -1)
     {
@@ -493,12 +517,26 @@
         return;
     }
 
+    // In case the new size is smaller than old, trim the vector
+    if (num < pcies.size())
+    {
+        pcies.erase(pcies.begin() + num, pcies.end());
+    }
+
     for (int index = 0; index < num; index++)
     {
         std::string path = pciePath + std::to_string(index);
-        pcies.emplace_back(std::make_unique<phosphor::smbios::Pcie>(
-            bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
-            motherboardPath));
+        if (index + 1 > pcies.size())
+        {
+            pcies.emplace_back(std::make_unique<phosphor::smbios::Pcie>(
+                bus, path, index, smbiosDir.dir[smbiosDirIndex].dataStorage,
+                motherboardPath));
+        }
+        else
+        {
+            pcies[index]->pcieInfoUpdate(
+                smbiosDir.dir[smbiosDirIndex].dataStorage, motherboardPath);
+        }
     }
 
     system.reset();
diff --git a/src/pcieslot.cpp b/src/pcieslot.cpp
index 0ea7a8b..4b109d0 100644
--- a/src/pcieslot.cpp
+++ b/src/pcieslot.cpp
@@ -8,8 +8,12 @@
 namespace smbios
 {
 
-void Pcie::pcieInfoUpdate()
+void Pcie::pcieInfoUpdate(uint8_t* smbiosTableStorage,
+                          const std::string& motherboard)
 {
+    storage = smbiosTableStorage;
+    motherboardPath = motherboard;
+
     uint8_t* dataIn = getSMBIOSTypePtr(storage, systemSlots);
 
     if (dataIn == nullptr)
