diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp
index 9dcba8e..f609b9d 100644
--- a/ethernet_interface.cpp
+++ b/ethernet_interface.cpp
@@ -461,15 +461,9 @@
         EthernetInterfaceIntf::nameservers(value);
 
         writeConfigurationFile();
-
-        // Currently we don't have systemd-resolved enabled
-        // in the openbmc. Once we update the network conf file,
-        // it should be read by systemd-resolved.service.
-
-        // The other reason to write the resolv conf is,
-        // we don't want to restart the networkd for nameserver change.
-        // as restarting of systemd-networkd takes more then 2 secs
-        writeDNSEntries(value, resolvConfFile);
+        // resolved reads the DNS server configuration from the
+        // network file.
+        manager.restartSystemdUnit(networkdService);
     }
     catch (InternalFailure& e)
     {
@@ -498,24 +492,6 @@
     return servers;
 }
 
-void EthernetInterface::writeDNSEntries(const ServerList& dnsList,
-                                        const std::string& file)
-{
-    std::fstream outStream(file, std::fstream::out);
-    if (!outStream.is_open())
-    {
-        log<level::ERR>("Unable to open the file",
-                        entry("FILE=%s", file.c_str()));
-        elog<InternalFailure>();
-    }
-
-    outStream << "### Generated manually via dbus settings ###\n";
-    for (const auto& server : dnsList)
-    {
-        outStream << "nameserver " << server << "\n";
-    }
-}
-
 void EthernetInterface::loadVLAN(VlanId id)
 {
     std::string vlanInterfaceName = interfaceName() + "." + std::to_string(id);
diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp
index e48fddb..60c56e3 100644
--- a/ethernet_interface.hpp
+++ b/ethernet_interface.hpp
@@ -267,12 +267,6 @@
      */
     ServerList getNTPServersFromConf();
 
-    /** @brief write the DNS entries to resolver file.
-     *  @param[in] dnsList - DNS server list which needs to be written.
-     *  @param[in] file    - File to write the name server entries to.
-     */
-    void writeDNSEntries(const ServerList& dnsList, const std::string& file);
-
     /** @brief get the name server details from the network conf
      *
      */
diff --git a/network_manager_main.cpp b/network_manager_main.cpp
index 1b85bfa..fedb73d 100644
--- a/network_manager_main.cpp
+++ b/network_manager_main.cpp
@@ -1,6 +1,5 @@
 #include "config.h"
 
-#include "dns_updater.hpp"
 #include "network_manager.hpp"
 #include "rtnetlink_server.hpp"
 #include "types.hpp"
@@ -23,7 +22,6 @@
 using phosphor::logging::log;
 using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
 
-constexpr char NETWORK_STATE_FILE[] = "/run/systemd/netif/state";
 constexpr char NETWORK_CONF_DIR[] = "/etc/systemd/network";
 
 constexpr char DEFAULT_OBJPATH[] = "/xyz/openbmc_project/network";
@@ -136,17 +134,5 @@
     // RTNETLINK event handler
     phosphor::network::rtnetlink::Server svr(eventPtr, smartSock);
 
-    // DNS entry handler
-    phosphor::network::inotify::Watch watch(
-        eventPtr, NETWORK_STATE_FILE,
-        std::bind(&phosphor::network::dns::updater::processDNSEntries,
-                  std::placeholders::_1));
-
-    // At this point, we have registered for the notifications for future
-    // events. However, if the file is already populated before this, then
-    // they won't ever get notified and thus we need to read once before
-    // waiting on change events
-    phosphor::network::dns::updater::processDNSEntries(NETWORK_STATE_FILE);
-
     sd_event_loop(eventPtr.get());
 }
diff --git a/test/Makefile.am b/test/Makefile.am
index 842f8ca..45dab5f 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -2,7 +2,7 @@
 
 TESTS = $(check_PROGRAMS)
 
-check_PROGRAMS = test test_dns_updater test_watch
+check_PROGRAMS = test
 
 test_SOURCES = \
 	test_util.cpp \
@@ -15,9 +15,6 @@
 	test_config_parser.cpp \
 	test_vlan_interface.cpp
 
-test_dns_updater_SOURCES = test_dns_updater.cpp
-test_watch_SOURCES = test_watch.cpp
-
 generic_cpp_flags = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
 
 generic_cxx_flags = $(PTHREAD_CFLAGS) \
@@ -39,14 +36,6 @@
 test_CXXFLAGS = ${generic_cxx_flags}
 test_LDFLAGS  = ${generic_ld_flags} -ldl
 
-test_dns_updater_CPPFLAGS = ${generic_cpp_flags}
-test_dns_updater_CXXFLAGS = ${generic_cxx_flags}
-test_dns_updater_LDFLAGS  = ${generic_ld_flags}
-
-test_watch_CPPFLAGS = ${generic_cpp_flags}
-test_watch_CXXFLAGS = ${generic_cxx_flags}
-test_watch_LDFLAGS  = ${generic_ld_flags}
-
 test_LDADD = $(top_builddir)/ethernet_interface.o \
 			$(top_builddir)/network_manager.o \
 			$(top_builddir)/network_config.o \
@@ -63,6 +52,3 @@
 			$(top_builddir)/xyz/openbmc_project/Network/VLAN/Create/phosphor_network_manager-server.o \
 			$(top_builddir)/xyz/openbmc_project/Network/IP/Create/phosphor_network_manager-server.o \
 			$(top_builddir)/xyz/openbmc_project/Network/Neighbor/CreateStatic/phosphor_network_manager-server.o
-
-test_dns_updater_LDADD = $(top_builddir)/dns_updater.o
-test_watch_LDADD = $(top_builddir)/watch.o
diff --git a/test/test_dns_updater.cpp b/test/test_dns_updater.cpp
deleted file mode 100644
index 2a425c0..0000000
--- a/test/test_dns_updater.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#include "dns_updater.hpp"
-
-#include <experimental/filesystem>
-#include <fstream>
-
-#include <gtest/gtest.h>
-
-static constexpr auto IN_FILE = "/tmp/" __BASE_FILE__ "netif_state";
-static constexpr auto OUT_FILE = "/tmp/" __BASE_FILE__ "resolv.conf";
-static constexpr auto COMPARE_FILE =
-    "/tmp/" __BASE_FILE__ "resolv_compare.conf";
-static constexpr auto DNS_ENTRY_1 = "DNS=1.2.3.4\n";
-static constexpr auto DNS_ENTRY_2 = "DNS=5.6.7.8\n";
-
-namespace fs = std::experimental::filesystem;
-
-class DnsUpdateTest : public ::testing::Test
-{
-  public:
-    // Gets called as part of each TEST_F construction
-    DnsUpdateTest()
-    {
-        // Create a file containing DNS entries like in netif/state
-        std::ofstream file(IN_FILE);
-        file << DNS_ENTRY_1;
-        file << DNS_ENTRY_2;
-
-        // Create a file to compare the results against
-        std::ofstream compare(COMPARE_FILE);
-        compare << "### Generated by phosphor-networkd ###\n";
-        compare << "nameserver 1.2.3.4\n";
-        compare << "nameserver 5.6.7.8\n";
-    }
-
-    // Gets called as part of each TEST_F destruction
-    ~DnsUpdateTest()
-    {
-        if (fs::exists(IN_FILE))
-        {
-            fs::remove(IN_FILE);
-        }
-        if (fs::exists(OUT_FILE))
-        {
-            fs::remove(OUT_FILE);
-        }
-        if (fs::exists(COMPARE_FILE))
-        {
-            fs::remove(COMPARE_FILE);
-        }
-    }
-};
-
-/** @brief Makes outfile is updated with right contents
- */
-TEST_F(DnsUpdateTest, validateOutFile)
-{
-    phosphor::network::dns::updater::updateDNSEntries(IN_FILE, OUT_FILE);
-
-    // Read files and compare
-    std::ifstream resolv(OUT_FILE);
-    std::ifstream compare(COMPARE_FILE);
-
-    // From actual file
-    std::string resolvEntry{};
-    std::string resolvContent{};
-    while (std::getline(resolv, resolvEntry))
-    {
-        resolvContent += resolvEntry;
-    }
-
-    // From compare file
-    std::string compareEntry{};
-    std::string compareContent{};
-    while (std::getline(compare, compareEntry))
-    {
-        compareContent += compareEntry;
-    }
-    EXPECT_EQ(resolvContent, compareContent);
-}
diff --git a/test/test_ethernet_interface.cpp b/test/test_ethernet_interface.cpp
index 5ea7f7a..30dee8a 100644
--- a/test/test_ethernet_interface.cpp
+++ b/test/test_ethernet_interface.cpp
@@ -101,29 +101,6 @@
     {
         interface.iP(addressType, ipaddress, subnetMask, gateway);
     }
-
-    // Validates if the DNS entries have been correctly processed
-    void validateResolvFile(ServerList values)
-    {
-        // Check whether the entries has been written to resolv.conf
-        fs::path resolvFile = confDir;
-        resolvFile /= "resolv.conf";
-
-        // Passed in "value" is what is read from the config file
-        interface.writeDNSEntries(values, resolvFile);
-        std::string expectedServers =
-            "### Generated manually via dbus settings ###";
-        expectedServers +=
-            "nameserver 9.1.1.1nameserver 9.2.2.2nameserver 9.3.3.3";
-
-        std::string actualServers{};
-        std::fstream stream(resolvFile.string().c_str(), std::fstream::in);
-        for (std::string line; std::getline(stream, line);)
-        {
-            actualServers += line;
-        }
-        EXPECT_EQ(expectedServers, actualServers);
-    }
 };
 
 TEST_F(TestEthernetInterface, NoIPaddress)
@@ -185,6 +162,7 @@
 TEST_F(TestEthernetInterface, addNameServers)
 {
     ServerList servers = {"9.1.1.1", "9.2.2.2", "9.3.3.3"};
+    EXPECT_CALL(manager, restartSystemdUnit(networkdService)).Times(1);
     interface.nameservers(servers);
     fs::path filePath = confDir;
     filePath /= "00-bmc-test0.network";
@@ -193,8 +171,6 @@
     config::ValueList values;
     std::tie(rc, values) = parser.getValues("Network", "DNS");
     EXPECT_EQ(servers, values);
-
-    validateResolvFile(values);
 }
 
 TEST_F(TestEthernetInterface, addNTPServers)
diff --git a/test/test_watch.cpp b/test/test_watch.cpp
deleted file mode 100644
index 167c903..0000000
--- a/test/test_watch.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "types.hpp"
-#include "watch.hpp"
-
-#include <experimental/filesystem>
-#include <fstream>
-
-#include <gtest/gtest.h>
-
-static constexpr auto TRIGGER_FILE = "/tmp/" __BASE_FILE__ "netif_state";
-
-namespace fs = std::experimental::filesystem;
-
-class WatchTest : public ::testing::Test
-{
-  public:
-    // systemd event handler
-    sd_event* events;
-
-    // Need this so that events can be initialized.
-    int rc;
-
-    // Gets called as part of each TEST_F construction
-    WatchTest() : rc(sd_event_default(&events)), eventPtr(events)
-    {
-        // Create a file containing DNS entries like in netif/state
-        std::ofstream file(TRIGGER_FILE);
-        file << "";
-
-        // Check for successful creation of
-        // event handler
-        EXPECT_GE(rc, 0);
-    }
-
-    // Gets called as part of each TEST_F destruction
-    ~WatchTest()
-    {
-        if (fs::exists(TRIGGER_FILE))
-        {
-            fs::remove(TRIGGER_FILE);
-        }
-    }
-
-    // unique_ptr for sd_event
-    phosphor::network::EventPtr eventPtr;
-
-    // Count of callback invocation
-    int count = 0;
-
-    // This is supposed to get hit twice
-    // Once at the beginning to see if there is anything
-    // and the second time when the data is fired.
-    void callBackHandler(const fs::path& file)
-    {
-        count++;
-
-        // Expect that the file is what we wanted
-        EXPECT_EQ(file, TRIGGER_FILE);
-    }
-};
-
-/** @brief Makes sure that the inotify event is fired
- */
-TEST_F(WatchTest, validateEventNotification)
-{
-    // Create a watch object and register the handler
-    phosphor::network::inotify::Watch watch(
-        eventPtr, TRIGGER_FILE,
-        std::bind(&WatchTest::callBackHandler, this, std::placeholders::_1));
-
-    // Reading the event post subscription
-    callBackHandler(TRIGGER_FILE);
-
-    // Callback function must have hit by now
-    EXPECT_EQ(1, count);
-
-    // Make a run and see that no changes
-    sd_event_run(eventPtr.get(), 10);
-    EXPECT_EQ(1, count);
-
-    // Pump the data and get notification
-    {
-        std::ofstream file(TRIGGER_FILE);
-        file << "DNS=1.2.3.4\n";
-    }
-
-    sd_event_run(eventPtr.get(), 10);
-    EXPECT_EQ(2, count);
-}
