diff --git a/impl.cpp b/impl.cpp
index 35a0e0f..25da01f 100644
--- a/impl.cpp
+++ b/impl.cpp
@@ -1,6 +1,7 @@
 #include "impl.hpp"
 
 #include "defines.hpp"
+#include "utils.hpp"
 
 #include <algorithm>
 #include <exception>
@@ -67,12 +68,6 @@
 using ECCOffset = uint16_t;
 using ECCLength = uint16_t;
 
-constexpr auto toHex(size_t c)
-{
-    constexpr auto map = "0123456789abcdef";
-    return map[c];
-}
-
 } // namespace
 
 namespace offsets
@@ -221,6 +216,7 @@
                              std::size_t dataLength,
                              Binary::const_iterator iterator)
 {
+    using namespace openpower::vpd;
     switch (std::get<keyword::Encoding>(keyword))
     {
         case keyword::Encoding::ASCII:
diff --git a/ipz_app.cpp b/ipz_app.cpp
index 610ac8d..cd5be8f 100644
--- a/ipz_app.cpp
+++ b/ipz_app.cpp
@@ -14,6 +14,33 @@
 using namespace std;
 using namespace openpower::vpd;
 
+/** @brief Encodes a keyword for D-Bus.
+ */
+static string encodeKeyword(const string& rec, const string& kw,
+                            const string& encoding, const Parsed& vpdMap)
+{
+    if (encoding == "MAC")
+    {
+        string res{};
+        const auto& val = vpdMap.at(rec).at(kw);
+        size_t first = val[0];
+        res += toHex(first >> 4);
+        res += toHex(first & 0x0f);
+        for (size_t i = 1; i < val.size(); ++i)
+        {
+            res += ":";
+            res += toHex(val[i] >> 4);
+            res += toHex(val[i] & 0x0f);
+        }
+        return res;
+    }
+    else // default to string encoding
+    {
+        return string(vpdMap.at(rec).at(kw).begin(),
+                      vpdMap.at(rec).at(kw).end());
+    }
+}
+
 static void populateInterfaces(const nlohmann::json& js,
                                inventory::InterfaceMap& interfaces,
                                const Parsed& vpdMap)
@@ -27,12 +54,13 @@
         {
             const string& rec = itr.value().value("recordName", "");
             const string& kw = itr.value().value("keywordName", "");
+            const string& encoding = itr.value().value("encoding", "");
 
             if (!rec.empty() && !kw.empty() && vpdMap.count(rec) &&
                 vpdMap.at(rec).count(kw))
             {
-                props.emplace(itr.key(), string(vpdMap.at(rec).at(kw).begin(),
-                                                vpdMap.at(rec).at(kw).end()));
+                auto encoded = encodeKeyword(rec, kw, encoding, vpdMap);
+                props.emplace(itr.key(), encoded);
             }
         }
         interfaces.emplace(inf, move(props));
@@ -40,47 +68,57 @@
 }
 
 static void populateDbus(Store& vpdStore, nlohmann::json& js,
-                         const string& objectPath, const string& filePath)
+                         const string& filePath)
 {
     inventory::InterfaceMap interfaces;
     inventory::ObjectMap objects;
-    sdbusplus::message::object_path object(objectPath);
     const auto& vpdMap = vpdStore.getVpdMap();
     string preIntrStr = "com.ibm.ipzvpd.";
 
-    // Each record in the VPD becomes an interface and all keywords within the
-    // record are properties under that interface.
-    for (const auto& record : vpdMap)
+    for (const auto& item : js["frus"][filePath])
     {
-        inventory::PropertyMap prop;
-        for (auto kwVal : record.second)
+        const auto& objectPath = item["inventoryPath"];
+        sdbusplus::message::object_path object(objectPath);
+
+        // Populate the VPD keywords and the common interfaces only if we
+        // are asked to inherit that data from the VPD, else only add the
+        // extraInterfaces.
+        if (item.value("inherit", true))
         {
-            std::vector<uint8_t> vec(kwVal.second.begin(), kwVal.second.end());
-            std::string kw = kwVal.first;
-            if (kw[0] == '#')
+            // Each record in the VPD becomes an interface and all keywords
+            // within the record are properties under that interface.
+            for (const auto& record : vpdMap)
             {
-                kw = std::string("PD_") + kw[1];
+                inventory::PropertyMap prop;
+                for (auto kwVal : record.second)
+                {
+                    std::vector<uint8_t> vec(kwVal.second.begin(),
+                                             kwVal.second.end());
+                    std::string kw = kwVal.first;
+                    if (kw[0] == '#')
+                    {
+                        kw = std::string("PD_") + kw[1];
+                    }
+                    prop.emplace(move(kw), move(vec));
+                }
+                interfaces.emplace(preIntrStr + record.first, move(prop));
             }
-            prop.emplace(move(kw), move(vec));
+
+            // Populate interfaces and properties that are common to every FRU
+            // and additional interface that might be defined on a per-FRU
+            // basis.
+            if (js.find("commonInterfaces") != js.end())
+            {
+                populateInterfaces(js["commonInterfaces"], interfaces, vpdMap);
+            }
         }
-        interfaces.emplace(preIntrStr + record.first, move(prop));
+        if (item.find("extraInterfaces") != item.end())
+        {
+            populateInterfaces(item["extraInterfaces"], interfaces, vpdMap);
+        }
+        objects.emplace(move(object), move(interfaces));
     }
 
-    // Populate interfaces and properties that are common to every FRU
-    // and additional interface that might be defined on a per-FRU basis.
-    if (js.find("commonInterfaces") != js.end())
-    {
-        populateInterfaces(js["commonInterfaces"], interfaces, vpdMap);
-    }
-    if (js["frus"][filePath].find("extraInterfaces") !=
-        js["frus"][filePath].end())
-    {
-        populateInterfaces(js["frus"][filePath]["extraInterfaces"], interfaces,
-                           vpdMap);
-    }
-
-    objects.emplace(move(object), move(interfaces));
-
     // Notify PIM
     inventory::callPIM(move(objects));
 }
@@ -114,14 +152,6 @@
             throw std::runtime_error("Device path missing in inventory JSON");
         }
 
-        const string& objectPath = js["frus"][file].value("inventoryPath", "");
-
-        if (objectPath.empty())
-        {
-            throw std::runtime_error("Could not find D-Bus object path in "
-                                     "inventory JSON");
-        }
-
         ifstream vpdFile(file, ios::binary);
         Binary vpd((istreambuf_iterator<char>(vpdFile)),
                    istreambuf_iterator<char>());
@@ -130,7 +160,7 @@
         auto vpdStore = parse(move(vpd));
 
         // Write it to the inventory
-        populateDbus(vpdStore, js, objectPath, file);
+        populateDbus(vpdStore, js, file);
     }
     catch (exception& e)
     {
diff --git a/utils.hpp b/utils.hpp
index 4b690ab..55bc900 100644
--- a/utils.hpp
+++ b/utils.hpp
@@ -6,6 +6,16 @@
 {
 namespace vpd
 {
+/** @brief Return the hex representation of the incoming byte
+ *
+ * @param [in] c - The input byte
+ * @returns The hex representation of the byte as a character.
+ */
+constexpr auto toHex(size_t c)
+{
+    constexpr auto map = "0123456789abcdef";
+    return map[c];
+}
 
 namespace inventory
 {
