diff --git a/src/manager.cpp b/src/manager.cpp
index 5dbd4dc..cfb7a4e 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -311,6 +311,80 @@
     return pendingAttrs;
 }
 
+void Manager::convertBiosDataToVersion1(Manager::oldBaseTable biosTbl,
+                                        Manager::BaseTable& baseTable)
+{
+    lg2::error("convertBiosDataToVersion1");
+    for (const auto& [key, baseTuple] : biosTbl)
+    {
+        const auto& vec = std::get<7>(baseTuple);
+        std::vector<std::tuple<BoundType, std::variant<int64_t, std::string>,
+                               std::string>>
+            dataVec;
+
+        for (const auto& [value, variantVal] : vec)
+        {
+            dataVec.emplace_back(value, variantVal,
+                                 ""); // Copy VDN as empty string
+        }
+
+        if (std::get<0>(baseTuple) == AttributeType::Integer)
+        {
+            baseTable[key] = std::make_tuple(
+                std::get<0>(baseTuple), std::get<1>(baseTuple),
+                std::get<2>(baseTuple), std::get<3>(baseTuple),
+                std::get<4>(baseTuple),
+                std::get<int64_t>(std::get<5>(baseTuple)),
+                std::get<int64_t>(std::get<6>(baseTuple)), dataVec);
+        }
+        else
+        {
+            baseTable[key] = std::make_tuple(
+                std::get<0>(baseTuple), std::get<1>(baseTuple),
+                std::get<2>(baseTuple), std::get<3>(baseTuple),
+                std::get<4>(baseTuple),
+                std::get<std::string>(std::get<5>(baseTuple)),
+                std::get<std::string>(std::get<6>(baseTuple)), dataVec);
+        }
+    }
+}
+
+void Manager::convertBiosDataToVersion0(Manager::oldBaseTable& baseTable,
+                                        Manager::BaseTable& biosTbl)
+{
+    lg2::error("convertBiosDataToVersion0");
+    for (const auto& [key, baseTuple] : biosTbl)
+    {
+        const auto& vec = std::get<7>(baseTuple);
+        std::vector<std::tuple<BoundType, std::variant<int64_t, std::string>>>
+            dataVec;
+
+        for (const auto& [value, variantVal, vDisplayName] : vec)
+        {
+            dataVec.emplace_back(value, variantVal); // Remove VDN
+        }
+
+        if (std::get<0>(baseTuple) == AttributeType::Integer)
+        {
+            baseTable[key] = std::make_tuple(
+                std::get<0>(baseTuple), std::get<1>(baseTuple),
+                std::get<2>(baseTuple), std::get<3>(baseTuple),
+                std::get<4>(baseTuple),
+                std::get<int64_t>(std::get<5>(baseTuple)),
+                std::get<int64_t>(std::get<6>(baseTuple)), dataVec);
+        }
+        else
+        {
+            baseTable[key] = std::make_tuple(
+                std::get<0>(baseTuple), std::get<1>(baseTuple),
+                std::get<2>(baseTuple), std::get<3>(baseTuple),
+                std::get<4>(baseTuple),
+                std::get<std::string>(std::get<5>(baseTuple)),
+                std::get<std::string>(std::get<6>(baseTuple)), dataVec);
+        }
+    }
+}
+
 Manager::Manager(sdbusplus::asio::object_server& objectServer,
                  std::shared_ptr<sdbusplus::asio::connection>& systemBus,
                  std::string persistPath) :
