diff --git a/network_manager.cpp b/network_manager.cpp
index 4525e34..bb6d204 100644
--- a/network_manager.cpp
+++ b/network_manager.cpp
@@ -39,6 +39,56 @@
     setConfDir(confDir);
 }
 
+bool Manager::createDefaultNetworkFiles(bool force)
+{
+    auto isCreated = false;
+    try
+    {
+        // Directory would have created before with
+        // setConfDir function.
+        if (force)
+        {
+            // Factory Reset case
+            // we need to forcefully write the files
+            // so delete the existing ones.
+            if (fs::is_directory(confDir))
+            {
+                for (const auto& file : fs::directory_iterator(confDir))
+                {
+                    fs::remove(file.path());
+                }
+            }
+        }
+
+        auto interfaceStrList = getInterfaces();
+        for (const auto& interface : interfaceStrList)
+        {
+            auto fileName = systemd::config::networkFilePrefix + interface +
+                systemd::config::networkFileSuffix;
+
+            fs::path filePath = confDir;
+            filePath /= fileName;
+
+            // create the interface specific network file
+            // if not exist or we forcefully wants to write
+            // the network file.
+
+            if (force || !fs::is_regular_file(filePath.string()))
+            {
+                bmc::writeDHCPDefault(filePath.string(), interface);
+                log<level::INFO>("Created the default network file.",
+                        entry("INTERFACE=%s", interface.c_str()));
+                isCreated = true;
+            }
+        }
+    }
+    catch (std::exception& e)
+    {
+        log<level::ERR>("Unable to create the default network file");
+    }
+    return isCreated;
+}
+
 void Manager::setConfDir(const fs::path& dir)
 {
     confDir = dir;
@@ -130,45 +180,14 @@
 
 void Manager::reset()
 {
-    const std::string networkConfig = confDir.string();
-    bool interfacesMapped = false;
-
-    if(fs::is_directory(networkConfig))
+    if(!createDefaultNetworkFiles(true))
     {
-        for(auto& file : fs::directory_iterator(networkConfig))
-        {
-            fs::remove(file.path());
-        }
-
-        for (auto& intf : interfaces)
-        {
-            auto fileName = systemd::config::networkFilePrefix + intf.first +
-                            systemd::config::networkFileSuffix;
-
-            fs::path  filePath = networkConfig;
-            filePath /= fileName;
-
-            bmc::writeDHCPDefault(filePath.string(), intf.first);
-            interfacesMapped = true;
-        }
-
-        if(interfacesMapped)
-        {
-            log<level::INFO>("Network configuration reset to DHCP.");
-        }
-        else
-        {
-            log<level::ERR>("No network interfaces are mapped.");
-            elog<InternalFailure>();
-        }
-    }
-    else
-    {
-        log<level::ERR>("Network configuration directory not found!");
-        elog<InternalFailure>();
+        log<level::ERR>("Network Factory Reset failed.");
+        return;
+        // TODO: openbmc/openbmc#1721 - Log ResetFailed error here.
     }
 
-    return;
+    log<level::INFO>("Network Factory Reset done.");
 }
 
 // Need to merge the below function with the code which writes the
diff --git a/network_manager.hpp b/network_manager.hpp
index 0d15fc6..70ed8fc 100644
--- a/network_manager.hpp
+++ b/network_manager.hpp
@@ -94,11 +94,19 @@
          */
         const DHCPConfPtr& getDHCPConf() { return dhcpConf; }
 
-    private:
+        /** @brief create the default network files for each interface
+         *  @detail if force param is true then forcefully create the network
+         *          files otherwise if network file doesn't exist then
+         *          create it.
+         *  @param[in] force - forcefully create the file
+         *  @return true if network file created else false
+         */
+        bool createDefaultNetworkFiles(bool force);
 
         /** @brief restart the systemd networkd. */
         void restartNetwork();
 
+    private:
         /** @brief Persistent sdbusplus DBus bus connection. */
         sdbusplus::bus::bus& bus;
 
diff --git a/network_manager_main.cpp b/network_manager_main.cpp
index 7fa3b05..969b705 100644
--- a/network_manager_main.cpp
+++ b/network_manager_main.cpp
@@ -63,8 +63,20 @@
 
     phosphor::network::rtnetlink::Server svr(eventPtr);
 
+    // create the network interface dbus objects and system config
     phosphor::network::manager->createChildObjects();
 
+    // create the default network files if the network file
+    // is not there for any interface.
+    // Parameter false means don't create the network
+    // files forcefully.
+    if (phosphor::network::manager->createDefaultNetworkFiles(false))
+    {
+        // if files created restart the network.
+        // don't need to call the create child objects as eventhandler
+        // will create it.
+        phosphor::network::manager->restartNetwork();
+    }
     return svr.run();
 }
 
