diff --git a/vpd-tool/include/tool_types.hpp b/vpd-tool/include/tool_types.hpp
index 1e9ff7d..86e942c 100644
--- a/vpd-tool/include/tool_types.hpp
+++ b/vpd-tool/include/tool_types.hpp
@@ -67,6 +67,9 @@
 // A table column name-size pair
 using TableColumnNameSizePair = std::pair<std::string, std::size_t>;
 
+/* Map<Property, Value>*/
+using PropertyMap = std::map<std::string, DbusVariantType>;
+
 enum UserOption
 {
     Exit,
diff --git a/vpd-tool/include/tool_utils.hpp b/vpd-tool/include/tool_utils.hpp
index 4d650c1..fece0ec 100644
--- a/vpd-tool/include/tool_utils.hpp
+++ b/vpd-tool/include/tool_utils.hpp
@@ -73,6 +73,55 @@
 }
 
 /**
+ * @brief An API to get property map for an interface.
+ *
+ * This API returns a map of property and its value with respect to a particular
+ * interface.
+ *
+ * Note: It will be caller's responsibility to check for empty map returned and
+ * generate appropriate error.
+ *
+ * @param[in] i_service - Service name.
+ * @param[in] i_objectPath - object path.
+ * @param[in] i_interface - Interface, for the properties to be listed.
+ *
+ * @return - A map of property and value of an interface, if success.
+ *           if failed, empty map.
+ */
+inline types::PropertyMap getPropertyMap(
+    const std::string& i_service, const std::string& i_objectPath,
+    const std::string& i_interface) noexcept
+{
+    types::PropertyMap l_propertyValueMap;
+    if (i_service.empty() || i_objectPath.empty() || i_interface.empty())
+    {
+        // TODO: Enable logging when verbose is enabled.
+        // std::cout << "Invalid parameters to get property map" << std::endl;
+        return l_propertyValueMap;
+    }
+
+    try
+    {
+        auto l_bus = sdbusplus::bus::new_default();
+        auto l_method =
+            l_bus.new_method_call(i_service.c_str(), i_objectPath.c_str(),
+                                  "org.freedesktop.DBus.Properties", "GetAll");
+        l_method.append(i_interface);
+        auto l_result = l_bus.call(l_method);
+        l_result.read(l_propertyValueMap);
+    }
+    catch (const sdbusplus::exception::SdBusError& l_ex)
+    {
+        // TODO: Enable logging when verbose is enabled.
+        // std::cerr << "Failed to get property map for service: [" << i_service
+        //           << "], object path: [" << i_objectPath
+        //           << "] Error : " << l_ex.what() << std::endl;
+    }
+
+    return l_propertyValueMap;
+}
+
+/**
  * @brief An API to print json data on stdout.
  *
  * @param[in] i_jsonData - JSON object.
diff --git a/vpd-tool/src/vpd_tool.cpp b/vpd-tool/src/vpd_tool.cpp
index f6e4cd9..7d229d7 100644
--- a/vpd-tool/src/vpd_tool.cpp
+++ b/vpd-tool/src/vpd_tool.cpp
@@ -150,15 +150,6 @@
                            l_locationCodeInJson.cend());
     }
 
-    const auto l_subModelInJson = getInventoryPropertyJson<std::string>(
-        i_objectPath, constants::assetInf, "SubModel");
-
-    if (!l_subModelInJson.empty() &&
-        !l_subModelInJson.value("SubModel", "").empty())
-    {
-        l_fruObject.insert(l_subModelInJson.cbegin(), l_subModelInJson.cend());
-    }
-
     // Get the properties under VINI interface.
 
     nlohmann::json l_viniPropertiesInJson = nlohmann::json::object({});
@@ -183,6 +174,24 @@
         l_fruObject.insert(l_viniPropertiesInJson.cbegin(),
                            l_viniPropertiesInJson.cend());
     }
+    // if a FRU doesn't have VINI properties, we need to get the properties from
+    // Decorator.Asset interface
+    else
+    {
+        // Get properties under Decorator.Asset interface
+        const auto l_decoratorAssetPropertiesMap =
+            utils::getPropertyMap(constants::inventoryManagerService,
+                                  i_objectPath, constants::assetInf);
+
+        for (const auto& l_aProperty : l_decoratorAssetPropertiesMap)
+        {
+            if (const auto l_propertyValueStr =
+                    std::get_if<std::string>(&l_aProperty.second))
+            {
+                l_fruObject.emplace(l_aProperty.first, *l_propertyValueStr);
+            }
+        }
+    }
 
     const auto l_typePropertyJson = getFruTypeProperty(i_objectPath);
     if (!l_typePropertyJson.empty())
@@ -191,6 +200,9 @@
                            l_typePropertyJson.cend());
     }
 
+    // insert FRU "TYPE"
+    l_fruObject.emplace("TYPE", "FRU");
+
     return l_fruJson;
 }
 
