diff --git a/vpd-manager/editor_impl.cpp b/vpd-manager/editor_impl.cpp
index 8ae4558..30f0a41 100644
--- a/vpd-manager/editor_impl.cpp
+++ b/vpd-manager/editor_impl.cpp
@@ -497,20 +497,11 @@
     common::utility::callPIM(move(objects));
 }
 
-void EditorImpl::updateKeyword(const Binary& kwdData, const bool& updCache)
+void EditorImpl::updateKeyword(const Binary& kwdData, uint32_t offset,
+                               const bool& updCache)
 {
-    startOffset = 0;
+    startOffset = offset;
 #ifndef ManagerTest
-
-    // check if offset present?
-    for (const auto& item : jsonFile["frus"][vpdFilePath])
-    {
-        if (item.find("offset") != item.end())
-        {
-            startOffset = item["offset"];
-        }
-    }
-
     // TODO: Figure out a better way to get max possible VPD size.
     Binary completeVPDFile;
     completeVPDFile.resize(65504);
diff --git a/vpd-manager/editor_impl.hpp b/vpd-manager/editor_impl.hpp
index c03354a..7c3eb9e 100644
--- a/vpd-manager/editor_impl.hpp
+++ b/vpd-manager/editor_impl.hpp
@@ -93,9 +93,11 @@
      * 3) update the data for that keyword with the new data
      *
      * @param[in] kwdData - data to update
+     * @param[in] offset - offset at which the VPD starts
      * @param[in] updCache - Flag which tells whether to update Cache or not.
      */
-    void updateKeyword(const Binary& kwdData, const bool& updCache);
+    void updateKeyword(const Binary& kwdData, uint32_t offset,
+                       const bool& updCache);
 
     /** @brief Expands location code on DBUS
      *  @param[in] locationCodeType - "fcs" or "mts"
diff --git a/vpd-manager/manager.cpp b/vpd-manager/manager.cpp
index 036f843..d391a0b 100644
--- a/vpd-manager/manager.cpp
+++ b/vpd-manager/manager.cpp
@@ -121,15 +121,23 @@
         for (const auto& itemEEPROM : groupEEPROM)
         {
             bool isMotherboard = false;
+            std::string redundantPath;
+
             if (itemEEPROM["extraInterfaces"].find(
                     "xyz.openbmc_project.Inventory.Item.Board.Motherboard") !=
                 itemEEPROM["extraInterfaces"].end())
             {
                 isMotherboard = true;
             }
-            frus.emplace(itemEEPROM["inventoryPath"]
-                             .get_ref<const nlohmann::json::string_t&>(),
-                         std::make_pair(itemFRUS.key(), isMotherboard));
+            if (itemEEPROM.find("redundantEeprom") != itemEEPROM.end())
+            {
+                redundantPath = itemEEPROM["redundantEeprom"]
+                                    .get_ref<const nlohmann::json::string_t&>();
+            }
+            frus.emplace(
+                itemEEPROM["inventoryPath"]
+                    .get_ref<const nlohmann::json::string_t&>(),
+                std::make_tuple(itemFRUS.key(), redundantPath, isMotherboard));
 
             if (itemEEPROM["extraInterfaces"].find(IBM_LOCATION_CODE_INF) !=
                 itemEEPROM["extraInterfaces"].end())
@@ -168,14 +176,35 @@
             throw std::runtime_error("Inventory path not found");
         }
 
-        inventory::Path vpdFilePath = frus.find(objPath)->second.first;
+        inventory::Path vpdFilePath = std::get<0>(frus.find(objPath)->second);
 
         // instantiate editor class to update the data
         EditorImpl edit(vpdFilePath, jsonFile, recordName, keyword, objPath);
-        edit.updateKeyword(value, true);
+
+        uint32_t offset = 0;
+        // Setup offset, if any
+        for (const auto& item : jsonFile["frus"][vpdFilePath])
+        {
+            if (item.find("offset") != item.end())
+            {
+                offset = item["offset"];
+                break;
+            }
+        }
+
+        edit.updateKeyword(value, offset, true);
+
+        // If we have a redundant EEPROM to update, then update just the EEPROM,
+        // not the cache since that is already done when we updated the primary
+        if (!std::get<1>(frus.find(objPath)->second).empty())
+        {
+            EditorImpl edit(std::get<1>(frus.find(objPath)->second), jsonFile,
+                            recordName, keyword);
+            edit.updateKeyword(value, offset, false);
+        }
 
         // if it is a motehrboard FRU need to check for location expansion
-        if (frus.find(objPath)->second.second)
+        if (std::get<2>(frus.find(objPath)->second))
         {
             if (recordName == "VCEN" && (keyword == "FC" || keyword == "SE"))
             {
