diff --git a/Makefile.am b/Makefile.am
index eac5692..e2f2fcf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -22,7 +22,8 @@
 		dhcp_configuration.hpp \
 		vlan_interface.hpp \
 		rtnetlink_server.hpp \
-		timer.hpp
+		timer.hpp \
+		dns_updater.hpp
 
 phosphor_network_manager_SOURCES = \
 		ethernet_interface.cpp \
@@ -39,7 +40,8 @@
 		dhcp_configuration.cpp \
         vlan_interface.cpp \
 		rtnetlink_server.cpp \
-		timer.cpp
+		timer.cpp \
+		dns_updater.cpp
 
 CLEANFILES = \
 		xyz/openbmc_project/Network/VLAN/Create/server.cpp \
diff --git a/dns_updater.cpp b/dns_updater.cpp
new file mode 100644
index 0000000..5c4d058
--- /dev/null
+++ b/dns_updater.cpp
@@ -0,0 +1,59 @@
+#include "config.h"
+#include "dns_updater.hpp"
+
+#include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <sdbusplus/bus.hpp>
+
+#include <fstream>
+
+namespace phosphor
+{
+namespace network
+{
+namespace dns
+{
+namespace updater
+{
+
+void processDNSEntries(const fs::path& inFile,
+                       const fs::path& outFile)
+{
+    using namespace phosphor::logging;
+    using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+
+    std::fstream outStream(outFile, std::fstream::out);
+    if (!outStream.is_open())
+    {
+        log<level::ERR>("Unable to open output file",
+                        entry("FILE=%s", outFile.c_str()));
+        elog<InternalFailure>();
+    }
+
+    std::fstream inStream(inFile, std::fstream::in);
+    if (!inStream.is_open())
+    {
+        log<level::ERR>("Unable to open the input file",
+                        entry("FILE=%s", inFile.c_str()));
+        elog<InternalFailure>();
+    }
+
+    outStream << "### Generated by phosphor-networkd ###\n";
+
+    for (std::string line; std::getline(inStream, line);)
+    {
+        auto index = line.find("DNS=");
+        if(index != std::string::npos)
+        {
+           auto dns = line.substr(index + 4);
+           outStream << "nameserver " << dns << "\n" ;
+        }
+    }
+    return;
+}
+
+} // namespace updater
+} // namespace dns
+} // namespace network
+} // namespace phosphor
diff --git a/dns_updater.hpp b/dns_updater.hpp
new file mode 100644
index 0000000..44c0e32
--- /dev/null
+++ b/dns_updater.hpp
@@ -0,0 +1,41 @@
+#pragma once
+
+#include <experimental/filesystem>
+
+namespace phosphor
+{
+namespace network
+{
+namespace dns
+{
+namespace updater
+{
+
+namespace fs = std::experimental::filesystem;
+
+constexpr auto RESOLV_CONF = "/etc/resolv.conf";
+
+/** @brief Reads DNS entries supplied by DHCP and updates specified file
+ *
+ *  @param[in] inFile  - File having DNS entries supplied by DHCP
+ *  @param[in] outFile - File to write the nameserver entries to
+ */
+void processDNSEntries(const fs::path& inFile,
+                       const fs::path& outFile);
+
+/** @brief User callback handler invoked by inotify watcher
+ *
+ *  Needed to enable production and test code so that the right
+ *  callback functions could be implemented
+ *
+ *  @param[in] inFile - File having DNS entries supplied by DHCP
+ */
+inline void processDNSEntries(const fs::path& inFile)
+{
+    return processDNSEntries(inFile, RESOLV_CONF);
+}
+
+} // namepsace updater
+} // namepsace dns
+} // namespace network
+} // namespace phosphor
diff --git a/test/Makefile.am b/test/Makefile.am
index 024fa25..5c70fbe 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -2,7 +2,7 @@
 
 TESTS = $(check_PROGRAMS)
 
-check_PROGRAMS = test
+check_PROGRAMS = test test_dns_updater
 
 test_SOURCES = \
 	test_util.cpp \
@@ -12,20 +12,30 @@
 	test_config_parser.cpp \
 	test_vlan_interface.cpp
 
-test_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
+test_dns_updater_SOURCES = test_dns_updater.cpp
 
-test_CXXFLAGS = $(PTHREAD_CFLAGS) \
-				$(SYSTEMD_CFLAGS) \
-				$(SDBUSPLUS_CFLAGS) \
-				$(PHOSPHOR_LOGGING_CFLAGS) \
-				$(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
+generic_cpp_flags = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
 
-test_LDFLAGS =	-lgtest_main -lgtest -lstdc++fs \
-				$(OESDK_TESTCASE_FLAGS) \
-				$(SYSTEMD_LIBS) \
-				$(SDBUSPLUS_LIBS) \
-				$(PHOSPHOR_LOGGING_LIBS) \
-				$(PHOSPHOR_DBUS_INTERFACES_LIBS)
+generic_cxx_flags = $(PTHREAD_CFLAGS) \
+					$(SYSTEMD_CFLAGS) \
+					$(SDBUSPLUS_CFLAGS) \
+					$(PHOSPHOR_LOGGING_CFLAGS) \
+					$(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
+
+generic_ld_flags =  -lgtest_main -lgtest -lstdc++fs \
+					$(OESDK_TESTCASE_FLAGS) \
+					$(SYSTEMD_LIBS) \
+					$(SDBUSPLUS_LIBS) \
+					$(PHOSPHOR_LOGGING_LIBS) \
+					$(PHOSPHOR_DBUS_INTERFACES_LIBS)
+
+test_CPPFLAGS = ${generic_cpp_flags}
+test_CXXFLAGS = ${generic_cxx_flags}
+test_LDFLAGS  = ${generic_ld_flags}
+
+test_dns_updater_CPPFLAGS = ${generic_cpp_flags}
+test_dns_updater_CXXFLAGS = ${generic_cxx_flags}
+test_dns_updater_LDFLAGS  = ${generic_ld_flags}
 
 test_LDADD = $(top_builddir)/ethernet_interface.o \
 			$(top_builddir)/network_manager.o \
@@ -40,3 +50,5 @@
 			$(top_builddir)/vlan_interface.o \
 			$(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
+
+test_dns_updater_LDADD = $(top_builddir)/dns_updater.o
diff --git a/test/test_dns_updater.cpp b/test/test_dns_updater.cpp
new file mode 100644
index 0000000..8fb4bcb
--- /dev/null
+++ b/test/test_dns_updater.cpp
@@ -0,0 +1,78 @@
+#include "dns_updater.hpp"
+
+#include <gtest/gtest.h>
+
+#include <fstream>
+#include <experimental/filesystem>
+
+static constexpr auto IN_FILE = "/tmp/netif_state";
+static constexpr auto OUT_FILE = "/tmp/resolv.conf";
+static constexpr auto COMPARE_FILE = "/tmp/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::processDNSEntries(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);
+}
