diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index 57109b6..94b7f55 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -240,31 +240,34 @@
         }
         if constexpr (is_same<T, KeywordVpdMap>::value)
         {
-            if (get_if<Binary>(&kwVal.second))
+            if (auto keywordValue = get_if<Binary>(&kwVal.second))
             {
-                Binary vec(get_if<Binary>(&kwVal.second)->begin(),
-                           get_if<Binary>(&kwVal.second)->end());
+                Binary vec((*keywordValue).begin(), (*keywordValue).end());
                 prop.emplace(move(kw), move(vec));
             }
-            else
+            else if (auto keywordValue = get_if<std::string>(&kwVal.second))
+            {
+                Binary vec((*keywordValue).begin(), (*keywordValue).end());
+                prop.emplace(move(kw), move(vec));
+            }
+            else if (auto keywordValue = get_if<size_t>(&kwVal.second))
             {
                 if (kw == "MemorySizeInKB")
                 {
                     inventory::PropertyMap memProp;
-                    auto memVal = get_if<size_t>(&kwVal.second);
-                    if (memVal)
-                    {
-                        memProp.emplace(move(kw),
-                                        ((*memVal) * CONVERT_MB_TO_KB));
-                        interfaces.emplace(
-                            "xyz.openbmc_project.Inventory.Item.Dimm",
-                            move(memProp));
-                    }
-                    else
-                    {
-                        cerr << "MemorySizeInKB value not found in vpd map\n";
-                    }
+                    memProp.emplace(move(kw), ((*keywordValue)));
+                    interfaces.emplace(
+                        "xyz.openbmc_project.Inventory.Item.Dimm",
+                        move(memProp));
                 }
+                else
+                {
+                    cerr << "Unknown Keyword[" << kw << "] found ";
+                }
+            }
+            else
+            {
+                cerr << "Unknown Variant found ";
             }
         }
         else
@@ -362,10 +365,7 @@
                 {
                     if (!kw.empty() && vpdMap.count(kw))
                     {
-                        auto kwValue = get_if<Binary>(&vpdMap.at(kw));
-                        auto uintValue = get_if<size_t>(&vpdMap.at(kw));
-
-                        if (kwValue)
+                        if (auto kwValue = get_if<Binary>(&vpdMap.at(kw)))
                         {
                             auto prop =
                                 string((*kwValue).begin(), (*kwValue).end());
@@ -374,10 +374,26 @@
 
                             props.emplace(busProp, encoded);
                         }
-                        else if (uintValue)
+                        else if (auto kwValue =
+                                     get_if<std::string>(&vpdMap.at(kw)))
+                        {
+                            auto prop =
+                                string((*kwValue).begin(), (*kwValue).end());
+
+                            auto encoded = encodeKeyword(prop, encoding);
+
+                            props.emplace(busProp, encoded);
+                        }
+                        else if (auto uintValue =
+                                     get_if<size_t>(&vpdMap.at(kw)))
                         {
                             props.emplace(busProp, *uintValue);
                         }
+                        else
+                        {
+                            std::cerr << " Unknown Keyword [" << kw
+                                      << "] Encountered";
+                        }
                     }
                 }
             }
@@ -492,17 +508,17 @@
             {
                 // Now bind the device
                 string bind = json["frus"][file].at(0).value("devAddress", "");
-                cout << "Binding device " << bind << endl;
+                cout << "Binding device " << bind << std::endl;
                 string bindCmd = string("echo \"") + bind +
                                  string("\" > /sys/bus/i2c/drivers/at24/bind");
-                cout << bindCmd << endl;
+                cout << bindCmd << std::endl;
                 executeCmd(bindCmd);
 
                 // Check if device showed up (test for file)
                 if (!fs::exists(file))
                 {
                     cerr << "EEPROM " << file
-                         << " does not exist. Take failure action" << endl;
+                         << " does not exist. Take failure action" << std::endl;
                     // If not, then take failure postAction
                     executePostFailAction(json, file);
                 }
@@ -513,7 +529,8 @@
                 cerr << "VPD inventory JSON missing basic informations of "
                         "preAction "
                         "for this FRU : ["
-                     << file << "]. Executing executePostFailAction." << endl;
+                     << file << "]. Executing executePostFailAction."
+                     << std::endl;
 
                 // Take failure postAction
                 executePostFailAction(json, file);
@@ -1422,7 +1439,8 @@
         if (!fs::exists(file))
         {
             cout << "Device path: " << file
-                 << " does not exist. Spurious udev event? Exiting." << endl;
+                 << " does not exist. Spurious udev event? Exiting."
+                 << std::endl;
             return 0;
         }
 
@@ -1446,7 +1464,7 @@
             if ("xyz.openbmc_project.State.Chassis.PowerState.On" ==
                 getPowerState())
             {
-                cout << "This VPD cannot be read when power is ON" << endl;
+                cout << "This VPD cannot be read when power is ON" << std::endl;
                 return 0;
             }
         }
@@ -1454,7 +1472,7 @@
         // Check if this VPD should be recollected at all
         if (!needsRecollection(js, file))
         {
-            cout << "Skip VPD recollection for: " << file << endl;
+            cout << "Skip VPD recollection for: " << file << std::endl;
             return 0;
         }
 
