diff --git a/vpd-manager/editor_impl.cpp b/vpd-manager/editor_impl.cpp
index 091eac4..c9e9847 100644
--- a/vpd-manager/editor_impl.cpp
+++ b/vpd-manager/editor_impl.cpp
@@ -3,10 +3,6 @@
 #include "parser.hpp"
 #include "utils.hpp"
 
-#include <fstream>
-#include <iostream>
-#include <iterator>
-
 #include "vpdecc/vpdecc.h"
 
 namespace openpower
@@ -250,18 +246,48 @@
     checkPTForRecord(itrToRecord, ptLen);
 }
 
+template <typename T>
+void EditorImpl::makeDbusCall(const std::string& object,
+                              const std::string& interface,
+                              const std::string& property,
+                              const std::variant<T>& data)
+{
+    auto bus = sdbusplus::bus::new_default();
+    auto properties = bus.new_method_call(
+        service, object.c_str(), "org.freedesktop.DBus.Properties", "Set");
+    properties.append(interface);
+    properties.append(property);
+    properties.append(data);
+
+    auto result = bus.call(properties);
+
+    if (result.is_method_error())
+    {
+        throw std::runtime_error("bus call failed");
+    }
+}
+
 void EditorImpl::processAndUpdateCI(const std::string& objectPath)
 {
     for (auto& commonInterface : jsonFile["commonInterfaces"].items())
     {
         for (auto& ciPropertyList : commonInterface.value().items())
         {
-            if ((ciPropertyList.value().value("recordName", "") ==
-                 thisRecord.recName) &&
-                (ciPropertyList.value().value("keywordName", "") ==
-                 thisRecord.recKWd))
+            if (ciPropertyList.value().type() ==
+                nlohmann::json::value_t::object)
             {
-                // implement busctl call here
+                if ((ciPropertyList.value().value("recordName", "") ==
+                     thisRecord.recName) &&
+                    (ciPropertyList.value().value("keywordName", "") ==
+                     thisRecord.recKWd))
+                {
+                    std::string kwdData(thisRecord.kwdUpdatedData.begin(),
+                                        thisRecord.kwdUpdatedData.end());
+
+                    makeDbusCall<std::string>(
+                        (VPD_OBJ_PATH_PREFIX + objectPath),
+                        commonInterface.key(), ciPropertyList.key(), kwdData);
+                }
             }
         }
     }
@@ -276,12 +302,22 @@
         {
             for (const auto& eiPropertyList : extraInterface.value().items())
             {
-                if ((eiPropertyList.value().value("recordName", "") ==
-                     thisRecord.recName) &&
-                    ((eiPropertyList.value().value("keywordName", "") ==
-                      thisRecord.recKWd)))
+                if (eiPropertyList.value().type() ==
+                    nlohmann::json::value_t::object)
                 {
-                    // implement busctl call here
+                    if ((eiPropertyList.value().value("recordName", "") ==
+                         thisRecord.recName) &&
+                        ((eiPropertyList.value().value("keywordName", "") ==
+                          thisRecord.recKWd)))
+                    {
+                        std::string kwdData(thisRecord.kwdUpdatedData.begin(),
+                                            thisRecord.kwdUpdatedData.end());
+                        makeDbusCall<std::string>(
+                            (VPD_OBJ_PATH_PREFIX + objPath),
+                            extraInterface.key(), eiPropertyList.key(),
+                            encodeKeyword(kwdData, eiPropertyList.value().value(
+                                                       "encoding", "")));
+                    }
                 }
             }
         }
@@ -296,13 +332,24 @@
     // iterate through all the inventories for this file path
     for (const auto& singleInventory : groupEEPROM)
     {
-        // process and update CI
-        const std::string& LocationCode =
-            singleInventory["extraInterfaces"][LOCATION_CODE_INF]
-                           ["LocationCode"]
-                               .get_ref<const nlohmann::json::string_t&>();
-        if (LocationCode.substr(1, 3) != "mts")
+        // by default inherit property is true
+        bool isInherit = true;
+
+        if (singleInventory.find("inherit") != singleInventory.end())
         {
+            isInherit = singleInventory["inherit"].get<bool>();
+        }
+
+        if (isInherit)
+        {
+            // update com interface
+            makeDbusCall<Binary>(
+                (VPD_OBJ_PATH_PREFIX +
+                 singleInventory["inventoryPath"].get<std::string>()),
+                (COM_INTERFACE_PREFIX + (std::string) "." + thisRecord.recName),
+                thisRecord.recKWd, thisRecord.kwdUpdatedData);
+
+            // process Common interface
             processAndUpdateCI(singleInventory["inventoryPath"]
                                    .get_ref<const nlohmann::json::string_t&>());
         }
diff --git a/vpd-manager/editor_impl.hpp b/vpd-manager/editor_impl.hpp
index ff94692..8e113b1 100644
--- a/vpd-manager/editor_impl.hpp
+++ b/vpd-manager/editor_impl.hpp
@@ -122,6 +122,18 @@
     void processAndUpdateEI(const nlohmann::json& Inventory,
                             const inventory::Path& objPath);
 
+    /** @brief method to make busctl call
+     *
+     *  @param[in] object - bus object path
+     *  @param[in] interface - bus interface
+     *  @param[in] property - property to update on BUS
+     *  @param[in] data - data to be updayed on Bus
+     *
+     */
+    template <typename T>
+    void makeDbusCall(const std::string& object, const std::string& interface,
+                      const std::string& property, const std::variant<T>& data);
+
     // path to the VPD file to edit
     const inventory::Path& vpdFilePath;
 
diff --git a/vpd-manager/manager.cpp b/vpd-manager/manager.cpp
index dfcdc39..37a8055 100644
--- a/vpd-manager/manager.cpp
+++ b/vpd-manager/manager.cpp
@@ -2,7 +2,7 @@
 
 #include "manager.hpp"
 
-#include "const.hpp"
+#include "editor_impl.hpp"
 #include "parser.hpp"
 
 using namespace openpower::vpd::constants;
