diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
index 3294a09..f837546 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
@@ -16,51 +16,196 @@
 
 package org.onosproject.scalablegateway.impl;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+
 import org.onosproject.core.GroupId;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.SubjectFactories;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.scalablegateway.api.GatewayNode;
+import org.onosproject.scalablegateway.api.GatewayNodeConfig;
 import org.onosproject.scalablegateway.api.ScalableGatewayService;
 
 import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Manages gateway node for gateway scalability.
  */
+
+@Service
+@Component(immediate = true)
 public class ScalableGatewayManager implements ScalableGatewayService {
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private ApplicationId appId;
+    private static final String APP_ID = "org.onosproject.scalablegateway";
+    private static final String APP_NAME = "scalablegateway";
+    private static final String GATEWAYNODE_CAN_NOT_BE_NULL = "The gateway node can not be null";
+    private static final String PORT_CAN_NOT_BE_NULL = "The port can not be null";
+    private static final String FAIL_ADD_GATEWAY = "Adding process is failed as existing deivce id";
+    private static final String FAIL_REMOVE_GATEWAY = "Removing process is failed as unknown deivce id";
+    private static final String PORT_NAME = "portName";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService configService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry configRegistry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    private GatewayNodeConfig config;
+
+    private final NetworkConfigListener configListener = new InternalConfigListener();
+
+    private final ConfigFactory configFactory =
+            new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, GatewayNodeConfig.class, APP_NAME) {
+                @Override
+                public GatewayNodeConfig createConfig() {
+                    return new GatewayNodeConfig();
+                }
+            };
+    private Map<DeviceId, GatewayNode> gatewayNodeMap = Maps.newHashMap(); // Map<GatewayNode`s Id, GatewayNode object>
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(APP_ID);
+        configRegistry.registerConfigFactory(configFactory);
+        configService.addListener(configListener);
+
+        readConfiguration();
+
+        log.info("started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        gatewayNodeMap.clear();
+
+        configService.removeListener(configListener);
+
+        log.info("stopped");
+    }
 
     @Override
     public GatewayNode getGatewayNode(DeviceId deviceId) {
-        return null;
+        return checkNotNull(gatewayNodeMap.get(deviceId), GATEWAYNODE_CAN_NOT_BE_NULL);
     }
 
     @Override
     public List<PortNumber> getGatewayExternalPorts(DeviceId deviceId) {
-        return null;
+        GatewayNode gatewayNode = checkNotNull(gatewayNodeMap.get(deviceId), GATEWAYNODE_CAN_NOT_BE_NULL);
+        List<PortNumber> portNumbers = Lists.newArrayList();
+        gatewayNode.getGatewayExternalInterfaceNames()
+                .stream()
+                .forEach(name -> portNumbers.add(findPortNumFromPortName(gatewayNode.getGatewayDeviceId(), name)));
+        return portNumbers;
+    }
+
+    private PortNumber findPortNumFromPortName(DeviceId gatewayDeviceId, String name) {
+        Port port = deviceService.getPorts(gatewayDeviceId)
+                .stream()
+                .filter(p -> p.annotations().value(PORT_NAME).equals(name))
+                .iterator()
+                .next();
+        return checkNotNull(port, PORT_CAN_NOT_BE_NULL).number();
+
     }
 
     @Override
     public GroupId getGroupIdForGatewayLoadBalance(DeviceId srcDeviceId) {
+        //TODO: Implement group generation method by handler
         return null;
     }
 
     @Override
     public List<GatewayNode> getGatewayNodes() {
-        return null;
+        List<GatewayNode> gatewayNodeList = Lists.newArrayList();
+        gatewayNodeMap.values()
+                .stream()
+                .forEach(gatewayNode -> gatewayNodeList.add(gatewayNode));
+        return gatewayNodeList;
+
     }
 
     @Override
     public List<DeviceId> getGatewayDeviceIds() {
-        return null;
+        List<DeviceId> deviceIdList = Lists.newArrayList();
+        gatewayNodeMap.values()
+                .stream()
+                .forEach(gatewayNode -> deviceIdList.add(gatewayNode.getGatewayDeviceId()));
+        return deviceIdList;
+
     }
 
     @Override
     public boolean addGatewayNode(GatewayNode gatewayNode) {
-        return false;
+        gatewayNodeMap.putIfAbsent(gatewayNode.getGatewayDeviceId(), gatewayNode);
+        return true;
     }
 
     @Override
     public boolean deleteGatewayNode(GatewayNode gatewayNode) {
-        return false;
+        return gatewayNodeMap.remove(gatewayNode.getGatewayDeviceId(), gatewayNode);
+    }
+
+    private class InternalConfigListener implements NetworkConfigListener {
+        @Override
+        public void event(NetworkConfigEvent event) {
+            if (!event.configClass().equals(GatewayNodeConfig.class)) {
+                return;
+            }
+            switch (event.type()) {
+                case CONFIG_UPDATED:
+                    gatewayNodeMap.clear();
+                    readConfiguration();
+                    break;
+                case CONFIG_ADDED:
+                    readConfiguration();
+                    break;
+                default:
+                    log.debug("Unsupportable event type is occurred");
+                    break;
+            }
+        }
+    }
+
+    private void readConfiguration() {
+        config = configService.getConfig(appId, GatewayNodeConfig.class);
+        if (config == null) {
+            log.error("No configuration found");
+            return;
+        }
+
+        config.gatewayNodes().forEach(gatewayNode -> addGatewayNode(gatewayNode));
+
+        log.info("ScalableGateway configured");
     }
 }
