diff --git a/const.hpp b/const.hpp
index 6153410..591043e 100644
--- a/const.hpp
+++ b/const.hpp
@@ -21,6 +21,7 @@
 using LE2ByteData = uint16_t;
 using DataOffset = uint16_t;
 
+static constexpr auto NEXT_64_KB = 65536;
 static constexpr auto MAC_ADDRESS_LEN_BYTES = 6;
 static constexpr auto LAST_KW = "PF";
 static constexpr auto POUND_KW = '#';
diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index ac96295..b265919 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -85,10 +85,10 @@
             }
         }
     }
-    catch (std::exception& e)
+    catch (exception& e)
     {
-        std::cerr << "Failed to expand location code with exception: "
-                  << e.what() << "\n";
+        cerr << "Failed to expand location code with exception: " << e.what()
+             << "\n";
     }
     return expanded;
 }
@@ -111,17 +111,17 @@
 
     for (const auto& kwVal : map)
     {
-        std::vector<uint8_t> vec(kwVal.second.begin(), kwVal.second.end());
+        vector<uint8_t> vec(kwVal.second.begin(), kwVal.second.end());
 
         auto kw = kwVal.first;
 
         if (kw[0] == '#')
         {
-            kw = std::string("PD_") + kw[1];
+            kw = string("PD_") + kw[1];
         }
         else if (isdigit(kw[0]))
         {
-            kw = std::string("N_") + kw;
+            kw = string("N_") + kw;
         }
         prop.emplace(move(kw), move(vec));
     }
@@ -158,7 +158,7 @@
             }
             else if (itr.value().is_string())
             {
-                if constexpr (std::is_same<T, Parsed>::value)
+                if constexpr (is_same<T, Parsed>::value)
                 {
                     if (busProp == "LocationCode" &&
                         inf == "com.ibm.ipzvpd.Location")
@@ -183,7 +183,7 @@
                 const string& kw = itr.value().value("keywordName", "");
                 const string& encoding = itr.value().value("encoding", "");
 
-                if constexpr (std::is_same<T, Parsed>::value)
+                if constexpr (is_same<T, Parsed>::value)
                 {
                     if (!rec.empty() && !kw.empty() && vpdMap.count(rec) &&
                         vpdMap.at(rec).count(kw))
@@ -193,7 +193,7 @@
                         props.emplace(busProp, encoded);
                     }
                 }
-                else if constexpr (std::is_same<T, KeywordVpdMap>::value)
+                else if constexpr (is_same<T, KeywordVpdMap>::value)
                 {
                     if (!kw.empty() && vpdMap.count(kw))
                     {
@@ -209,6 +209,31 @@
     }
 }
 
+Binary getVpdDataInVector(nlohmann::json& js, const string& file)
+{
+    uint32_t offset = 0;
+    // check if offset present?
+    for (const auto& item : js["frus"][file])
+    {
+        if (item.find("offset") != item.end())
+        {
+            offset = item["offset"];
+        }
+    }
+
+    // TODO: Figure out a better way to get max possible VPD size.
+    Binary vpdVector;
+    vpdVector.resize(65504);
+    ifstream vpdFile;
+    vpdFile.open(file, ios::binary);
+
+    vpdFile.seekg(offset, ios_base::cur);
+    vpdFile.read(reinterpret_cast<char*>(&vpdVector[0]), 65504);
+    vpdVector.resize(vpdFile.gcount());
+
+    return vpdVector;
+}
+
 /**
  * @brief Prime the Inventory
  * Prime the inventory by populating only the location code,
@@ -301,7 +326,7 @@
         // extraInterfaces.
         if (item.value("inherit", true))
         {
-            if constexpr (std::is_same<T, Parsed>::value)
+            if constexpr (is_same<T, Parsed>::value)
             {
                 // Each record in the VPD becomes an interface and all
                 // keyword within the record are properties under that
@@ -312,7 +337,7 @@
                         record.second, preIntrStr + record.first, interfaces);
                 }
             }
-            else if constexpr (std::is_same<T, KeywordVpdMap>::value)
+            else if constexpr (is_same<T, KeywordVpdMap>::value)
             {
                 populateFruSpecificInterfaces(vpdMap, preIntrStr, interfaces);
             }
@@ -325,7 +350,7 @@
         else
         {
             // Check if we have been asked to inherit specific record(s)
-            if constexpr (std::is_same<T, Parsed>::value)
+            if constexpr (is_same<T, Parsed>::value)
             {
                 if (item.find("copyRecords") != item.end())
                 {
@@ -343,13 +368,16 @@
             }
         }
 
-        // Populate interfaces and properties that are common to every FRU
-        // and additional interface that might be defined on a per-FRU
-        // basis.
-        if (item.find("extraInterfaces") != item.end())
+        if (item.value("inheritEI", true))
         {
-            populateInterfaces(item["extraInterfaces"], interfaces, vpdMap,
-                               isSystemVpd);
+            // Populate interfaces and properties that are common to every FRU
+            // and additional interface that might be defined on a per-FRU
+            // basis.
+            if (item.find("extraInterfaces") != item.end())
+            {
+                populateInterfaces(item["extraInterfaces"], interfaces, vpdMap,
+                                   isSystemVpd);
+            }
         }
         objects.emplace(move(object), move(interfaces));
     }
@@ -432,30 +460,11 @@
         if ((js.find("frus") == js.end()) ||
             (js["frus"].find(file) == js["frus"].end()))
         {
-            cout << "Device path not in JSON, ignoring" << std::endl;
+            cout << "Device path not in JSON, ignoring" << endl;
             return 0;
         }
 
-        uint32_t offset = 0;
-        // check if offset present?
-        for (const auto& item : js["frus"][file])
-        {
-            if (item.find("offset") != item.end())
-            {
-                offset = item["offset"];
-            }
-        }
-
-        // TODO: Figure out a better way to get max possible VPD size.
-        Binary vpdVector;
-        vpdVector.resize(65504);
-        ifstream vpdFile;
-        vpdFile.open(file, ios::binary);
-
-        vpdFile.seekg(offset, ios_base::cur);
-        vpdFile.read(reinterpret_cast<char*>(&vpdVector[0]), 65504);
-        vpdVector.resize(vpdFile.gcount());
-
+        Binary vpdVector(getVpdDataInVector(js, file));
         vpdType type = vpdTypeCheck(vpdVector);
 
         switch (type)
@@ -495,7 +504,7 @@
             break;
 
             default:
-                throw std::runtime_error("Invalid VPD format");
+                throw runtime_error("Invalid VPD format");
         }
     }
     catch (exception& e)
