diff --git a/src/ethernet_interface.cpp b/src/ethernet_interface.cpp
index 67dd16b..e836268 100644
--- a/src/ethernet_interface.cpp
+++ b/src/ethernet_interface.cpp
@@ -95,22 +95,6 @@
     EthernetInterfaceIntf::dhcp6(dhcpVal.v6);
     EthernetInterfaceIntf::ipv6AcceptRA(getIPv6AcceptRA(config));
     EthernetInterfaceIntf::nicEnabled(enabled);
-    {
-        const auto& gws = manager.getRouteTable().getDefaultGateway();
-        auto it = gws.find(ifIdx);
-        if (it != gws.end())
-        {
-            EthernetInterfaceIntf::defaultGateway(std::to_string(it->second));
-        }
-    }
-    {
-        const auto& gws = manager.getRouteTable().getDefaultGateway6();
-        auto it = gws.find(ifIdx);
-        if (it != gws.end())
-        {
-            EthernetInterfaceIntf::defaultGateway6(std::to_string(it->second));
-        }
-    }
 
     EthernetInterfaceIntf::ntpServers(
         config.map.getValueStrings("Network", "NTP"));
@@ -194,15 +178,6 @@
     }
 }
 
-void EthernetInterface::createIPAddressObjects()
-{
-    addrs.clear();
-    for (const auto& addr : system::getAddresses({.ifidx = ifIdx}))
-    {
-        manager.addAddress(addr);
-    }
-}
-
 void EthernetInterface::addStaticNeigh(const NeighborInfo& info)
 {
     if (!info.mac || !info.addr)
@@ -225,15 +200,6 @@
     }
 }
 
-void EthernetInterface::createStaticNeighborObjects()
-{
-    staticNeighbors.clear();
-    for (const auto& neighbor : system::getNeighbors({.ifidx = ifIdx}))
-    {
-        manager.addNeighbor(neighbor);
-    }
-}
-
 ObjectPath EthernetInterface::ip(IP::Protocol protType, std::string ipaddress,
                                  uint8_t prefixLength, std::string)
 {
@@ -281,7 +247,7 @@
                                     ifaddr, IP::AddressOrigin::Static));
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return it->second->getObjPath();
 }
@@ -324,7 +290,7 @@
                                    lladdr, Neighbor::State::Permanent));
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return it->second->getObjPath();
 }
@@ -334,7 +300,7 @@
     if (ipv6AcceptRA() != EthernetInterfaceIntf::ipv6AcceptRA(value))
     {
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     return value;
 }
@@ -344,7 +310,7 @@
     if (dhcp4() != EthernetInterfaceIntf::dhcp4(value))
     {
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     return value;
 }
@@ -354,7 +320,7 @@
     if (dhcp6() != EthernetInterfaceIntf::dhcp6(value))
     {
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     return value;
 }
@@ -376,7 +342,7 @@
     if (old4 != new4 || old6 != new6 || oldra != newra)
     {
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     return value;
 }
@@ -394,27 +360,6 @@
     return ipv6AcceptRA() ? DHCPConf::v6stateless : DHCPConf::none;
 }
 
-bool EthernetInterface::linkUp() const
-{
-    if (ifIdx == 0)
-    {
-        return EthernetInterfaceIntf::linkUp();
-    }
-    return system::intfIsRunning(interfaceName());
-}
-
-size_t EthernetInterface::mtu() const
-{
-    if (ifIdx == 0)
-    {
-        return EthernetInterfaceIntf::mtu();
-    }
-    const auto ifname = interfaceName();
-    return ignoreError("GetMTU", ifname, std::nullopt,
-                       [&] { return system::getMTU(ifname); })
-        .value_or(EthernetInterfaceIntf::mtu());
-}
-
 size_t EthernetInterface::mtu(size_t value)
 {
     const size_t old = EthernetInterfaceIntf::mtu();
@@ -445,7 +390,7 @@
         manager.addReloadPreHook(
             [ifname = interfaceName()]() { system::setNICUp(ifname, false); });
     }
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return value;
 }
@@ -472,7 +417,7 @@
         EthernetInterfaceIntf::staticNameServers(value);
 
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     catch (const InternalFailure& e)
     {
@@ -613,7 +558,7 @@
     config.writeFile(config::pathForIntfDev(manager.getConfDir(), intfName));
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return ret;
 }
@@ -625,7 +570,7 @@
         EthernetInterfaceIntf::staticNTPServers(value);
 
         writeConfigurationFile();
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
     catch (InternalFailure& e)
     {
@@ -742,18 +687,15 @@
     {
         auto& dhcp = config.map["DHCP"].emplace_back();
         dhcp["ClientIdentifier"].emplace_back("mac");
-        if (manager.getDHCPConf())
-        {
-            const auto& conf = *manager.getDHCPConf();
-            auto dns_enabled = conf.dnsEnabled() ? "true" : "false";
-            dhcp["UseDNS"].emplace_back(dns_enabled);
-            dhcp["UseDomains"].emplace_back(dns_enabled);
-            dhcp["UseNTP"].emplace_back(conf.ntpEnabled() ? "true" : "false");
-            dhcp["UseHostname"].emplace_back(conf.hostNameEnabled() ? "true"
-                                                                    : "false");
-            dhcp["SendHostname"].emplace_back(
-                conf.sendHostNameEnabled() ? "true" : "false");
-        }
+        const auto& conf = manager.getDHCPConf();
+        auto dns_enabled = conf.dnsEnabled() ? "true" : "false";
+        dhcp["UseDNS"].emplace_back(dns_enabled);
+        dhcp["UseDomains"].emplace_back(dns_enabled);
+        dhcp["UseNTP"].emplace_back(conf.ntpEnabled() ? "true" : "false");
+        dhcp["UseHostname"].emplace_back(conf.hostNameEnabled() ? "true"
+                                                                : "false");
+        dhcp["SendHostname"].emplace_back(conf.sendHostNameEnabled() ? "true"
+                                                                     : "false");
     }
     auto path = config::pathForIntfConf(manager.getConfDir(), interfaceName());
     config.writeFile(path);
@@ -811,7 +753,7 @@
             // The MAC and LLADDRs will only update if the NIC is already down
             system::setNICUp(interface, false);
         });
-        manager.reloadConfigsNoRefresh();
+        manager.reloadConfigs();
     }
 
 #ifdef HAVE_UBOOT_ENV
@@ -839,7 +781,7 @@
     addrs.clear();
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 }
 
 std::string EthernetInterface::defaultGateway(std::string gateway)
@@ -866,7 +808,7 @@
     EthernetInterfaceIntf::defaultGateway(gateway);
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return gateway;
 }
@@ -895,7 +837,7 @@
     EthernetInterfaceIntf::defaultGateway6(gateway);
 
     writeConfigurationFile();
-    manager.reloadConfigsNoRefresh();
+    manager.reloadConfigs();
 
     return gateway;
 }
