diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index 24363d0..ac96295 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -2,6 +2,7 @@
 
 #include "defines.hpp"
 #include "keyword_vpd_parser.hpp"
+#include "memory_vpd_parser.hpp"
 #include "parser.hpp"
 #include "utils.hpp"
 
@@ -24,6 +25,7 @@
 namespace fs = filesystem;
 using json = nlohmann::json;
 using namespace openpower::vpd::inventory;
+using namespace openpower::vpd::memory::parser;
 
 /**
  * @brief Expands location codes
@@ -475,10 +477,23 @@
                 KeywordVpdParser parserObj(move(vpdVector));
                 // Invoking KW Vpd Parser
                 const auto& kwValMap = parserObj.parseKwVpd();
-                string preIntrStr = "com.ibm.kwvpd.KWVPD";
+                string preIntrStr = "com.ibm.ipzvpd.VINI";
                 populateDbus(kwValMap, js, file, preIntrStr);
             }
             break;
+
+            case MEMORY_VPD:
+            {
+                // Get an object to call API & get the key-value map
+                memoryVpdParser vpdParser(move(vpdVector));
+                const auto& memKwValMap = vpdParser.parseMemVpd();
+
+                string preIntrStr = "com.ibm.kwvpd.KWVPD";
+                // js(define dimm sys path in js), ObjPath(define in JS)
+                populateDbus(memKwValMap, js, file, preIntrStr);
+            }
+            break;
+
             default:
                 throw std::runtime_error("Invalid VPD format");
         }
diff --git a/memory_vpd_parser.cpp b/memory_vpd_parser.cpp
new file mode 100644
index 0000000..0fae663
--- /dev/null
+++ b/memory_vpd_parser.cpp
@@ -0,0 +1,60 @@
+#include "memory_vpd_parser.hpp"
+
+#include <iostream>
+#include <numeric>
+#include <string>
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+using namespace inventory;
+using namespace parser;
+using namespace constants;
+using namespace std;
+
+KeywordVpdMap memoryVpdParser::readKeywords(Binary::const_iterator iterator)
+{
+    KeywordVpdMap map{};
+
+    vector<uint8_t> partNumber(iterator, iterator + PART_NUM_LEN);
+
+    advance(iterator, PART_NUM_LEN);
+    vector<uint8_t> serialNumber(iterator, iterator + SERIAL_NUM_LEN);
+
+    advance(iterator, SERIAL_NUM_LEN);
+    vector<uint8_t> ccin(iterator, iterator + CCIN_LEN);
+
+    map.emplace("PN", move(partNumber));
+    map.emplace("SN", move(serialNumber));
+    map.emplace("CC", move(ccin));
+
+    return map;
+}
+
+KeywordVpdMap memoryVpdParser::parseMemVpd()
+{
+    // check if vpd file is empty
+    if (memVpd.empty())
+    {
+        throw runtime_error("VPD file is empty.");
+    }
+
+    // Read the data and return the map
+    auto iterator = memVpd.cbegin();
+    // point the iterator to DIMM data and skip "11S"
+    advance(iterator, MEMORY_VPD_DATA_START + 3);
+
+    auto vpdDataMap = readKeywords(iterator);
+
+    return vpdDataMap;
+}
+
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/memory_vpd_parser.hpp b/memory_vpd_parser.hpp
new file mode 100644
index 0000000..18f4519
--- /dev/null
+++ b/memory_vpd_parser.hpp
@@ -0,0 +1,55 @@
+#pragma once
+
+#include "impl.hpp"
+#include "types.hpp"
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+
+class memoryVpdParser
+{
+  public:
+    /**
+     * @brief Move Constructor
+     *
+     * Move kwVpdVector to parser object's kwVpdVector
+     */
+    memoryVpdParser(Binary&& memVpdVector) : memVpd(std::move(memVpdVector))
+    {
+    }
+
+    /**
+     * @brief Destructor
+     *
+     * Delete the parser object
+     */
+    ~memoryVpdParser(){};
+
+    /**
+     * @brief Parse the memory VPD binary data.
+     *
+     * Collects and emplace the keyword-value pairs in map.
+     *
+     * @return map of keyword:value
+     */
+    inventory::KeywordVpdMap parseMemVpd();
+
+  private:
+    /**
+     */
+    inventory::KeywordVpdMap readKeywords(Binary::const_iterator iterator);
+
+    /**
+     */
+    Binary memVpd;
+};
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/meson.build b/meson.build
index 7d76402..affd99f 100644
--- a/meson.build
+++ b/meson.build
@@ -46,7 +46,8 @@
                                 'utils.cpp',
                                 'keyword_vpd_parser.cpp',
                                 'vpdecc/vpdecc.c',
-                                'vpdecc/vpdecc_support.c'
+                                'vpdecc/vpdecc_support.c',
+                                'memory_vpd_parser.cpp'
                                ]
 
         ibm_vpd_exe = executable(
