diff --git a/vpd-manager/error.cpp b/vpd-manager/error.cpp
new file mode 100644
index 0000000..b809b3f
--- /dev/null
+++ b/vpd-manager/error.cpp
@@ -0,0 +1,78 @@
+#include <com/ibm/VPD/error.hpp>
+
+namespace sdbusplus
+{
+namespace com
+{
+namespace ibm
+{
+namespace VPD
+{
+namespace Error
+{
+const char* LocationNotFound::name() const noexcept
+{
+    return errName;
+}
+const char* LocationNotFound::description() const noexcept
+{
+    return errDesc;
+}
+const char* LocationNotFound::what() const noexcept
+{
+    return errWhat;
+}
+const char* NodeNotFound::name() const noexcept
+{
+    return errName;
+}
+const char* NodeNotFound::description() const noexcept
+{
+    return errDesc;
+}
+const char* NodeNotFound::what() const noexcept
+{
+    return errWhat;
+}
+const char* PathNotFound::name() const noexcept
+{
+    return errName;
+}
+const char* PathNotFound::description() const noexcept
+{
+    return errDesc;
+}
+const char* PathNotFound::what() const noexcept
+{
+    return errWhat;
+}
+const char* RecordNotFound::name() const noexcept
+{
+    return errName;
+}
+const char* RecordNotFound::description() const noexcept
+{
+    return errDesc;
+}
+const char* RecordNotFound::what() const noexcept
+{
+    return errWhat;
+}
+const char* KeywordNotFound::name() const noexcept
+{
+    return errName;
+}
+const char* KeywordNotFound::description() const noexcept
+{
+    return errDesc;
+}
+const char* KeywordNotFound::what() const noexcept
+{
+    return errWhat;
+}
+
+} // namespace Error
+} // namespace VPD
+} // namespace ibm
+} // namespace com
+} // namespace sdbusplus
diff --git a/vpd-manager/manager.cpp b/vpd-manager/manager.cpp
new file mode 100644
index 0000000..f34ab68
--- /dev/null
+++ b/vpd-manager/manager.cpp
@@ -0,0 +1,69 @@
+#include "config.h"
+
+#include "manager.hpp"
+
+#include "parser.hpp"
+
+#include <exception>
+#include <iostream>
+#include <vector>
+
+namespace openpower
+{
+namespace vpd
+{
+namespace manager
+{
+Manager::Manager(sdbusplus::bus::bus&& bus, const char* busName,
+                 const char* objPath, const char* iFace) :
+    ServerObject<ManagerIface>(bus, objPath),
+    _bus(std::move(bus)), _manager(_bus, objPath)
+{
+    _bus.request_name(busName);
+}
+
+void Manager::run()
+{
+    while (true)
+    {
+        try
+        {
+            _bus.process_discard();
+            // wait for event
+            _bus.wait();
+        }
+        catch (const std::exception& e)
+        {
+            std::cerr << e.what() << "\n";
+        }
+    }
+}
+
+void Manager::writeKeyword(const sdbusplus::message::object_path path,
+                           const std::string recordName,
+                           const std::string keyword, const Binary value)
+{
+    // implement the interface to write keyword VPD data
+}
+
+std::vector<sdbusplus::message::object_path>
+    Manager::getFRUsByUnexpandedLocationCode(const std::string locationCode,
+                                             const uint16_t nodeNumber)
+{
+    // implement the interface
+}
+
+std::vector<sdbusplus::message::object_path>
+    Manager::getFRUsByExpandedLocationCode(const std::string locationCode)
+{
+    // implement the interface
+}
+
+std::string Manager::getExpandedLocationCode(const std::string locationCode,
+                                             const uint16_t nodeNumber)
+{
+    // implement the interface
+}
+} // namespace manager
+} // namespace vpd
+} // namespace openpower
diff --git a/vpd-manager/manager.hpp b/vpd-manager/manager.hpp
new file mode 100644
index 0000000..e542103
--- /dev/null
+++ b/vpd-manager/manager.hpp
@@ -0,0 +1,129 @@
+#pragma once
+
+#include "types.hpp"
+
+#include <com/ibm/VPD/Manager/server.hpp>
+#include <sdbusplus/server.hpp>
+
+namespace sdbusplus
+{
+namespace bus
+{
+class bus;
+}
+} // namespace sdbusplus
+
+namespace openpower
+{
+namespace vpd
+{
+namespace manager
+{
+
+template <typename T>
+using ServerObject = T;
+
+using ManagerIface = sdbusplus::com::ibm::VPD::server::Manager;
+
+/** @class Manager
+ *  @brief OpenBMC VPD Manager implementation.
+ *
+ *  A concrete implementation for the
+ *  com.ibm.vpd.Manager
+ */
+class Manager : public ServerObject<ManagerIface>
+{
+  public:
+    /* Define all of the basic class operations:
+     * Not allowed:
+     * - Default constructor to avoid nullptrs.
+     * - Copy operations due to internal unique_ptr.
+     * - Move operations due to 'this' being registered as the
+     *  'context' with sdbus.
+     * Allowed:
+     * - Destructor.
+     */
+    Manager() = delete;
+    Manager(const Manager&) = delete;
+    Manager& operator=(const Manager&) = delete;
+    Manager(Manager&&) = delete;
+    ~Manager() = default;
+
+    /** @brief Constructor to put object onto bus at a dbus path.
+     *  @param[in] bus - Bus connection.
+     *  @param[in] busName - Name to be requested on Bus
+     *  @param[in] objPath - Path to attach at.
+     *  @param[in] iFace - interface to implement
+     */
+    Manager(sdbusplus::bus::bus&& bus, const char* busName, const char* objPath,
+            const char* iFace);
+
+    /** @brief Implementation for WriteKeyword
+     *  Api to update the keyword value for a given inventory.
+     *
+     *  @param[in] path - Path to the D-Bus object that represents the FRU.
+     *  @param[in] recordName - name of the record for which the keyword value
+     *  has to be modified
+     *  @param[in] keyword - keyword whose value needs to be updated
+     *  @param[in] value - value that needs to be updated
+     */
+    void writeKeyword(const sdbusplus::message::object_path path,
+                      const std::string recordName, const std::string keyword,
+                      const Binary value);
+
+    /** @brief Implementation for GetFRUsByUnexpandedLocationCode
+     *  A method to get list of FRU D-BUS object paths for a given unexpanded
+     *  location code. Returns empty vector if no FRU found for that location
+     *  code.
+     *
+     *  @param[in] locationCode - An un-expanded Location code.
+     *  @param[in] nodeNumber - Denotes the node in case of a multi-node
+     *  configuration, ignored on a single node system.
+     *
+     *  @return inventoryList[std::vector<sdbusplus::message::object_path>] -
+     *  List of all the FRUs D-Bus object paths for the given location code.
+     */
+    std::vector<sdbusplus::message::object_path>
+        getFRUsByUnexpandedLocationCode(const std::string locationCode,
+                                        const uint16_t nodeNumber);
+
+    /** @brief Implementation for GetFRUsByExpandedLocationCode
+     *  A method to get list of FRU D-BUS object paths for a given expanded
+     *  location code. Returns empty vector if no FRU found for that location
+     *  code.
+     *
+     *  @param[in] locationCode - Location code in expanded format.
+     *
+     *  @return inventoryList[std::vector<sdbusplus::message::object_path>] -
+     *  List of all the FRUs D-Bus object path for the given location code.
+     */
+    std::vector<sdbusplus::message::object_path>
+        getFRUsByExpandedLocationCode(const std::string locationCode);
+
+    /** @brief Implementation for GetExpandedLocationCode
+     *  An api to get expanded location code corresponding to a given
+     *  un-expanded location code.
+     *
+     *  @param[in] locationCode - Location code in un-expaned format.
+     *  @param[in] nodeNumber - Denotes the node in case of multi-node
+     *  configuration. Ignored in case of single node configuration.
+     *
+     *  @return locationCode[std::string] - Location code in expanded format.
+     */
+    std::string getExpandedLocationCode(const std::string locationCode,
+                                        const uint16_t nodeNumber);
+
+    /** @brief Start processing DBus messages. */
+    void run();
+
+  private:
+    /** @brief Persistent sdbusplus DBus bus connection. */
+    sdbusplus::bus::bus _bus;
+
+    /** @brief sdbusplus org.freedesktop.DBus.ObjectManager reference. */
+    sdbusplus::server::manager::manager _manager;
+};
+
+} // namespace manager
+} // namespace vpd
+} // namespace openpower
diff --git a/vpd-manager/manager_main.cpp b/vpd-manager/manager_main.cpp
new file mode 100644
index 0000000..459c9f4
--- /dev/null
+++ b/vpd-manager/manager_main.cpp
@@ -0,0 +1,24 @@
+#include "config.h"
+
+#include "manager.hpp"
+
+#include <cstdlib>
+#include <exception>
+#include <iostream>
+#include <sdbusplus/bus.hpp>
+
+int main(int argc, char* argv[])
+{
+    try
+    {
+        openpower::vpd::manager::Manager vpdManager(
+            sdbusplus::bus::new_system(), BUSNAME, OBJPATH, IFACE);
+        vpdManager.run();
+        exit(EXIT_SUCCESS);
+    }
+    catch (const std::exception& e)
+    {
+        std::cerr << e.what() << "\n";
+    }
+    exit(EXIT_FAILURE);
+}
diff --git a/vpd-manager/meson.build b/vpd-manager/meson.build
new file mode 100644
index 0000000..a879b2b
--- /dev/null
+++ b/vpd-manager/meson.build
@@ -0,0 +1,38 @@
+project('vpd-manager',
+        'cpp',
+        default_options : ['cpp_std=c++17'],
+        version : '1.0')
+sdbusplus = dependency('sdbusplus')
+phosphor_logging = dependency('phosphor-logging')
+systemd = dependency('libsystemd', version : '>= 221')
+phosphor_dbus_interfaces = dependency('phosphor-dbus-interfaces')
+
+compiler = meson.get_compiler('cpp')
+
+configure_file( output: 'config.h',
+                        configuration: {
+                        'BUSNAME' : '"' + get_option('BUSNAME') + '"',
+                        'OBJPATH' : '"' + get_option('OBJPATH') + '"',
+                        'IFACE' : '"' + get_option('IFACE') + '"',
+                        }
+                )
+
+configuration_inc = include_directories('.', '../')
+
+vpd_manager_SOURCES =[
+                        'manager_main.cpp',
+                        'manager.cpp',
+                        'server.cpp',
+                        'error.cpp'
+                        ]
+
+vpd_manager_exe = executable('vpd-manager',
+                                 vpd_manager_SOURCES,
+                                 include_directories : configuration_inc,
+                                 dependencies :[
+                                                 sdbusplus,
+                                                 phosphor_logging,
+                                                 systemd,
+                                                 phosphor_dbus_interfaces,
+                                             ],
+                              )
diff --git a/vpd-manager/meson_options.txt b/vpd-manager/meson_options.txt
new file mode 100644
index 0000000..1cc5f50
--- /dev/null
+++ b/vpd-manager/meson_options.txt
@@ -0,0 +1,5 @@
+option('BUSNAME', type : 'string', value : 'com.ibm.VPD.Manager', description : 'BUS NAME FOR THE SERVICE')
+option('OBJPATH', type : 'string', value : '/com/ibm/VPD/Manager', description : 'OBJECT PATH FOR THE SERVICE')
+option('IFACE', type : 'string', value : 'com.ibm.VPD.Manager', description : 'INTERFACE NAME')
+option('oe-sdk', type : 'feature', description : 'ENABLE OE SDK FOR VPD KEYWORD EDITOR')
+option('INVENTORY_JSON', type : 'string', value : '/usr/share/vpd/vpd_inventory.json', description : 'PATH TO INVENTORY JSON FILE')
diff --git a/vpd-manager/server.cpp b/vpd-manager/server.cpp
new file mode 100644
index 0000000..8291ecd
--- /dev/null
+++ b/vpd-manager/server.cpp
@@ -0,0 +1,306 @@
+#include <algorithm>
+#include <com/ibm/VPD/Manager/server.hpp>
+#include <com/ibm/VPD/error.hpp>
+#include <map>
+#include <sdbusplus/exception.hpp>
+#include <sdbusplus/sdbus.hpp>
+#include <sdbusplus/server.hpp>
+#include <string>
+#include <tuple>
+#include <variant>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace sdbusplus
+{
+namespace com
+{
+namespace ibm
+{
+namespace VPD
+{
+namespace server
+{
+
+Manager::Manager(bus::bus& bus, const char* path) :
+    _com_ibm_VPD_Manager_interface(bus, path, interface, _vtable, this),
+    _intf(bus.getInterface())
+{
+}
+
+int Manager::_callback_WriteKeyword(sd_bus_message* msg, void* context,
+                                    sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(msg);
+#if 1
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id(
+                std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        sdbusplus::message::object_path path{};
+        std::string record{};
+        std::string keyword{};
+        std::vector<uint8_t> value{};
+
+        m.read(path, record, keyword, value);
+
+        auto o = static_cast<Manager*>(context);
+        o->writeKeyword(path, record, keyword, value);
+
+        auto reply = m.new_method_return();
+        // No data to append on reply.
+
+        reply.method_return();
+    }
+    catch (sdbusplus::internal_exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::PathNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::RecordNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::KeywordNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Manager
+{
+static const auto _param_WriteKeyword = utility::tuple_to_array(
+    message::types::type_id<sdbusplus::message::object_path, std::string,
+                            std::string, std::vector<uint8_t>>());
+static const auto _return_WriteKeyword =
+    utility::tuple_to_array(std::make_tuple('\0'));
+} // namespace Manager
+} // namespace details
+
+int Manager::_callback_GetFRUsByUnexpandedLocationCode(sd_bus_message* msg,
+                                                       void* context,
+                                                       sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(msg);
+#if 1
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id(
+                std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        std::string locationCode{};
+        uint16_t nodeNumber{};
+
+        m.read(locationCode, nodeNumber);
+
+        auto o = static_cast<Manager*>(context);
+        auto r = o->getFRUsByUnexpandedLocationCode(locationCode, nodeNumber);
+
+        auto reply = m.new_method_return();
+        reply.append(std::move(r));
+
+        reply.method_return();
+    }
+    catch (sdbusplus::internal_exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::LocationNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::NodeNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Manager
+{
+static const auto _param_GetFRUsByUnexpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<std::string, uint16_t>());
+static const auto _return_GetFRUsByUnexpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<
+                            std::vector<sdbusplus::message::object_path>>());
+} // namespace Manager
+} // namespace details
+
+int Manager::_callback_GetFRUsByExpandedLocationCode(sd_bus_message* msg,
+                                                     void* context,
+                                                     sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(msg);
+#if 1
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id(
+                std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        std::string locationCode{};
+
+        m.read(locationCode);
+
+        auto o = static_cast<Manager*>(context);
+        auto r = o->getFRUsByExpandedLocationCode(locationCode);
+
+        auto reply = m.new_method_return();
+        reply.append(std::move(r));
+
+        reply.method_return();
+    }
+    catch (sdbusplus::internal_exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::LocationNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::NodeNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Manager
+{
+static const auto _param_GetFRUsByExpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<std::string>());
+static const auto _return_GetFRUsByExpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<
+                            std::vector<sdbusplus::message::object_path>>());
+} // namespace Manager
+} // namespace details
+
+int Manager::_callback_GetExpandedLocationCode(sd_bus_message* msg,
+                                               void* context,
+                                               sd_bus_error* error)
+{
+    try
+    {
+        auto m = message::message(msg);
+#if 1
+        {
+            auto tbus = m.get_bus();
+            sdbusplus::server::transaction::Transaction t(tbus, m);
+            sdbusplus::server::transaction::set_id(
+                std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+        }
+#endif
+
+        std::string locationCode{};
+        uint16_t nodeNumber{};
+
+        m.read(locationCode, nodeNumber);
+
+        auto o = static_cast<Manager*>(context);
+        auto r = o->getExpandedLocationCode(locationCode, nodeNumber);
+
+        auto reply = m.new_method_return();
+        reply.append(std::move(r));
+
+        reply.method_return();
+    }
+    catch (sdbusplus::internal_exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::LocationNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+    catch (sdbusplus::com::ibm::VPD::Error::NodeNotFound& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return true;
+}
+
+namespace details
+{
+namespace Manager
+{
+static const auto _param_GetExpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<std::string, uint16_t>());
+static const auto _return_GetExpandedLocationCode =
+    utility::tuple_to_array(message::types::type_id<std::string>());
+} // namespace Manager
+} // namespace details
+
+const vtable::vtable_t Manager::_vtable[] = {
+    vtable::start(),
+
+    vtable::method("WriteKeyword", details::Manager::_param_WriteKeyword.data(),
+                   details::Manager::_return_WriteKeyword.data(),
+                   _callback_WriteKeyword),
+
+    vtable::method(
+        "GetFRUsByUnexpandedLocationCode",
+        details::Manager::_param_GetFRUsByUnexpandedLocationCode.data(),
+        details::Manager::_return_GetFRUsByUnexpandedLocationCode.data(),
+        _callback_GetFRUsByUnexpandedLocationCode),
+
+    vtable::method(
+        "GetFRUsByExpandedLocationCode",
+        details::Manager::_param_GetFRUsByExpandedLocationCode.data(),
+        details::Manager::_return_GetFRUsByExpandedLocationCode.data(),
+        _callback_GetFRUsByExpandedLocationCode),
+
+    vtable::method("GetExpandedLocationCode",
+                   details::Manager::_param_GetExpandedLocationCode.data(),
+                   details::Manager::_return_GetExpandedLocationCode.data(),
+                   _callback_GetExpandedLocationCode),
+    vtable::end()};
+
+} // namespace server
+} // namespace VPD
+} // namespace ibm
+} // namespace com
+} // namespace sdbusplus
