diff --git a/src/inventory_mac.cpp b/src/inventory_mac.cpp
new file mode 100644
index 0000000..6a60990
--- /dev/null
+++ b/src/inventory_mac.cpp
@@ -0,0 +1,350 @@
+#include "config.h"
+
+#include "inventory_mac.hpp"
+
+#include "network_manager.hpp"
+#include "types.hpp"
+
+#include <filesystem>
+#include <fstream>
+#include <memory>
+#include <nlohmann/json.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/bus/match.hpp>
+#include <string>
+#include <vector>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace phosphor::network::inventory
+{
+
+using phosphor::logging::elog;
+using phosphor::logging::entry;
+using phosphor::logging::level;
+using phosphor::logging::log;
+using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+
+using DbusObjectPath = std::string;
+using DbusInterface = std::string;
+using PropertyValue = std::string;
+using DbusService = std::string;
+using ObjectTree = string_umap<string_umap<std::vector<std::string>>>;
+
+constexpr auto firstBootPath = "/var/lib/network/firstBoot_";
+constexpr auto configFile = "/usr/share/network/config.json";
+
+constexpr auto invNetworkIntf =
+    "xyz.openbmc_project.Inventory.Item.NetworkInterface";
+constexpr auto invRoot = "/xyz/openbmc_project/inventory";
+constexpr auto mapperBus = "xyz.openbmc_project.ObjectMapper";
+constexpr auto mapperObj = "/xyz/openbmc_project/object_mapper";
+constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
+constexpr auto propIntf = "org.freedesktop.DBus.Properties";
+constexpr auto methodGet = "Get";
+
+Manager* manager = nullptr;
+std::unique_ptr<sdbusplus::bus::match_t> EthInterfaceMatch = nullptr;
+std::vector<std::string> first_boot_status;
+
+void setFirstBootMACOnInterface(const std::string& intf, const std::string& mac)
+{
+    for (const auto& interface : manager->interfaces)
+    {
+        if (interface.first == intf)
+        {
+            auto returnMAC = interface.second->macAddress(mac);
+            if (returnMAC == mac)
+            {
+                log<level::INFO>(fmt::format("Setting MAC on {}", intf).c_str(),
+                                 entry("INTF=%s", intf.c_str()),
+                                 entry("MAC=%s", mac.c_str()));
+                std::error_code ec;
+                if (std::filesystem::is_directory("/var/lib/network", ec))
+                {
+                    std::ofstream persistentFile(firstBootPath + intf);
+                }
+                break;
+            }
+            else
+            {
+                log<level::INFO>("MAC is Not Set on ethernet Interface");
+            }
+        }
+    }
+}
+
+ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName)
+{
+    std::string interfaceName = intfName;
+
+    // load the config JSON from the Read Only Path
+    std::ifstream in(configFile);
+    nlohmann::json configJson;
+    in >> configJson;
+    interfaceName = configJson[intfName];
+
+    std::vector<DbusInterface> interfaces;
+    interfaces.emplace_back(invNetworkIntf);
+
+    auto depth = 0;
+
+    auto mapperCall =
+        bus.new_method_call(mapperBus, mapperObj, mapperIntf, "GetSubTree");
+
+    mapperCall.append(invRoot, depth, interfaces);
+
+    auto mapperReply = bus.call(mapperCall);
+    if (mapperReply.is_method_error())
+    {
+        log<level::ERR>("Error in mapper call");
+        elog<InternalFailure>();
+    }
+
+    ObjectTree objectTree;
+    mapperReply.read(objectTree);
+
+    if (objectTree.empty())
+    {
+        log<level::ERR>("No Object has implemented the interface",
+                        entry("INTERFACE=%s", invNetworkIntf));
+        elog<InternalFailure>();
+    }
+
+    DbusObjectPath objPath;
+    DbusService service;
+
+    if (1 == objectTree.size())
+    {
+        objPath = objectTree.begin()->first;
+        service = objectTree.begin()->second.begin()->first;
+    }
+    else
+    {
+        // If there are more than 2 objects, object path must contain the
+        // interface name
+        for (auto const& object : objectTree)
+        {
+            log<level::INFO>("interface",
+                             entry("INT=%s", interfaceName.c_str()));
+            log<level::INFO>("object", entry("OBJ=%s", object.first.c_str()));
+
+            if (std::string::npos != object.first.find(interfaceName.c_str()))
+            {
+                objPath = object.first;
+                service = object.second.begin()->first;
+                break;
+            }
+        }
+
+        if (objPath.empty())
+        {
+            log<level::ERR>("Can't find the object for the interface",
+                            entry("intfName=%s", interfaceName.c_str()));
+            elog<InternalFailure>();
+        }
+    }
+
+    auto method = bus.new_method_call(service.c_str(), objPath.c_str(),
+                                      propIntf, methodGet);
+
+    method.append(invNetworkIntf, "MACAddress");
+
+    auto reply = bus.call(method);
+    if (reply.is_method_error())
+    {
+        log<level::ERR>("Failed to get MACAddress",
+                        entry("PATH=%s", objPath.c_str()),
+                        entry("INTERFACE=%s", invNetworkIntf));
+        elog<InternalFailure>();
+    }
+
+    std::variant<std::string> value;
+    reply.read(value);
+    return ToAddr<ether_addr>{}(std::get<std::string>(value));
+}
+
+bool setInventoryMACOnSystem(sdbusplus::bus_t& bus,
+                             const nlohmann::json& configJson,
+                             const std::string& intfname)
+{
+    try
+    {
+        auto inventoryMAC = getfromInventory(bus, intfname);
+        if (inventoryMAC != ether_addr{})
+        {
+            auto macStr = std::to_string(inventoryMAC);
+            log<level::INFO>("Mac Address in Inventory on ",
+                             entry("Interface : ", intfname.c_str()),
+                             entry("MAC Address :", macStr.c_str()));
+            setFirstBootMACOnInterface(intfname, macStr);
+            first_boot_status.push_back(intfname);
+            bool status = true;
+            for (const auto& keys : configJson.items())
+            {
+                if (!(std::find(first_boot_status.begin(),
+                                first_boot_status.end(),
+                                keys.key()) != first_boot_status.end()))
+                {
+                    log<level::INFO>("Interface MAC is NOT set from VPD"),
+                        entry("INTERFACE", keys.key().c_str());
+                    status = false;
+                }
+            }
+            if (status)
+            {
+                log<level::INFO>("Removing the match for ethernet interfaces");
+                EthInterfaceMatch = nullptr;
+            }
+        }
+        else
+        {
+            log<level::INFO>("Nothing is present in Inventory");
+            return false;
+        }
+    }
+    catch (const std::exception& e)
+    {
+        log<level::ERR>("Exception occurred during getting of MAC "
+                        "address from Inventory");
+        return false;
+    }
+    return true;
+}
+
+// register the macthes to be monitored from inventory manager
+void registerSignals(sdbusplus::bus_t& bus, const nlohmann::json& configJson)
+{
+    log<level::INFO>("Registering the Inventory Signals Matcher");
+
+    static std::unique_ptr<sdbusplus::bus::match_t> MacAddressMatch;
+
+    auto callback = [&](sdbusplus::message_t& m) {
+        std::map<DbusObjectPath,
+                 std::map<DbusInterface, std::variant<PropertyValue>>>
+            interfacesProperties;
+
+        sdbusplus::message::object_path objPath;
+        m.read(objPath, interfacesProperties);
+
+        for (const auto& pattern : configJson.items())
+        {
+            if (objPath.str.find(pattern.value()) != std::string::npos)
+            {
+                for (auto& interface : interfacesProperties)
+                {
+                    if (interface.first == invNetworkIntf)
+                    {
+                        for (const auto& property : interface.second)
+                        {
+                            if (property.first == "MACAddress")
+                            {
+                                setFirstBootMACOnInterface(
+                                    pattern.key(),
+                                    std::get<std::string>(property.second));
+                                break;
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    };
+
+    MacAddressMatch = std::make_unique<sdbusplus::bus::match_t>(
+        bus,
+        "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
+        "member='InterfacesAdded',path='/xyz/openbmc_project/"
+        "inventory'",
+        callback);
+}
+
+void watchEthernetInterface(sdbusplus::bus_t& bus,
+                            const nlohmann::json& configJson)
+{
+    auto mycallback = [&](sdbusplus::message_t& m) {
+        std::map<DbusObjectPath,
+                 std::map<DbusInterface, std::variant<PropertyValue>>>
+            interfacesProperties;
+
+        sdbusplus::message::object_path objPath;
+        std::pair<std::string, std::string> ethPair;
+        m.read(objPath, interfacesProperties);
+        for (const auto& interfaces : interfacesProperties)
+        {
+            if (interfaces.first ==
+                "xyz.openbmc_project.Network.EthernetInterface")
+            {
+                for (const auto& property : interfaces.second)
+                {
+                    if (property.first == "InterfaceName")
+                    {
+                        std::string infname =
+                            std::get<std::string>(property.second);
+
+                        if (configJson.find(infname) == configJson.end())
+                        {
+                            // ethernet interface not found in configJSON
+                            // check if it is not sit0 interface, as it is
+                            // expected.
+                            if (infname != "sit0")
+                            {
+                                log<level::ERR>(
+                                    "Wrong Interface Name in Config Json");
+                            }
+                        }
+                        else
+                        {
+                            if (!setInventoryMACOnSystem(bus, configJson,
+                                                         infname))
+                            {
+                                registerSignals(bus, configJson);
+                                EthInterfaceMatch = nullptr;
+                            }
+                        }
+                        break;
+                    }
+                }
+                break;
+            }
+        }
+    };
+    // Incase if phosphor-inventory-manager started early and the VPD is already
+    // collected by the time network service has come up, better to check the
+    // VPD directly and set the MAC Address on the respective Interface.
+
+    bool registeredSignals = false;
+    for (const auto& interfaceString : configJson.items())
+    {
+        if ((FORCE_SYNC_MAC_FROM_INVENTORY ||
+             !std::filesystem::exists(firstBootPath + interfaceString.key())) &&
+            !registeredSignals)
+        {
+            auto msg = fmt::format("{}, check VPD for MAC",
+                                   (FORCE_SYNC_MAC_FROM_INVENTORY)
+                                       ? "Force sync enabled"
+                                       : "First boot file is not present");
+            log<level::INFO>(msg.c_str());
+            EthInterfaceMatch = std::make_unique<sdbusplus::bus::match_t>(
+                bus,
+                "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
+                "member='InterfacesAdded',path='/xyz/openbmc_project/network'",
+                mycallback);
+            registeredSignals = true;
+        }
+    }
+}
+
+std::unique_ptr<Runtime> watch(sdbusplus::bus::bus& bus, Manager& m)
+{
+    manager = &m;
+    std::ifstream in(configFile);
+    nlohmann::json configJson;
+    in >> configJson;
+    watchEthernetInterface(bus, configJson);
+    return nullptr;
+}
+
+} // namespace phosphor::network::inventory
diff --git a/src/inventory_mac.hpp b/src/inventory_mac.hpp
new file mode 100644
index 0000000..f7aec32
--- /dev/null
+++ b/src/inventory_mac.hpp
@@ -0,0 +1,24 @@
+#pragma once
+#include <memory>
+
+namespace sdbusplus::bus
+{
+class bus;
+}
+
+namespace phosphor::network
+{
+
+class Manager;
+
+namespace inventory
+{
+
+struct Runtime
+{
+    virtual ~Runtime() = default;
+};
+std::unique_ptr<Runtime> watch(sdbusplus::bus::bus& bus, Manager& m);
+
+} // namespace inventory
+} // namespace phosphor::network
diff --git a/src/meson.build b/src/meson.build
index 3119a88..93cf1f2 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -17,21 +17,20 @@
   install: true,
   install_dir: get_option('bindir'))
 
-json_dep = declare_dependency()
+main_deps = []
+main_srcs = []
 if get_option('sync-mac')
+  main_srcs += [
+    'inventory_mac.cpp',
+  ]
   # nlohmann_json might not have a pkg-config. It is header only so just make
   # sure we can access the needed symbols from the header.
-  has_json = meson.get_compiler('cpp').has_header_symbol(
-    'nlohmann/json.hpp',
-    'nlohmann::json::string_t',
-    required: false)
-  if not has_json
-    json_dep = dependency('nlohmann_json')
-  endif
+  main_deps += [
+    dependency('nlohmann_json', allow_fallback: true, required: false),
+  ]
 endif
 
 networkd_deps = [
-  json_dep,
   phosphor_dbus_interfaces_dep,
   dependency('phosphor-logging'),
   networkd_dbus_dep,
@@ -74,8 +73,9 @@
 executable(
   'phosphor-network-manager',
   'network_manager_main.cpp',
+  main_srcs,
   implicit_include_directories: false,
-  dependencies: networkd_dep,
+  dependencies: [networkd_dep] + main_deps,
   install: true,
   install_dir: get_option('bindir'))
 
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 30af9a6..51863a7 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -1,5 +1,3 @@
-#include "config.h"
-
 #include "network_manager.hpp"
 
 #include "config_parser.hpp"
@@ -13,7 +11,6 @@
 #include <net/if.h>
 
 #include <filesystem>
-#include <fstream>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/message.hpp>
@@ -22,7 +19,6 @@
 constexpr char SYSTEMD_BUSNAME[] = "org.freedesktop.systemd1";
 constexpr char SYSTEMD_PATH[] = "/org/freedesktop/systemd1";
 constexpr char SYSTEMD_INTERFACE[] = "org.freedesktop.systemd1.Manager";
-constexpr auto FirstBootFile = "/var/lib/network/firstBoot_";
 
 constexpr char NETWORKD_BUSNAME[] = "org.freedesktop.network1";
 constexpr char NETWORKD_PATH[] = "/org/freedesktop/network1";
@@ -467,39 +463,6 @@
     }
 }
 
-#ifdef SYNC_MAC_FROM_INVENTORY
-void Manager::setFistBootMACOnInterface(
-    const std::pair<std::string, std::string>& inventoryEthPair)
-{
-    for (const auto& interface : interfaces)
-    {
-        if (interface.first == inventoryEthPair.first)
-        {
-            auto returnMAC =
-                interface.second->macAddress(inventoryEthPair.second);
-            if (returnMAC == inventoryEthPair.second)
-            {
-                log<level::INFO>("Set the MAC on "),
-                    entry("interface : ", interface.first.c_str()),
-                    entry("MAC : ", inventoryEthPair.second.c_str());
-                std::error_code ec;
-                if (std::filesystem::is_directory("/var/lib/network", ec))
-                {
-                    std::ofstream persistentFile(FirstBootFile +
-                                                 interface.first);
-                }
-                break;
-            }
-            else
-            {
-                log<level::INFO>("MAC is Not Set on ethernet Interface");
-            }
-        }
-    }
-}
-
-#endif
-
 void Manager::reloadConfigs()
 {
     reloadTimer->restartOnce(reloadTimeout);
diff --git a/src/network_manager.hpp b/src/network_manager.hpp
index 27ac8ae..5166f7a 100644
--- a/src/network_manager.hpp
+++ b/src/network_manager.hpp
@@ -90,20 +90,6 @@
         return *dhcpConf;
     }
 
-    /** @brief This function gets the MAC address from the VPD and
-     *  sets it on the corresponding ethernet interface during first
-     *  Boot, once it sets the MAC from VPD, it creates a file named
-     *  firstBoot under /var/lib to make sure we dont run this function
-     *  again.
-     *
-     *  @param[in] ethPair - Its a pair of ethernet interface name & the
-     * corresponding MAC Address from the VPD
-     *
-     *  return - NULL
-     */
-    void setFistBootMACOnInterface(
-        const std::pair<std::string, std::string>& ethPair);
-
     /** @brief Arms a timer to tell systemd-network to reload all of the network
      * configurations
      */
diff --git a/src/network_manager_main.cpp b/src/network_manager_main.cpp
index 15bc59f..dc51915 100644
--- a/src/network_manager_main.cpp
+++ b/src/network_manager_main.cpp
@@ -1,51 +1,29 @@
 #include "config.h"
 
+#ifdef SYNC_MAC_FROM_INVENTORY
+#include "inventory_mac.hpp"
+#endif
 #include "network_manager.hpp"
 #include "rtnetlink_server.hpp"
 #include "types.hpp"
-#ifdef SYNC_MAC_FROM_INVENTORY
-#include "util.hpp"
-#endif
 
 #include <fmt/format.h>
-#include <linux/netlink.h>
 
-#include <filesystem>
-#include <fstream>
 #include <functional>
 #include <memory>
-#ifdef SYNC_MAC_FROM_INVENTORY
-#include <nlohmann/json.hpp>
-#endif
-#include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
-#include <sdbusplus/bus/match.hpp>
 #include <sdbusplus/server/manager.hpp>
 #include <sdeventplus/event.hpp>
 #include <sdeventplus/source/signal.hpp>
 #include <stdplus/signal.hpp>
-#include <xyz/openbmc_project/Common/error.hpp>
 
-using phosphor::logging::elog;
-using phosphor::logging::entry;
 using phosphor::logging::level;
 using phosphor::logging::log;
-using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-using DbusObjectPath = std::string;
-using DbusInterface = std::string;
-using PropertyValue = std::string;
 
 constexpr char NETWORK_CONF_DIR[] = "/etc/systemd/network";
-
 constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network";
 
-constexpr auto firstBootPath = "/var/lib/network/firstBoot_";
-constexpr auto configFile = "/usr/share/network/config.json";
-
-constexpr auto invNetworkIntf =
-    "xyz.openbmc_project.Inventory.Item.NetworkInterface";
-
 namespace phosphor
 {
 namespace network
@@ -54,190 +32,6 @@
 std::unique_ptr<Manager> manager = nullptr;
 std::unique_ptr<Timer> reloadTimer = nullptr;
 
-#ifdef SYNC_MAC_FROM_INVENTORY
-std::unique_ptr<sdbusplus::bus::match_t> EthInterfaceMatch = nullptr;
-std::vector<std::string> first_boot_status;
-
-bool setInventoryMACOnSystem(sdbusplus::bus_t& bus,
-                             const nlohmann::json& configJson,
-                             const std::string& intfname)
-{
-    try
-    {
-        auto inventoryMAC = mac_address::getfromInventory(bus, intfname);
-        if (inventoryMAC != ether_addr{})
-        {
-            auto macStr = std::to_string(inventoryMAC);
-            log<level::INFO>("Mac Address in Inventory on ",
-                             entry("Interface : ", intfname.c_str()),
-                             entry("MAC Address :", macStr.c_str()));
-            manager->setFistBootMACOnInterface(
-                std::make_pair(intfname.c_str(), std::move(macStr)));
-            first_boot_status.push_back(intfname.c_str());
-            bool status = true;
-            for (const auto& keys : configJson.items())
-            {
-                if (!(std::find(first_boot_status.begin(),
-                                first_boot_status.end(),
-                                keys.key()) != first_boot_status.end()))
-                {
-                    log<level::INFO>("Interface MAC is NOT set from VPD"),
-                        entry("INTERFACE", keys.key().c_str());
-                    status = false;
-                }
-            }
-            if (status)
-            {
-                log<level::INFO>("Removing the match for ethernet interfaces");
-                EthInterfaceMatch = nullptr;
-            }
-        }
-        else
-        {
-            log<level::INFO>("Nothing is present in Inventory");
-            return false;
-        }
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>("Exception occurred during getting of MAC "
-                        "address from Inventory");
-        return false;
-    }
-    return true;
-}
-
-// register the macthes to be monitored from inventory manager
-void registerSignals(sdbusplus::bus_t& bus, const nlohmann::json& configJson)
-{
-    log<level::INFO>("Registering the Inventory Signals Matcher");
-
-    static std::unique_ptr<sdbusplus::bus::match_t> MacAddressMatch;
-
-    auto callback = [&](sdbusplus::message_t& m) {
-        std::map<DbusObjectPath,
-                 std::map<DbusInterface, std::variant<PropertyValue>>>
-            interfacesProperties;
-
-        sdbusplus::message::object_path objPath;
-        std::pair<std::string, std::string> ethPair;
-        m.read(objPath, interfacesProperties);
-
-        for (const auto& pattern : configJson.items())
-        {
-            if (objPath.str.find(pattern.value()) != std::string::npos)
-            {
-                for (auto& interface : interfacesProperties)
-                {
-                    if (interface.first == invNetworkIntf)
-                    {
-                        for (const auto& property : interface.second)
-                        {
-                            if (property.first == "MACAddress")
-                            {
-                                ethPair = std::make_pair(
-                                    pattern.key(),
-                                    std::get<std::string>(property.second));
-                                break;
-                            }
-                        }
-                        break;
-                    }
-                }
-                if (!(ethPair.first.empty() || ethPair.second.empty()))
-                {
-                    manager->setFistBootMACOnInterface(ethPair);
-                }
-            }
-        }
-    };
-
-    MacAddressMatch = std::make_unique<sdbusplus::bus::match_t>(
-        bus,
-        "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
-        "member='InterfacesAdded',path='/xyz/openbmc_project/"
-        "inventory'",
-        callback);
-}
-
-void watchEthernetInterface(sdbusplus::bus_t& bus,
-                            const nlohmann::json& configJson)
-{
-    auto mycallback = [&](sdbusplus::message_t& m) {
-        std::map<DbusObjectPath,
-                 std::map<DbusInterface, std::variant<PropertyValue>>>
-            interfacesProperties;
-
-        sdbusplus::message::object_path objPath;
-        std::pair<std::string, std::string> ethPair;
-        m.read(objPath, interfacesProperties);
-        for (const auto& interfaces : interfacesProperties)
-        {
-            if (interfaces.first ==
-                "xyz.openbmc_project.Network.EthernetInterface")
-            {
-                for (const auto& property : interfaces.second)
-                {
-                    if (property.first == "InterfaceName")
-                    {
-                        std::string infname =
-                            std::get<std::string>(property.second);
-
-                        if (configJson.find(infname) == configJson.end())
-                        {
-                            // ethernet interface not found in configJSON
-                            // check if it is not sit0 interface, as it is
-                            // expected.
-                            if (infname != "sit0")
-                            {
-                                log<level::ERR>(
-                                    "Wrong Interface Name in Config Json");
-                            }
-                        }
-                        else
-                        {
-                            if (!setInventoryMACOnSystem(bus, configJson,
-                                                         infname))
-                            {
-                                registerSignals(bus, configJson);
-                                EthInterfaceMatch = nullptr;
-                            }
-                        }
-                        break;
-                    }
-                }
-                break;
-            }
-        }
-    };
-    // Incase if phosphor-inventory-manager started early and the VPD is already
-    // collected by the time network service has come up, better to check the
-    // VPD directly and set the MAC Address on the respective Interface.
-
-    bool registeredSignals = false;
-    for (const auto& interfaceString : configJson.items())
-    {
-        if ((FORCE_SYNC_MAC_FROM_INVENTORY ||
-             !std::filesystem::exists(firstBootPath + interfaceString.key())) &&
-            !registeredSignals)
-        {
-            auto msg = fmt::format("{}, check VPD for MAC",
-                                   (FORCE_SYNC_MAC_FROM_INVENTORY)
-                                       ? "Force sync enabled"
-                                       : "First boot file is not present");
-            log<level::INFO>(msg.c_str());
-            EthInterfaceMatch = std::make_unique<sdbusplus::bus::match_t>(
-                bus,
-                "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
-                "member='InterfacesAdded',path='/xyz/openbmc_project/network'",
-                mycallback);
-            registeredSignals = true;
-        }
-    }
-}
-
-#endif
-
 void reloadNetworkd()
 {
     if (manager)
@@ -281,10 +75,7 @@
     netlink::Server svr(event, *manager);
 
 #ifdef SYNC_MAC_FROM_INVENTORY
-    std::ifstream in(configFile);
-    nlohmann::json configJson;
-    in >> configJson;
-    watchEthernetInterface(bus, configJson);
+    auto runtime = inventory::watch(bus, *manager);
 #endif
 
     return event.loop();
diff --git a/src/util.cpp b/src/util.cpp
index 938e4d4..23c642f 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -11,10 +11,6 @@
 
 #include <cctype>
 #include <charconv>
-#include <fstream>
-#ifdef SYNC_MAC_FROM_INVENTORY
-#include <nlohmann/json.hpp>
-#endif
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
 #include <string>
@@ -224,117 +220,6 @@
 namespace mac_address
 {
 
-constexpr auto mapperBus = "xyz.openbmc_project.ObjectMapper";
-constexpr auto mapperObj = "/xyz/openbmc_project/object_mapper";
-constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
-constexpr auto propIntf = "org.freedesktop.DBus.Properties";
-constexpr auto methodGet = "Get";
-constexpr auto configFile = "/usr/share/network/config.json";
-
-using DbusObjectPath = std::string;
-using DbusService = std::string;
-using DbusInterface = std::string;
-using ObjectTree =
-    std::map<DbusObjectPath, std::map<DbusService, std::vector<DbusInterface>>>;
-
-constexpr auto invBus = "xyz.openbmc_project.Inventory.Manager";
-constexpr auto invNetworkIntf =
-    "xyz.openbmc_project.Inventory.Item.NetworkInterface";
-constexpr auto invRoot = "/xyz/openbmc_project/inventory";
-
-ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName)
-{
-
-    std::string interfaceName = intfName;
-
-#ifdef SYNC_MAC_FROM_INVENTORY
-    // load the config JSON from the Read Only Path
-    std::ifstream in(configFile);
-    nlohmann::json configJson;
-    in >> configJson;
-    interfaceName = configJson[intfName];
-#endif
-
-    std::vector<DbusInterface> interfaces;
-    interfaces.emplace_back(invNetworkIntf);
-
-    auto depth = 0;
-
-    auto mapperCall =
-        bus.new_method_call(mapperBus, mapperObj, mapperIntf, "GetSubTree");
-
-    mapperCall.append(invRoot, depth, interfaces);
-
-    auto mapperReply = bus.call(mapperCall);
-    if (mapperReply.is_method_error())
-    {
-        log<level::ERR>("Error in mapper call");
-        elog<InternalFailure>();
-    }
-
-    ObjectTree objectTree;
-    mapperReply.read(objectTree);
-
-    if (objectTree.empty())
-    {
-        log<level::ERR>("No Object has implemented the interface",
-                        entry("INTERFACE=%s", invNetworkIntf));
-        elog<InternalFailure>();
-    }
-
-    DbusObjectPath objPath;
-    DbusService service;
-
-    if (1 == objectTree.size())
-    {
-        objPath = objectTree.begin()->first;
-        service = objectTree.begin()->second.begin()->first;
-    }
-    else
-    {
-        // If there are more than 2 objects, object path must contain the
-        // interface name
-        for (auto const& object : objectTree)
-        {
-            log<level::INFO>("interface",
-                             entry("INT=%s", interfaceName.c_str()));
-            log<level::INFO>("object", entry("OBJ=%s", object.first.c_str()));
-
-            if (std::string::npos != object.first.find(interfaceName.c_str()))
-            {
-                objPath = object.first;
-                service = object.second.begin()->first;
-                break;
-            }
-        }
-
-        if (objPath.empty())
-        {
-            log<level::ERR>("Can't find the object for the interface",
-                            entry("intfName=%s", interfaceName.c_str()));
-            elog<InternalFailure>();
-        }
-    }
-
-    auto method = bus.new_method_call(service.c_str(), objPath.c_str(),
-                                      propIntf, methodGet);
-
-    method.append(invNetworkIntf, "MACAddress");
-
-    auto reply = bus.call(method);
-    if (reply.is_method_error())
-    {
-        log<level::ERR>("Failed to get MACAddress",
-                        entry("PATH=%s", objPath.c_str()),
-                        entry("INTERFACE=%s", invNetworkIntf));
-        elog<InternalFailure>();
-    }
-
-    std::variant<std::string> value;
-    reply.read(value);
-    return ToAddr<ether_addr>{}(std::get<std::string>(value));
-}
-
 bool isEmpty(const ether_addr& mac)
 {
     return mac == ether_addr{};
diff --git a/src/util.hpp b/src/util.hpp
index 4cf27a0..90beca2 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -1,20 +1,12 @@
 #pragma once
 #include "types.hpp"
 
-#include <net/ethernet.h>
-#include <netinet/in.h>
-#include <unistd.h>
-
-#include <cstring>
-#include <filesystem>
 #include <optional>
-#include <sdbusplus/bus.hpp>
 #include <stdplus/raw.hpp>
 #include <stdplus/zstring.hpp>
 #include <string>
 #include <string_view>
 #include <unordered_set>
-#include <xyz/openbmc_project/Network/EthernetInterface/server.hpp>
 
 namespace phosphor
 {
@@ -25,18 +17,9 @@
 class Parser;
 }
 
-using EthernetInterfaceIntf =
-    sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface;
-
 namespace mac_address
 {
 
-/** @brief gets the MAC address from the Inventory.
- *  @param[in] bus - DBUS Bus Object.
- *  @param[in] intfName - Interface name
- */
-ether_addr getfromInventory(sdbusplus::bus_t& bus, const std::string& intfName);
-
 /** @brief Determines if the mac address is empty
  *  @param[in] mac - The mac address
  *  @return True if 00:00:00:00:00:00
