diff --git a/include/appcommands.hpp b/include/appcommands.hpp
index 469ad4a..865f0d3 100644
--- a/include/appcommands.hpp
+++ b/include/appcommands.hpp
@@ -45,6 +45,7 @@
 #define SIZE_PCIE_PORT_CONFIG 2
 
 #define JSON_APP_DATA_FILE "/var/lib/fb-ipmi-oem/appData.json"
+#define SYSFW_VER_FILE "/var/bios/host{}_bios_version.txt"
 #define KEY_SYSFW_VER "sysfw_ver_server"
 #define KEY_BIOS_BOOT_LEN "bios_boot_list_len"
 
diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index 7ffcd2d..8f470fe 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -28,6 +28,7 @@
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/message/types.hpp>
 
+#include <format>
 #include <fstream>
 #include <iomanip>
 #include <iostream>
@@ -265,7 +266,7 @@
     return;
 }
 
-static int platSetSysFWVer(uint8_t* ver, const std::string key)
+static int platSetSysFWVer(uint8_t* ver, const size_t hostId)
 {
     std::stringstream ss;
     int i;
@@ -283,41 +284,68 @@
         ss << (char)ver[i];
     }
 
-    appData[key] = ss.str();
+    /* Save to legacy sysfw version file for backward compatibility */
+    appData[KEY_SYSFW_VER + std::to_string(hostId)] = ss.str();
     flush_app_data();
 
+    auto sysfwVersionFile = std::format(SYSFW_VER_FILE, hostId);
+    std::ofstream file(sysfwVersionFile);
+
+    if (!file)
+    {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Failed to open system firmware version file for writing",
+            phosphor::logging::entry("FILE=%s", sysfwVersionFile.c_str()));
+        return -1;
+    }
+
+    file << ss.str();
+    file.close();
+
     return 0;
 }
 
-static int platGetSysFWVer(std::vector<uint8_t>& respData,
-                           const std::string key)
+static int platGetSysFWVer(std::vector<uint8_t>& respData, const size_t hostId)
 {
-    int len = -1;
+    constexpr size_t headerSize = 3; // selector + encoding + version size
 
-    if (!appData.contains(std::string(key)))
+    std::string sysfwVersionFile = std::format(SYSFW_VER_FILE, hostId);
+    std::ifstream file(sysfwVersionFile);
+
+    if (!file)
     {
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Failed to open system firmware version file for reading",
+            phosphor::logging::entry("FILE=%s", sysfwVersionFile.c_str()));
         return -1;
     }
-    std::string str = appData[key].get<std::string>();
 
-    respData.push_back(0); // byte 1: Set selector not supported
-    respData.push_back(0); // byte 2: Only ASCII supported
+    std::string version;
+    std::getline(file, version);
+    file.close();
 
-    len = str.length();
-    respData.push_back(len); // byte 3: Size of version
+    // Truncate if longer than allowed
+    if (version.size() > SIZE_SYSFW_VER - headerSize)
+    {
+        version.resize(SIZE_SYSFW_VER - headerSize);
+    }
 
-    for (auto c : str)
+    respData.push_back(0);              // Byte 1: set selector not supported
+    respData.push_back(0);              // Byte 2: only ASCII supported
+    respData.push_back(version.size()); // Byte 3: length of version
+
+    for (auto c : version)
     {
         respData.push_back(c);
     }
 
     // Remaining byte fill to 0
-    for (int i = 0; i < SIZE_SYSFW_VER - (len + 3); i++)
+    for (size_t i = 0; i < SIZE_SYSFW_VER - (version.size() + headerSize); i++)
     {
         respData.push_back(0);
     }
 
-    return (len + 3);
+    return (version.size() + headerSize);
 }
 
 //----------------------------------------------------------------------
@@ -345,8 +373,7 @@
         case SYS_INFO_PARAM_SYSFW_VER:
         {
             memcpy(sysInfoParams.sysfw_ver, &req[1], SIZE_SYSFW_VER);
-            std::string version_key = KEY_SYSFW_VER + std::to_string(*hostId);
-            if (platSetSysFWVer(sysInfoParams.sysfw_ver, version_key))
+            if (platSetSysFWVer(sysInfoParams.sysfw_ver, *hostId))
                 return ipmi::responseSystemInfoParamterNotSupportCommand();
             break;
         }
@@ -424,8 +451,7 @@
             break;
         case SYS_INFO_PARAM_SYSFW_VER:
         {
-            std::string version_key = KEY_SYSFW_VER + std::to_string(*hostId);
-            if ((platGetSysFWVer(respData, version_key)) < 0)
+            if ((platGetSysFWVer(respData, *hostId)) < 0)
                 return ipmi::responseSystemInfoParamterNotSupportCommand();
             break;
         }
diff --git a/src/usb-dbg.cpp b/src/usb-dbg.cpp
index 4e2847d..d125016 100644
--- a/src/usb-dbg.cpp
+++ b/src/usb-dbg.cpp
@@ -528,23 +528,20 @@
 
 static int getBiosVer(std::string& ver, size_t hostPosition)
 {
-    nlohmann::json appObj;
-
-    std::ifstream file(JSON_APP_DATA_FILE);
-    if (file)
+    std::string sysfwVersionFile = std::format(SYSFW_VER_FILE, hostPosition);
+    std::ifstream file(sysfwVersionFile);
+    if (!file)
     {
-        file >> appObj;
-        file.close();
-        std::string version_key = KEY_SYSFW_VER + std::to_string(hostPosition);
-
-        if (appObj.find(version_key) != appObj.end())
-        {
-            ver = appObj[version_key].get<std::string>();
-            return 0;
-        }
+        phosphor::logging::log<phosphor::logging::level::ERR>(
+            "Failed to open system firmware version file",
+            phosphor::logging::entry("FILE=%s", sysfwVersionFile.c_str()));
+        return -1;
     }
 
-    return -1;
+    std::getline(file, ver);
+    file.close();
+
+    return 0;
 }
 
 int sendBicCmd(uint8_t netFn, uint8_t cmd, uint8_t bicAddr,
