diff --git a/meson_options.txt b/meson_options.txt
index d351fea..751a849 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,3 +10,5 @@
        description: 'Enable ethtool information lookup')
 option('sync-mac', type: 'boolean',
        description: 'Sync mac address with phosphor-inventory-manager')
+option('hyp-nw-config', type : 'boolean',
+       description : 'ibm-oem: Enable the hypervisor network manager')
diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.cpp b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.cpp
new file mode 100644
index 0000000..ad0b8b4
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.cpp
@@ -0,0 +1,245 @@
+#include "hyp_network_manager.hpp"
+
+#include "types.hpp"
+#include "util.hpp"
+
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/elog.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+using sdbusplus::exception::SdBusError;
+
+class HypNetworkMgr;
+
+namespace phosphor
+{
+namespace network
+{
+using namespace phosphor::logging;
+using InternalFailure =
+    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+
+const std::string intType = "Integer";
+const std::string strType = "String";
+const std::string enumType = "Enumeration";
+
+using ObjectTree =
+    std::map<std::string, std::map<std::string, std::vector<std::string>>>;
+
+auto HypNetworkMgr::getDBusProp(const std::string& objectName,
+                                const std::string& interface,
+                                const std::string& kw)
+{
+    auto bus = sdbusplus::bus::new_default();
+    auto properties = bus.new_method_call(
+        "xyz.openbmc_project.BIOSConfigManager", objectName.c_str(),
+        "org.freedesktop.DBus.Properties", "Get");
+    properties.append(interface);
+    properties.append(kw);
+    auto result = bus.call(properties);
+
+    if (result.is_method_error())
+    {
+        throw std::runtime_error("Get api failed");
+    }
+    return result;
+}
+
+void HypNetworkMgr::setBIOSTableAttr(
+    std::string attrName, std::variant<std::string, int64_t> attrValue,
+    std::string attrType)
+{
+    auto findAttr = biosTableAttrs.find(attrName);
+    if (findAttr != biosTableAttrs.end())
+    {
+        if (attrType == intType)
+        {
+            int64_t value = std::get<int64_t>(attrValue);
+            if (value != std::get<int64_t>(findAttr->second))
+            {
+                biosTableAttrs.erase(findAttr);
+                biosTableAttrs.emplace(attrName, value);
+            }
+        }
+        else if (attrType == strType)
+        {
+            std::string value = std::get<std::string>(attrValue);
+            if (value != std::get<std::string>(findAttr->second))
+            {
+                biosTableAttrs.erase(findAttr);
+                biosTableAttrs.emplace(attrName, value);
+            }
+        }
+    }
+    else
+    {
+        log<level::INFO>(
+            "setBIOSTableAttr: Attribute is not found in biosTableAttrs"),
+            entry("attrName : ", attrName.c_str());
+    }
+}
+
+void HypNetworkMgr::setBIOSTableAttrs()
+{
+    try
+    {
+        constexpr auto biosMgrIntf = "xyz.openbmc_project.BIOSConfig.Manager";
+        constexpr auto biosMgrObj = "/xyz/openbmc_project/bios_config";
+
+        constexpr auto mapperBus = "xyz.openbmc_project.ObjectMapper";
+        constexpr auto mapperObj = "/xyz/openbmc_project/object_mapper";
+        constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
+
+        std::vector<std::string> interfaces;
+        interfaces.emplace_back(biosMgrIntf);
+        auto depth = 0;
+
+        auto mapperCall =
+            bus.new_method_call(mapperBus, mapperObj, mapperIntf, "GetSubTree");
+
+        mapperCall.append(biosMgrObj, 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", biosMgrIntf));
+            elog<InternalFailure>();
+        }
+
+        std::string objPath;
+
+        if (1 == objectTree.size())
+        {
+            objPath = objectTree.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", biosMgrIntf));
+                log<level::INFO>("object",
+                                 entry("OBJ=%s", object.first.c_str()));
+
+                if (std::string::npos != object.first.find(biosMgrIntf))
+                {
+                    objPath = object.first;
+                    break;
+                }
+            }
+
+            if (objPath.empty())
+            {
+                log<level::ERR>("Can't find the object for the interface",
+                                entry("intfName=%s", biosMgrIntf));
+                elog<InternalFailure>();
+            }
+        }
+
+        std::variant<BiosBaseTableType> response;
+        getDBusProp(objPath, biosMgrIntf, "BaseBIOSTable").read(response);
+
+        const BiosBaseTableType* baseBiosTable =
+            std::get_if<BiosBaseTableType>(&response);
+
+        if (baseBiosTable == nullptr)
+        {
+            log<level::ERR>("BaseBiosTable is empty. No attributes found!");
+            return;
+        }
+
+        for (const BiosBaseTableItemType& item : *baseBiosTable)
+        {
+            if (item.first.rfind("vmi", 0) == 0) // starts with the prefix
+            {
+                const std::string& itemType =
+                    std::get<biosBaseAttrType>(item.second);
+
+                if (itemType.compare(itemType.size() - intType.size(),
+                                     intType.size(), intType) == 0)
+                {
+                    const int64_t* currValue = std::get_if<int64_t>(
+                        &std::get<biosBaseCurrValue>(item.second));
+                    if (currValue != nullptr)
+                    {
+                        if (item.first == "vmi_if_count")
+                        {
+                            intfCount = *currValue;
+                        }
+                        biosTableAttrs.emplace(item.first, *currValue);
+                    }
+                }
+                else if ((itemType.compare(itemType.size() - strType.size(),
+                                           strType.size(), strType) == 0) ||
+                         (itemType.compare(itemType.size() - enumType.size(),
+                                           enumType.size(), enumType) == 0))
+                {
+                    const std::string* currValue = std::get_if<std::string>(
+                        &std::get<biosBaseCurrValue>(item.second));
+                    if (currValue != nullptr)
+                    {
+                        biosTableAttrs.emplace(item.first, *currValue);
+                    }
+                }
+                else
+                {
+                    log<level::ERR>("Unsupported datatype: The attribute is of "
+                                    "unknown type");
+                }
+            }
+        }
+    }
+    catch (const SdBusError& e)
+    {
+        log<level::ERR>("Error in making dbus call");
+        throw std::runtime_error("DBus call failed");
+    }
+}
+
+uint16_t HypNetworkMgr::getIntfCount()
+{
+    return intfCount;
+}
+
+biosTableType HypNetworkMgr::getBIOSTableAttrs()
+{
+    return biosTableAttrs;
+}
+
+void HypNetworkMgr::createIfObjects()
+{
+    setBIOSTableAttrs();
+
+    if (intfCount == 1)
+    {
+        // TODO: create eth0 object
+        log<level::INFO>("Create eth0 object");
+    }
+    else if (intfCount == 2)
+    {
+        // TODO: create eth0 and eth1 objects
+        log<level::INFO>("Create eth0 and eth1 objects");
+    }
+    else
+    {
+        log<level::ERR>("More than 2 Interfaces");
+        return;
+    }
+}
+
+} // namespace network
+} // namespace phosphor
diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.hpp b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.hpp
new file mode 100644
index 0000000..fa56d96
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager.hpp
@@ -0,0 +1,148 @@
+#pragma once
+
+#include "types.hpp"
+#include "util.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+#include <sdeventplus/source/event.hpp>
+
+namespace phosphor
+{
+namespace network
+{
+
+class HypEthInterface;
+
+using biosAttrName = std::string;
+using biosAttrType = std::string;
+using biosAttrIsReadOnly = bool;
+using biosAttrDispName = std::string;
+using biosAttrHelpText = std::string;
+using biosAttrMenuPath = std::string;
+using biosAttrCurrValue = std::variant<int64_t, std::string>;
+using biosAttrDefaultValue = std::variant<int64_t, std::string>;
+using biosAttrOptions =
+    std::tuple<std::string, std::variant<int64_t, std::string>>;
+
+using biosTableType = std::map<biosAttrName, biosAttrCurrValue>;
+using BiosBaseTableItemType =
+    std::pair<biosAttrName,
+              std::tuple<biosAttrType, biosAttrIsReadOnly, biosAttrDispName,
+                         biosAttrHelpText, biosAttrMenuPath, biosAttrCurrValue,
+                         biosAttrDefaultValue, std::vector<biosAttrOptions>>>;
+using BiosBaseTableType = std::vector<BiosBaseTableItemType>;
+
+enum BiosBaseTableIndex
+{
+    biosBaseAttrType = 0,
+    biosBaseReadonlyStatus,
+    biosBaseDisplayName,
+    biosBaseDescription,
+    biosBaseMenuPath,
+    biosBaseCurrValue,
+    biosBaseDefaultValue,
+    biosBaseOptions
+};
+
+/** @class Manager
+ *  @brief Implementation for the
+ *         xyz.openbmc_project.Network.Hypervisor DBus API.
+ */
+class HypNetworkMgr
+{
+  public:
+    HypNetworkMgr() = delete;
+    HypNetworkMgr(const HypNetworkMgr&) = delete;
+    HypNetworkMgr& operator=(const HypNetworkMgr&) = delete;
+    HypNetworkMgr(HypNetworkMgr&&) = delete;
+    HypNetworkMgr& operator=(HypNetworkMgr&&) = delete;
+    virtual ~HypNetworkMgr() = default;
+
+    /** @brief Constructor to put object onto bus at a dbus path.
+     *  @param[in] bus - Bus to attach to.
+     *  @param[in] event - event.
+     *  @param[in] path - Path to attach at.
+     */
+    HypNetworkMgr(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+                  const char* path) :
+        bus(bus),
+        event(event), objectPath(path)
+    {
+        // Create the hypervisor eth interface objects
+        createIfObjects();
+    };
+
+    /** @brief Get the BaseBiosTable attributes
+     *
+     * @return attributes list
+     */
+    biosTableType getBIOSTableAttrs();
+
+    /** @brief Set specific attribute and its value to
+     *         the biosTableAttrs data member
+     *
+     * @param[in] attrName  - attribute name in biosTableAttrs
+     * @param[in] attrValue - attribute value
+     * @param[in] attrType  - attribute type
+     *
+     */
+    void setBIOSTableAttr(std::string attrName,
+                          std::variant<std::string, int64_t> attrValue,
+                          std::string attrType);
+
+  private:
+    /**
+     * @brief get Dbus Prop
+     *
+     * @param[in] objectName - dbus Object
+     * @param[in] interface - dbus Interface
+     * @param[in] kw - keyword under the interface
+     *
+     * @return dbus call response
+     */
+    auto getDBusProp(const std::string& objectName,
+                     const std::string& interface, const std::string& kw);
+
+    /** @brief Fetch the interface and the ipaddress details
+     *         from the Bios table and create the hyp ethernet interfaces
+     *         dbus object.
+     */
+    void createIfObjects();
+
+    /** @brief Get the hypervisor eth interfaces count
+     *
+     *  @return number of interfaces
+     */
+    uint16_t getIntfCount();
+
+    /** @brief Setter method for biosTableAttrs data member
+     *         GET operation on the BIOS table to
+     *         read all the hyp attrbutes (name, value pair)
+     *         and push them to biosTableAttrs data member
+     */
+    void setBIOSTableAttrs();
+
+    /** @brief sdbusplus DBus bus connection. */
+    sdbusplus::bus::bus& bus;
+
+    /**  sdevent Event handle. */
+    sdeventplus::Event& event;
+
+    /** @brief object path */
+    std::string objectPath;
+
+    /** @brief Persistent map of EthernetInterface dbus
+     *         objects and their names
+     */
+    std::map<std::string, std::shared_ptr<HypEthInterface>> interfaces;
+
+    /** @brief interface count */
+    uint16_t intfCount;
+
+    /** @brief map of bios table attrs and values */
+    std::map<biosAttrName, biosAttrCurrValue> biosTableAttrs;
+};
+
+} // namespace network
+} // namespace phosphor
diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_network_manager_main.cpp b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager_main.cpp
new file mode 100644
index 0000000..ddb515b
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/hyp_network_manager_main.cpp
@@ -0,0 +1,31 @@
+#include "hyp_network_manager.hpp"
+
+#include <sdeventplus/event.hpp>
+
+constexpr char DEFAULT_HYP_NW_OBJPATH[] =
+    "/xyz/openbmc_project/network/hypervisor";
+constexpr char HYP_DEFAULT_NETWORK_BUSNAME[] =
+    "xyz.openbmc_project.Network.Hypervisor";
+
+int main(int /*argc*/, char** /*argv*/)
+{
+    auto bus = sdbusplus::bus::new_default();
+
+    // Add sdbusplus ObjectManager
+    sdbusplus::server::manager::manager objManager(bus, DEFAULT_HYP_NW_OBJPATH);
+
+    // Get default event loop
+    auto event = sdeventplus::Event::get_default();
+
+    // Attach the bus to sd_event to service user requests
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+
+    // Create hypervisor network manager dbus object
+    phosphor::network::HypNetworkMgr manager(bus, event,
+                                             DEFAULT_HYP_NW_OBJPATH);
+
+    bus.request_name(HYP_DEFAULT_NETWORK_BUSNAME);
+
+    event.loop();
+    return 0;
+}
diff --git a/src/ibm/hypervisor-network-mgr-src/meson.build b/src/ibm/hypervisor-network-mgr-src/meson.build
new file mode 100644
index 0000000..672c10d
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/meson.build
@@ -0,0 +1,22 @@
+hyp_default_busname = 'xyz.openbmc_project.Network.Hypervisor'
+
+configure_file(
+  input: 'xyz.openbmc_project.Network.Hypervisor.service.in',
+  output: 'xyz.openbmc_project.Network.Hypervisor.service',
+  configuration: {
+    'SYSTEMD_TARGET': 'multi-user.target',
+    'HYP_DEFAULT_NETWORK_BUSNAME': hyp_default_busname,
+  },
+  install: true,
+  install_dir: dependency('systemd').get_variable(
+    pkgconfig: 'systemdsystemunitdir'))
+
+executable(
+  'hyp-network-manager',
+  'hyp_network_manager_main.cpp',
+  'hyp_network_manager.cpp',
+  implicit_include_directories: false,
+  dependencies: networkd_dep,
+  install: true,
+  install_dir: get_option('bindir'))
+
diff --git a/src/ibm/hypervisor-network-mgr-src/xyz.openbmc_project.Network.Hypervisor.service.in b/src/ibm/hypervisor-network-mgr-src/xyz.openbmc_project.Network.Hypervisor.service.in
new file mode 100644
index 0000000..7bfa7a5
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/xyz.openbmc_project.Network.Hypervisor.service.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=Hypervisor Network Manager
+After=xyz.openbmc_project.biosconfig_manager.service
+
+[Service]
+ExecStart=/usr/bin/env hyp-network-manager
+SyslogIdentifier=hyp-network-manager
+Restart=always
+Type=dbus
+BusName=xyz.openbmc_project.Network.Hypervisor
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/ibm/meson.build b/src/ibm/meson.build
new file mode 100644
index 0000000..cc9ec5c
--- /dev/null
+++ b/src/ibm/meson.build
@@ -0,0 +1 @@
+subdir('hypervisor-network-mgr-src')
diff --git a/src/meson.build b/src/meson.build
index 8013bf5..7916856 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -101,3 +101,7 @@
   dependencies: networkd_dep,
   install: true,
   install_dir: get_option('bindir'))
+
+if (get_option('hyp-nw-config') == true)
+  subdir('ibm')
+endif
