diff --git a/Makefile.am b/Makefile.am
index 370709f..02ba4c2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,7 +16,9 @@
 		network_manager.hpp \
 		ipaddress.hpp \
 		types.hpp \
-		util.hpp
+		util.hpp \
+		routing_table.hpp \
+		system_configuration.hpp
 
 phosphor_network_manager_SOURCES = \
 		ethernet_interface.cpp \
@@ -24,6 +26,7 @@
 		network_config.cpp \
 		network_manager.cpp \
 		network_manager_main.cpp \
+		system_configuration.cpp \
 		xyz/openbmc_project/Network/VLAN/Create/server.cpp \
 		xyz/openbmc_project/Network/IP/Create/server.cpp \
 		util.cpp \
diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp
index c824919..1f36815 100644
--- a/ethernet_interface.cpp
+++ b/ethernet_interface.cpp
@@ -89,11 +89,6 @@
                         gateway)));
     }
 
-    // TODO:- will move the default gateway to conf object
-    // once we implement that.
-
-    // TODO: openbmc/openbmc#1295
-    manager.defaultGateway = routingTable.getDefaultGateway();
 }
 
 void EthernetInterface::iP(IP::Protocol protType,
@@ -104,6 +99,8 @@
 
     if (dHCPEnabled())
     {
+        log<level::INFO>("DHCP enabled on the interface"),
+                        entry("INTERFACE=%s",interfaceName());
         return;
     }
 
@@ -277,7 +274,6 @@
     objectPath /= type;
     objectPath /= generateId(ipaddress, prefixLength, gateway);
     return objectPath.string();
-
 }
 
 }//namespace network
diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp
index 856f874..313a0b9 100644
--- a/ethernet_interface.hpp
+++ b/ethernet_interface.hpp
@@ -25,7 +25,6 @@
 using IP = sdbusplus::xyz::openbmc_project::Network::server::IP;
 class Manager; // forward declaration of network manager.
 
-class Manager; // forward declaration of network manager.
 class TestEthernetInterface;
 
 using LinkSpeed = uint16_t;
diff --git a/system_configuration.cpp b/system_configuration.cpp
new file mode 100644
index 0000000..7913b96
--- /dev/null
+++ b/system_configuration.cpp
@@ -0,0 +1,108 @@
+#include "config.h"
+#include "system_configuration.hpp"
+#include "network_manager.hpp"
+#include "routing_table.hpp"
+#include "xyz/openbmc_project/Common/error.hpp"
+
+#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+
+namespace phosphor
+{
+namespace network
+{
+
+// systemd service to kick start a target.
+constexpr auto HOSTNAMED_SERVICE    = "org.freedesktop.hostname1";
+constexpr auto HOSTNAMED_SERVICE_PATH  = "/org/freedesktop/hostname1";
+constexpr auto HOSTNAMED_INTERFACE  = "org.freedesktop.hostname1";
+constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
+constexpr auto METHOD_GET = "Get";
+constexpr auto METHOD_SET = "SetStaticHostname";
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+
+using SystemConfigIntf =
+    sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
+
+SystemConfiguration::SystemConfiguration(sdbusplus::bus::bus& bus,
+                                         const std::string& objPath,
+                                         Manager& parent) :
+        Iface(bus, objPath.c_str(), true),
+        bus(bus),
+        manager(parent)
+{
+    auto name = getHostNameFromSystem();
+    route::Table routingTable;
+
+    SystemConfigIntf::hostName(name);
+    SystemConfigIntf::defaultGateway(routingTable.getDefaultGateway());
+
+    this->emit_object_added();
+}
+
+std::string SystemConfiguration::hostName(std::string name)
+{
+    if (SystemConfigIntf::hostName() == name)
+    {
+        return name;
+    }
+    auto method = bus.new_method_call(
+                      HOSTNAMED_SERVICE,
+                      HOSTNAMED_SERVICE_PATH,
+                      HOSTNAMED_INTERFACE,
+                      METHOD_SET);
+
+    method.append(name, true);
+
+    if (!bus.call(method))
+    {
+        log<level::ERR>("Failed to set the hostname");
+        report<InternalFailure>();
+        return SystemConfigIntf::hostName();
+    }
+
+    return SystemConfigIntf::hostName(name);
+}
+
+std::string SystemConfiguration::getHostNameFromSystem() const
+{
+    sdbusplus::message::variant<std::string> name;
+    auto method = bus.new_method_call(
+                      HOSTNAMED_SERVICE,
+                      HOSTNAMED_SERVICE_PATH,
+                      PROPERTY_INTERFACE,
+                      METHOD_GET);
+
+    method.append(HOSTNAMED_INTERFACE, "Hostname");
+
+    auto reply = bus.call(method);
+
+    if (reply)
+    {
+        reply.read(name);
+    }
+    else
+    {
+        log<level::ERR>("Failed to get hostname");
+        report<InternalFailure>();
+        return "";
+    }
+    return name.get<std::string>();
+}
+
+
+std::string SystemConfiguration::defaultGateway(std::string gateway)
+{
+    if (SystemConfigIntf::defaultGateway() == gateway)
+    {
+        return gateway;
+    }
+    auto gw = SystemConfigIntf::defaultGateway(gateway);
+    manager.writeToConfigurationFile();
+    return gw;
+}
+
+}// namespace network
+}// namespace phosphor
diff --git a/system_configuration.hpp b/system_configuration.hpp
new file mode 100644
index 0000000..3ebe647
--- /dev/null
+++ b/system_configuration.hpp
@@ -0,0 +1,75 @@
+#pragma once
+
+#include "xyz/openbmc_project/Network/SystemConfiguration/server.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+
+#include <string>
+
+namespace phosphor
+{
+namespace network
+{
+
+using SystemConfigIntf =
+    sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
+
+using Iface =
+    sdbusplus::server::object::object<SystemConfigIntf>;
+
+class Manager; // forward declaration of network manager.
+
+/** @class SystemConfiguration
+ *  @brief Network system configuration.
+ *  @details A concrete implementation for the
+ *  xyz.openbmc_project.Network.SystemConfiguration DBus API.
+ */
+class SystemConfiguration : public Iface
+{
+    public:
+        SystemConfiguration() = default;
+        SystemConfiguration(const SystemConfiguration&) = delete;
+        SystemConfiguration& operator=(const SystemConfiguration&) = delete;
+        SystemConfiguration(SystemConfiguration&&) = delete;
+        SystemConfiguration& operator=(SystemConfiguration&&) = delete;
+        virtual ~SystemConfiguration() = default;
+
+        /** @brief Constructor to put object onto bus at a dbus path.
+         *  @param[in] bus - Bus to attach to.
+         *  @param[in] objPath - Path to attach at.
+         *  @param[in] parent - Parent object.
+         */
+        SystemConfiguration(sdbusplus::bus::bus& bus,
+                            const std::string& objPath,
+                            Manager& parent);
+
+        /** @brief set the hostname of the system.
+         *  @param[in] name - host name of the system.
+         */
+        std::string hostName(std::string name) override;
+
+        /** @brief set the default gateway of the system.
+         *  @param[in] gateway - default gateway of the system.
+         */
+        std::string defaultGateway(std::string gateway) override;
+
+        using SystemConfigIntf::defaultGateway;
+
+    private:
+
+        /** @brief get the hostname from the system by doing
+         *         dbus call to hostnamed service.
+         */
+        std::string getHostNameFromSystem() const;
+
+        /** @brief Persistent sdbusplus DBus bus connection. */
+        sdbusplus::bus::bus& bus;
+
+        /** @brief Network Manager object. */
+        Manager& manager;
+
+};
+
+} // namespace network
+} // namespace phosphor
