diff --git a/src/ethernet_interface.cpp b/src/ethernet_interface.cpp
index 632518c..4c31383 100644
--- a/src/ethernet_interface.cpp
+++ b/src/ethernet_interface.cpp
@@ -42,6 +42,11 @@
 constexpr auto RESOLVED_INTERFACE = "org.freedesktop.resolve1.Link";
 constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
 constexpr auto RESOLVED_SERVICE_PATH = "/org/freedesktop/resolve1/link/";
+
+constexpr auto TIMESYNCD_SERVICE = "org.freedesktop.timesync1";
+constexpr auto TIMESYNCD_INTERFACE = "org.freedesktop.timesync1.Manager";
+constexpr auto TIMESYNCD_SERVICE_PATH = "/org/freedesktop/timesync1";
+
 constexpr auto METHOD_GET = "Get";
 
 static stdplus::Fd& getIFSock()
@@ -767,6 +772,13 @@
     return EthernetInterfaceIntf::staticNameServers();
 }
 
+void EthernetInterface::loadNTPServers(const config::Parser& config)
+{
+    EthernetInterfaceIntf::ntpServers(getNTPServerFromTimeSyncd());
+    EthernetInterfaceIntf::staticNTPServers(
+        config.map.getValueStrings("Network", "NTP"));
+}
+
 void EthernetInterface::loadNameServers(const config::Parser& config)
 {
     EthernetInterfaceIntf::nameservers(getNameServerFromResolvd());
@@ -774,6 +786,30 @@
         config.map.getValueStrings("Network", "DNS"));
 }
 
+ServerList EthernetInterface::getNTPServerFromTimeSyncd()
+{
+    ServerList servers; // Variable to capture the NTP Server IPs
+    auto method = bus.new_method_call(TIMESYNCD_SERVICE, TIMESYNCD_SERVICE_PATH,
+                                      PROPERTY_INTERFACE, METHOD_GET);
+
+    method.append(TIMESYNCD_INTERFACE, "LinkNTPServers");
+
+    try
+    {
+        auto reply = bus.call(method);
+        std::variant<ServerList> response;
+        reply.read(response);
+        servers = std::get<ServerList>(response);
+    }
+    catch (const sdbusplus::exception::SdBusError& e)
+    {
+        log<level::ERR>(
+            "Failed to get NTP server information from Systemd-Timesyncd");
+    }
+
+    return servers;
+}
+
 ServerList EthernetInterface::getNameServerFromResolvd()
 {
     ServerList servers;
@@ -881,6 +917,7 @@
     vlanIntf->createIPAddressObjects();
     vlanIntf->createStaticNeighborObjects();
     vlanIntf->loadNameServers(config);
+    vlanIntf->loadNTPServers(config);
 
     this->vlanInterfaces.emplace(std::move(vlanInterfaceName),
                                  std::move(vlanIntf));
@@ -917,14 +954,25 @@
     return path;
 }
 
-ServerList EthernetInterface::ntpServers(ServerList servers)
+ServerList EthernetInterface::staticNTPServers(ServerList value)
 {
-    auto ntpServers = EthernetInterfaceIntf::ntpServers(servers);
+    try
+    {
+        EthernetInterfaceIntf::staticNTPServers(value);
 
-    writeConfigurationFile();
-    manager.reloadConfigs();
+        writeConfigurationFile();
+        manager.reloadConfigs();
+    }
+    catch (InternalFailure& e)
+    {
+        log<level::ERR>("Exception processing NTP entries");
+    }
+    return EthernetInterfaceIntf::staticNTPServers();
+}
 
-    return ntpServers;
+ServerList EthernetInterface::ntpServers(ServerList /*servers*/)
+{
+    elog<NotAllowed>(NotAllowedArgument::REASON("ReadOnly Property"));
 }
 // Need to merge the below function with the code which writes the
 // config file during factory reset.
@@ -974,7 +1022,7 @@
         }
         {
             auto& ntps = network["NTP"];
-            for (const auto& ntp : EthernetInterfaceIntf::ntpServers())
+            for (const auto& ntp : EthernetInterfaceIntf::staticNTPServers())
             {
                 ntps.emplace_back(ntp);
             }
diff --git a/src/ethernet_interface.hpp b/src/ethernet_interface.hpp
index 578fc5b..a4b127c 100644
--- a/src/ethernet_interface.hpp
+++ b/src/ethernet_interface.hpp
@@ -79,6 +79,10 @@
                       bool emitSignal = true,
                       std::optional<bool> enabled = std::nullopt);
 
+    /** @brief Function used to load the ntpservers
+     */
+    void loadNTPServers(const config::Parser& config);
+
     /** @brief Function used to load the nameservers.
      */
     void loadNameServers(const config::Parser& config);
@@ -181,6 +185,11 @@
      */
     ServerList ntpServers(ServerList value) override;
 
+    /** @brief sets the static NTP servers.
+     *  @param[in] value - vector of NTP servers.
+     */
+    ServerList staticNTPServers(ServerList value) override;
+
     /** @brief sets the Static DNS/nameservers.
      *  @param[in] value - vector of DNS servers.
      */
@@ -255,10 +264,10 @@
         generateStaticNeighborObjectPath(std::string_view ipAddress,
                                          std::string_view macAddress) const;
 
-    /** @brief get the NTP server list from the network conf
+    /** @brief get the NTP server list from the timsyncd dbus obj
      *
      */
-    ServerList getNTPServersFromConf();
+    virtual ServerList getNTPServerFromTimeSyncd();
 
     /** @brief get the name server details from the network conf
      *
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index f959a69..25b9c05 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -151,6 +151,7 @@
         intf->createIPAddressObjects();
         intf->createStaticNeighborObjects();
         intf->loadNameServers(config);
+        intf->loadNTPServers(config);
 
         this->interfaces.emplace(std::move(interface), std::move(intf));
     }
diff --git a/test/test_ethernet_interface.cpp b/test/test_ethernet_interface.cpp
index ad30c0a..4fd97a0 100644
--- a/test/test_ethernet_interface.cpp
+++ b/test/test_ethernet_interface.cpp
@@ -14,6 +14,7 @@
 #include <sdbusplus/bus.hpp>
 #include <stdplus/gtest/tmp.hpp>
 #include <string_view>
+#include <xyz/openbmc_project/Common/error.hpp>
 
 #include <gtest/gtest.h>
 
@@ -88,6 +89,17 @@
     {
         interface.ip(addressType, ipaddress, subnetMask, "");
     }
+
+    void setNtpServers()
+    {
+        ServerList ntpServers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
+        interface.EthernetInterfaceIntf::ntpServers(ntpServers);
+    }
+
+    ServerList getNtpServers()
+    {
+        return interface.EthernetInterfaceIntf::ntpServers();
+    }
 };
 
 TEST_F(TestEthernetInterface, Fields)
@@ -185,17 +197,31 @@
     EXPECT_EQ(interface.getNameServerFromResolvd(), servers);
 }
 
-TEST_F(TestEthernetInterface, addNTPServers)
+TEST_F(TestEthernetInterface, addStaticNTPServers)
 {
     ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
     EXPECT_CALL(manager, reloadConfigs());
-    interface.ntpServers(servers);
+    interface.staticNTPServers(servers);
     fs::path filePath = confDir;
     filePath /= "00-bmc-test0.network";
     config::Parser parser(filePath.string());
     EXPECT_EQ(servers, parser.map.getValueStrings("Network", "NTP"));
 }
 
+TEST_F(TestEthernetInterface, addNTPServers)
+{
+    using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+    ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
+    EXPECT_THROW(interface.ntpServers(servers), NotAllowed);
+}
+
+TEST_F(TestEthernetInterface, getNTPServers)
+{
+    ServerList servers = {"10.1.1.1", "10.2.2.2", "10.3.3.3"};
+    setNtpServers();
+    EXPECT_EQ(getNtpServers(), servers);
+}
+
 TEST_F(TestEthernetInterface, addGateway)
 {
     std::string gateway = "10.3.3.3";
