diff --git a/meson.build b/meson.build
index 345b84b..c2f2806 100644
--- a/meson.build
+++ b/meson.build
@@ -51,7 +51,8 @@
                        'INVENTORY_JSON_EVEREST': '"'+get_option('INVENTORY_JSON_EVEREST')+'"',
                        'DBUS_PROP_JSON': '"'+get_option('DBUS_PROP_JSON')+'"',
                        'SYSTEM_JSON' : '"'+get_option('SYSTEM_JSON')+'"',
-                       'BAD_VPD_DIR': '"'+get_option('BAD_VPD_DIR')+'"'
+                       'BAD_VPD_DIR': '"'+get_option('BAD_VPD_DIR')+'"',
+                       'FAN_INTERFACE': '"'+get_option('FAN_INTERFACE')+'"'
                        }
   )
 
diff --git a/meson_options.txt b/meson_options.txt
index c95b48a..bebdff4 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,3 +23,4 @@
 option('DBUS_PROP_JSON',type: 'string', value: '/usr/share/vpd/dbus_properties.json',  description: 'Json which contains properties specific to dbus.')
 option('SYSTEM_JSON',type: 'string', value: '/usr/share/vpd/systems.json',  description: 'JSON file used to pick the right system json')
 option('BAD_VPD_DIR',type: 'string', value: '/tmp/bad-vpd/', description: 'Directory which contains the bad vpd file - which needs to be included in bmc dump.')
+option('FAN_INTERFACE', type: 'string', value: 'xyz.openbmc_project.Inventory.Item.Fan', description: 'Fan type interface.')
diff --git a/vpd_tool_impl.cpp b/vpd_tool_impl.cpp
index 647bf50..c9b0bb7 100644
--- a/vpd_tool_impl.cpp
+++ b/vpd_tool_impl.cpp
@@ -122,54 +122,9 @@
     return result;
 }
 
-void VpdTool::addFruTypeAndLocation(json exIntf, const string& object,
-                                    json& kwVal)
-{
-    if (object.find("powersupply") != string::npos)
-    {
-        kwVal.emplace("type", POWER_SUPPLY_TYPE_INTERFACE);
-    }
-
-    // add else if statement for fan fru
-
-    else
-    {
-        for (const auto& intf : exIntf.items())
-        {
-            if ((intf.key().find("Item") != string::npos) &&
-                (intf.value().is_null()))
-            {
-                kwVal.emplace("type", intf.key());
-                break;
-            }
-        }
-    }
-
-    // Add location code.
-    constexpr auto LOCATION_CODE_IF = "com.ibm.ipzvpd.Location";
-    constexpr auto LOCATION_CODE_PROP = "LocationCode";
-
-    try
-    {
-        variant<string> response;
-        makeDBusCall(object, LOCATION_CODE_IF, LOCATION_CODE_PROP)
-            .read(response);
-
-        if (auto prop = get_if<string>(&response))
-        {
-            kwVal.emplace(LOCATION_CODE_PROP, *prop);
-        }
-    }
-    catch (const SdBusError& e)
-    {
-        kwVal.emplace(LOCATION_CODE_PROP, "");
-    }
-}
-
-json VpdTool::getVINIProperties(string invPath, json exIntf)
+json VpdTool::getVINIProperties(string invPath)
 {
     variant<Binary> response;
-    json output = json::object({});
     json kwVal = json::object({});
 
     vector<string> keyword{"CC", "SN", "PN", "FN", "DR"};
@@ -185,7 +140,6 @@
     {
         objectName = INVENTORY_PATH + invPath;
     }
-
     for (string kw : keyword)
     {
         try
@@ -200,19 +154,22 @@
         }
         catch (const SdBusError& e)
         {
-            output.emplace(invPath, json::object({}));
+            if (string(e.name()) ==
+                string("org.freedesktop.DBus.Error.UnknownObject"))
+            {
+                kwVal.emplace(invPath, json::object({}));
+                objFound = false;
+                break;
+            }
         }
     }
 
-    addFruTypeAndLocation(exIntf, objectName, kwVal);
-    kwVal.emplace("TYPE", fruType);
-
-    output.emplace(invPath, kwVal);
-    return output;
+    return kwVal;
 }
 
-void VpdTool::getExtraInterfaceProperties(string invPath, string extraInterface,
-                                          json prop, json exIntf, json& output)
+void VpdTool::getExtraInterfaceProperties(const string& invPath,
+                                          const string& extraInterface,
+                                          const json& prop, json& output)
 {
     variant<string> response;
 
@@ -232,10 +189,19 @@
         }
         catch (const SdBusError& e)
         {
-            output.emplace(invPath, json::object({}));
+            if (std::string(e.name()) ==
+                std::string("org.freedesktop.DBus.Error.UnknownObject"))
+            {
+                objFound = false;
+                break;
+            }
+            else if (std::string(e.name()) ==
+                     std::string("org.freedesktop.DBus.Error.UnknownProperty"))
+            {
+                output.emplace(kw, "");
+            }
         }
     }
-    addFruTypeAndLocation(exIntf, objectName, output);
 }
 
 json VpdTool::interfaceDecider(json& itemEEPROM)
@@ -251,35 +217,49 @@
     }
 
     json output = json::object({});
+    json subOutput = json::object({});
     fruType = "FRU";
 
-    // check type and add FRU Type in object
-    if (itemEEPROM.find("type") != itemEEPROM.end())
-    {
-        fruType = itemEEPROM.at("type");
-    }
+    json j;
+    objFound = true;
+    string invPath = itemEEPROM.at("inventoryPath");
 
-    if (itemEEPROM.value("inherit", true))
+    j = getVINIProperties(invPath);
+
+    if (objFound)
     {
-        json j = getVINIProperties(itemEEPROM.at("inventoryPath"),
-                                   itemEEPROM["extraInterfaces"]);
-        output.insert(j.begin(), j.end());
-    }
-    else
-    {
+        subOutput.insert(j.begin(), j.end());
         json js;
+        if (itemEEPROM.find("type") != itemEEPROM.end())
+        {
+            fruType = itemEEPROM.at("type");
+        }
+        js.emplace("TYPE", fruType);
+
+        if (invPath.find("powersupply") != string::npos)
+        {
+            js.emplace("type", POWER_SUPPLY_TYPE_INTERFACE);
+        }
+        else if (invPath.find("fan") != string::npos)
+        {
+            js.emplace("type", FAN_INTERFACE);
+        }
+
         for (const auto& ex : itemEEPROM["extraInterfaces"].items())
         {
             if (!(ex.value().is_null()))
             {
-                getExtraInterfaceProperties(itemEEPROM.at("inventoryPath"),
-                                            ex.key(), ex.value(),
-                                            itemEEPROM["extraInterfaces"], js);
+                getExtraInterfaceProperties(invPath, ex.key(), ex.value(), js);
             }
+            if ((ex.key().find("Item") != string::npos) &&
+                (ex.value().is_null()))
+            {
+                js.emplace("type", ex.key());
+            }
+            subOutput.insert(js.begin(), js.end());
         }
-        output.emplace(itemEEPROM.at("inventoryPath"), js);
     }
-
+    output.emplace(invPath, subOutput);
     return output;
 }
 
diff --git a/vpd_tool_impl.hpp b/vpd_tool_impl.hpp
index 4e320b2..0337617 100644
--- a/vpd_tool_impl.hpp
+++ b/vpd_tool_impl.hpp
@@ -16,6 +16,7 @@
     const std::string recordName;
     const std::string keyword;
     const std::string value;
+    bool objFound = true;
 
     // Store Type of FRU
     std::string fruType;
@@ -41,29 +42,16 @@
                       const std::string& interface, const std::string& kw);
 
     /**
-     * @brief Adds FRU type and Location Code
-     * Appends the type of the FRU and location code to the output
-     *
-     * @param[in] exIntf - extraInterfaces json from INVENTORY_JSON
-     * @param[in] object - The D-Bus object to read the location code from
-     * @param[out] kwVal - JSON object into which the FRU type and location code
-     * are placed
-     */
-    void addFruTypeAndLocation(json exIntf, const std::string& object,
-                               json& kwVal);
-
-    /**
      * @brief Get VINI properties
      * Making a dbus call for properties [SN, PN, CC, FN, DR]
      * under VINI interface.
      *
      * @param[in] invPath - Value of inventory Path
-     * @param[in] exIntf - extraInterfaces json from INVENTORY_JSON
      *
      * @return json output which gives the properties under invPath's VINI
      * interface
      */
-    json getVINIProperties(std::string invPath, json exIntf);
+    json getVINIProperties(std::string invPath);
 
     /**
      * @brief Get ExtraInterface Properties
@@ -73,13 +61,12 @@
      * @param[in] extraInterface - One of the invPath's extraInterfaces whose
      * value is not null
      * @param[in] prop - All properties of the extraInterface.
-     *
-     * @return json output which gives the properties under invPath's
-     *         extraInterface.
+     * @param[out] output - output json which has the properties under invPath's
+     * extra interface.
      */
-    void getExtraInterfaceProperties(std::string invPath,
-                                     std::string extraInterface, json prop,
-                                     json exIntf, json& output);
+    void getExtraInterfaceProperties(const string& invPath,
+                                     const string& extraInterface,
+                                     const json& prop, json& output);
 
     /**
      * @brief Interface Decider
