diff --git a/libpldmresponder/bios.cpp b/libpldmresponder/bios.cpp
index c88a25c..6669688 100644
--- a/libpldmresponder/bios.cpp
+++ b/libpldmresponder/bios.cpp
@@ -19,7 +19,6 @@
 
 using namespace pldm::responder::bios;
 using namespace bios_parser;
-using namespace bios_parser::bios_enum;
 
 namespace pldm
 {
@@ -28,6 +27,7 @@
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
 using EpochTimeUS = uint64_t;
 using BIOSTableRow = std::vector<uint8_t>;
+using BIOSJsonName = std::string;
 
 constexpr auto dbusProperties = "org.freedesktop.DBus.Properties";
 constexpr auto padChksumMax = 7;
@@ -316,6 +316,8 @@
 namespace bios_type_enum
 {
 
+using namespace bios_parser::bios_enum;
+
 /** @brief Find the indices  into the array of the possible values of string
  *  handles for the current values.This is used in attribute value table
  *
@@ -392,15 +394,14 @@
  *         Enumeration ReadOnly
  *  @param[in] BIOSStringTable - the string table
  *  @param[in] biosJsonDir - path where the BIOS json files are present
+ *  @param[in,out] attributeTable - the attribute table
  *
- *  @return - Table - the attribute eenumeration table
  */
-Table constructAttrTable(const BIOSTable& BIOSStringTable,
-                         const char* biosJsonDir)
+void constructAttrTable(const BIOSTable& BIOSStringTable,
+                        const char* biosJsonDir, Table& attributeTable)
 {
     setupValueLookup(biosJsonDir);
     const auto& attributeMap = getValues();
-    Table attributeTable;
     StringHandle strHandle;
 
     for (const auto& [key, value] : attributeMap)
@@ -471,8 +472,6 @@
         std::move(enumAttrTable.begin(), enumAttrTable.end(),
                   std::back_inserter(attributeTable));
     }
-
-    return attributeTable;
 }
 
 /** @brief Construct the attibute value table for BIOS type Enumeration and
@@ -590,6 +589,29 @@
 
 } // end namespace bios_type_enum
 
+namespace bios_type_string
+{
+/** @brief Construct the attibute table for BIOS type String and
+ *         String ReadOnly
+ *  @param[in] BIOSStringTable - the string table
+ *  @param[in] biosJsonDir - path where the BIOS json files are present
+ *  @param[in,out] attributeTable - the attribute table
+ *
+ */
+void constructAttrTable(const BIOSTable& /*BIOSStringTable*/,
+                        const char* /*biosJsonDir*/, Table& /*attributeTable*/)
+{
+    // TODO
+}
+} // end namespace bios_type_string
+
+using typeHandler =
+    std::function<void(const BIOSTable& BIOSStringTable,
+                       const char* biosJsonDir, Table& attributeTable)>;
+std::map<BIOSJsonName, typeHandler> attrTypeHandlers{
+    {bios_parser::bIOSEnumJson, bios_type_enum::constructAttrTable},
+    {bios_parser::bIOSStrJson, bios_type_string::constructAttrTable}};
+
 /** @brief Construct the BIOS attribute table
  *
  *  @param[in] BIOSAttributeTable - the attribute table
@@ -611,12 +633,29 @@
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     uint32_t nxtTransferHandle = 0;
     uint8_t transferFlag = PLDM_START_AND_END;
-    size_t respPayloadLength{};
 
     if (BIOSAttributeTable.isEmpty())
     { // no persisted table, constructing fresh table and response
-        auto attributeTable =
-            bios_type_enum::constructAttrTable(BIOSStringTable, biosJsonDir);
+        Table attributeTable;
+        fs::path dir(biosJsonDir);
+
+        for (auto it = attrTypeHandlers.begin(); it != attrTypeHandlers.end();
+             it++)
+        {
+            fs::path file = dir / it->first;
+            if (fs::exists(file))
+            {
+                it->second(BIOSStringTable, biosJsonDir, attributeTable);
+            }
+        }
+
+        if (attributeTable.empty())
+        { // no available json file is found
+            encode_get_bios_table_resp(instanceID, PLDM_BIOS_TABLE_UNAVAILABLE,
+                                       nxtTransferHandle, transferFlag, nullptr,
+                                       response.size(), responsePtr);
+            return response;
+        }
 
         // calculate pad
         uint8_t padSize = utils::getNumPadBytes(attributeTable.size());
@@ -643,16 +682,14 @@
                         PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
                         attributeTable.size());
         responsePtr = reinterpret_cast<pldm_msg*>(response.data());
-        respPayloadLength = response.size();
         encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
                                    transferFlag, attributeTable.data(),
-                                   respPayloadLength, responsePtr);
+                                   response.size(), responsePtr);
     }
     else
     { // persisted table present, constructing response
-        respPayloadLength = response.size();
         encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
-                                   transferFlag, nullptr, respPayloadLength,
+                                   transferFlag, nullptr, response.size(),
                                    responsePtr); // filling up the header here
         BIOSAttributeTable.load(response);
     }
diff --git a/libpldmresponder/bios_parser.cpp b/libpldmresponder/bios_parser.cpp
index fa704e6..3933ad4 100644
--- a/libpldmresponder/bios_parser.cpp
+++ b/libpldmresponder/bios_parser.cpp
@@ -14,7 +14,6 @@
 using Json = nlohmann::json;
 namespace fs = std::filesystem;
 using namespace phosphor::logging;
-constexpr auto bIOSEnumJson = "enum_attrs.json";
 
 namespace bios_enum
 {
diff --git a/libpldmresponder/bios_parser.hpp b/libpldmresponder/bios_parser.hpp
index 0e21991..1f13f94 100644
--- a/libpldmresponder/bios_parser.hpp
+++ b/libpldmresponder/bios_parser.hpp
@@ -32,6 +32,8 @@
 {
 
 using Strings = std::vector<std::string>;
+inline constexpr auto bIOSEnumJson = "enum_attrs.json";
+inline constexpr auto bIOSStrJson = "string_attrs.json";
 
 /** @brief Parse every BIOS configuration JSON files in the directory path
  *         and populate all the attribute names and all the preconfigured
