diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/Constants.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/Constants.java
index 06e592c..8bf4ceb 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/Constants.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/Constants.java
@@ -28,4 +28,11 @@
     public static final String DEFAULT_TUNNEL = "vxlan";
     public static final String PATCH_INTG_BRIDGE = "patch-intg";
     public static final String PATCH_ROUT_BRIDGE = "patch-rout";
+    public static final String GATEWAY = "GATEWAY";
+    public static final String HOST_NAME = "hostname";
+    public static final String TYPE = "type";
+    public static final String MANAGEMENT_IP = "managementIp";
+    public static final String DATA_IP = "dataIp";
+    public static final String VLAN_INTF_NAME = "vlanPort";
+    public static final String UPLINK_PORT = "uplinkPort";
 }
\ No newline at end of file
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NodeState.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NodeState.java
index f65901c..f34bdb7 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NodeState.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/NodeState.java
@@ -45,20 +45,6 @@
 
         @Override
         public NodeState nextState() {
-            return PORT_CREATED;
-        }
-    },
-    /**
-     * Indicates required ports are added.
-     */
-    PORT_CREATED {
-        @Override
-        public void process(OpenstackNodeHandler handler, OpenstackNode osNode) {
-            handler.processPortCreatedState(osNode);
-        }
-
-        @Override
-        public NodeState nextState() {
             return COMPLETE;
         }
     },
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
index ca03b86..f1e2bc5 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
@@ -72,13 +72,6 @@
     DeviceId intgBridge();
 
     /**
-     * Returns the router bridge device ID.
-     *
-     * @return device id; null if the node type is compute
-     */
-    DeviceId routerBridge();
-
-    /**
      * Returns the management network IP address of the node.
      *
      * @return ip address
@@ -151,6 +144,13 @@
     MacAddress vlanPortMac();
 
     /**
+     * Returns the uplink port name.
+     *
+     * @return uplink port name; null if the node type is compute
+     */
+    String uplinkPort();
+
+    /**
      * Returns new openstack node instance with given state.
      *
      * @param newState updated state
@@ -195,14 +195,6 @@
         Builder intgBridge(DeviceId intgBridge);
 
         /**
-         * Returns openstack node builder with supplied router bridge ID.
-         *
-         * @param routerBridge router bridge id
-         * @return openstack node builder
-         */
-        Builder routerBridge(DeviceId routerBridge);
-
-        /**
          * Returns openstack node builder with supplied management IP address.
          *
          * @param managementIp management ip address
@@ -227,6 +219,14 @@
         Builder vlanIntf(String vlanIntf);
 
         /**
+         * Returns openstack node builder with supplied uplink port.
+         *
+         * @param uplinkPort uplink port name
+         * @return openstack node builder
+         */
+        Builder uplinkPort(String uplinkPort);
+
+        /**
          * Returns openstack node builder with supplied node state.
          *
          * @param state node state
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeHandler.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeHandler.java
index 0264d17..a421410 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeHandler.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNodeHandler.java
@@ -37,14 +37,6 @@
     void processDeviceCreatedState(OpenstackNode osNode);
 
     /**
-     * Processes the given node for port created state.
-     * It creates gateway groups on compute node.
-     *
-     * @param osNode openstack node
-     */
-    void processPortCreatedState(OpenstackNode osNode);
-
-    /**
      * Processes the given node for complete state.
      * It performs post-init jobs for the complete node.
      *
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
index 75d09cf..3ad60ef 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
@@ -23,17 +23,11 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.Device;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupService;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.openstacknode.api.Constants.*;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VXLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * Checks detailed node init state.
@@ -48,14 +42,11 @@
 
     private static final String MSG_OK = "OK";
     private static final String MSG_NO = "NO";
-    private static final String BUCKET_FORMAT =
-            "   bucket=%s, bytes=%s, packets=%s, actions=%s";
 
     @Override
     protected void execute() {
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
-        GroupService groupService = AbstractShellCommand.get(GroupService.class);
 
         OpenstackNode osNode = osNodeService.node(hostname);
         if (osNode == null) {
@@ -78,7 +69,9 @@
             if (osNode.vlanIntf() != null) {
                 printPortState(deviceService, osNode.intgBridge(), osNode.vlanIntf());
             }
-            printGatewayGroupState(osNodeService, groupService, osNode);
+            if (osNode.type() == OpenstackNode.NodeType.GATEWAY) {
+                printPortState(deviceService, osNode.intgBridge(), osNode.uplinkPort());
+            }
         } else {
             print("%s %s=%s is not available",
                     MSG_NO,
@@ -104,43 +97,4 @@
             print("%s %s does not exist", MSG_NO, portName);
         }
     }
-
-    private void printGatewayGroupState(OpenstackNodeService osNodeService,
-                                        GroupService groupService, OpenstackNode osNode) {
-        if (osNode.type() == GATEWAY) {
-            return;
-        }
-        if (osNodeService.completeNodes(GATEWAY).isEmpty()) {
-            print("N/A No complete state gateway nodes exist");
-            return;
-        }
-        if (osNode.dataIp() != null) {
-            Group osGroup = groupService.getGroup(osNode.intgBridge(),
-                    osNode.gatewayGroupKey(VXLAN));
-            if (osGroup == null || osGroup.state() != Group.GroupState.ADDED) {
-                print("%s VXLAN gateway group does not exist", MSG_NO);
-            } else {
-                print("%s VXLAN group 0x%s added", MSG_OK, Integer.toHexString(osGroup.id().id()));
-                int i = 0;
-                for (GroupBucket bucket : osGroup.buckets().buckets()) {
-                    print(BUCKET_FORMAT, ++i, bucket.bytes(), bucket.packets(),
-                            bucket.treatment().allInstructions());
-                }
-            }
-        }
-        if (osNode.vlanIntf() != null) {
-            Group osGroup = groupService.getGroup(osNode.intgBridge(),
-                    osNode.gatewayGroupKey(VLAN));
-            if (osGroup == null || osGroup.state() != Group.GroupState.ADDED) {
-                print("\n%s VLAN gateway group does not exist", MSG_NO);
-            } else {
-                print("\n%s VLAN group 0x%s added", MSG_OK, Integer.toHexString(osGroup.id().id()));
-                int i = 0;
-                for (GroupBucket bucket : osGroup.buckets().buckets()) {
-                    print(BUCKET_FORMAT, ++i, bucket.bytes(), bucket.packets(),
-                            bucket.treatment().allInstructions());
-                }
-            }
-        }
-    }
 }
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
index f7207df..4d5d900 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
@@ -46,17 +46,17 @@
         if (outputJson()) {
             print("%s", json(osNodes));
         } else {
-            print(FORMAT, "Hostname", "Type", "Integration Bridge", "Router Bridge",
-                    "Management IP", "Data IP", "VLAN Intf", "State");
+            print(FORMAT, "Hostname", "Type", "Integration Bridge",
+                    "Management IP", "Data IP", "VLAN Intf", "Uplink Port", "State");
             for (OpenstackNode osNode : osNodes) {
                 print(FORMAT,
                         osNode.hostname(),
                         osNode.type(),
                         osNode.intgBridge(),
-                        osNode.routerBridge() != null ? osNode.routerBridge() : "",
                         osNode.managementIp(),
                         osNode.dataIp() != null ? osNode.dataIp() : "",
                         osNode.vlanIntf() != null ? osNode.vlanIntf() : "",
+                        osNode.uplinkPort() != null ? osNode.uplinkPort() : "",
                         osNode.state());
             }
             print("Total %s nodes", osNodeService.nodes().size());
@@ -71,12 +71,12 @@
                     .put("hostname", osNode.hostname())
                     .put("type", osNode.type().name())
                     .put("integrationBridge", osNode.intgBridge().toString())
-                    .put("routerBridge", osNode.routerBridge().toString())
                     .put("managementIp", osNode.managementIp().toString())
                     .put("dataIp", osNode.dataIp().toString())
                     .put("vlanIntf", osNode.vlanIntf())
                     .put("tunnelPortNum", osNode.tunnelPortNum().toString())
                     .put("vlanPortNum", osNode.vlanPortNum().toString())
+                    .put("uplinkPort", osNode.uplinkPort())
                     .put("state", osNode.state().name()));
         }
         return result;
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
index f02684a..6650be6 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
@@ -46,27 +46,28 @@
     private final String hostname;
     private final NodeType type;
     private final DeviceId intgBridge;
-    private final DeviceId routerBridge;
     private final IpAddress managementIp;
     private final IpAddress dataIp;
     private final String vlanIntf;
+    private final String uplinkPort;
     private final NodeState state;
 
-    protected DefaultOpenstackNode(String hostname,
-                                 NodeType type,
-                                 DeviceId intgBridge,
-                                 DeviceId routerBridge,
-                                 IpAddress managementIp,
-                                 IpAddress dataIp,
-                                 String vlanIntf,
-                                 NodeState state) {
+    private static final String OVSDB = "ovsdb:";
+
+    protected DefaultOpenstackNode(String hostname, NodeType type,
+                                   DeviceId intgBridge,
+                                   IpAddress managementIp,
+                                   IpAddress dataIp,
+                                   String vlanIntf,
+                                   String uplinkPort,
+                                   NodeState state) {
         this.hostname = hostname;
         this.type = type;
         this.intgBridge = intgBridge;
-        this.routerBridge = routerBridge;
         this.managementIp = managementIp;
         this.dataIp = dataIp;
         this.vlanIntf = vlanIntf;
+        this.uplinkPort = uplinkPort;
         this.state = state;
     }
 
@@ -82,7 +83,7 @@
 
     @Override
     public DeviceId ovsdb() {
-        return DeviceId.deviceId("ovsdb:" + managementIp().toString());
+        return DeviceId.deviceId(OVSDB + managementIp().toString());
     }
 
     @Override
@@ -91,11 +92,6 @@
     }
 
     @Override
-    public DeviceId routerBridge() {
-        return routerBridge;
-    }
-
-    @Override
     public IpAddress managementIp() {
         return managementIp;
     }
@@ -111,6 +107,11 @@
     }
 
     @Override
+    public String uplinkPort() {
+        return uplinkPort;
+    }
+
+    @Override
     public NodeState state() {
         return state;
     }
@@ -187,9 +188,9 @@
             if (Objects.equals(hostname, that.hostname) &&
                     Objects.equals(type, that.type) &&
                     Objects.equals(intgBridge, that.intgBridge) &&
-                    Objects.equals(routerBridge, that.routerBridge) &&
                     Objects.equals(managementIp, that.managementIp) &&
                     Objects.equals(dataIp, that.dataIp) &&
+                    Objects.equals(uplinkPort, that.uplinkPort) &&
                     Objects.equals(vlanIntf, that.vlanIntf)) {
                 return true;
             }
@@ -202,10 +203,10 @@
         return Objects.hash(hostname,
                 type,
                 intgBridge,
-                routerBridge,
                 managementIp,
                 dataIp,
-                vlanIntf);
+                vlanIntf,
+                uplinkPort);
     }
 
     @Override
@@ -214,10 +215,10 @@
                 .add("hostname", hostname)
                 .add("type", type)
                 .add("integrationBridge", intgBridge)
-                .add("routerBridge", routerBridge)
                 .add("managementIp", managementIp)
                 .add("dataIp", dataIp)
                 .add("vlanIntf", vlanIntf)
+                .add("uplinkPort", uplinkPort)
                 .add("state", state)
                 .toString();
     }
@@ -228,10 +229,10 @@
                 .type(type)
                 .hostname(hostname)
                 .intgBridge(intgBridge)
-                .routerBridge(routerBridge)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .vlanIntf(vlanIntf)
+                .uplinkPort(uplinkPort)
                 .state(newState)
                 .build();
     }
@@ -256,10 +257,10 @@
                 .hostname(osNode.hostname())
                 .type(osNode.type())
                 .intgBridge(osNode.intgBridge())
-                .routerBridge(osNode.routerBridge())
                 .managementIp(osNode.managementIp())
                 .dataIp(osNode.dataIp())
                 .vlanIntf(osNode.vlanIntf())
+                .uplinkPort(osNode.uplinkPort())
                 .state(osNode.state());
     }
 
@@ -268,10 +269,10 @@
         private String hostname;
         private NodeType type;
         private DeviceId intgBridge;
-        private DeviceId routerBridge;
         private IpAddress managementIp;
         private IpAddress dataIp;
         private String vlanIntf;
+        private String uplinkPort;
         private NodeState state;
 
         private Builder() {
@@ -285,8 +286,8 @@
             checkArgument(managementIp != null, "Node management IP cannot be null");
             checkArgument(state != null, "Node state cannot be null");
 
-            if (type == NodeType.GATEWAY && routerBridge == null) {
-                throw new IllegalArgumentException("Router bridge is required for gateway node");
+            if (type == NodeType.GATEWAY && uplinkPort == null) {
+                throw new IllegalArgumentException("Uplink port is required for gateway node");
             }
             if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
                 throw new IllegalArgumentException("Either data IP or VLAN interface is required");
@@ -295,10 +296,10 @@
             return new DefaultOpenstackNode(hostname,
                     type,
                     intgBridge,
-                    routerBridge,
                     managementIp,
                     dataIp,
                     vlanIntf,
+                    uplinkPort,
                     state);
         }
 
@@ -323,12 +324,6 @@
         }
 
         @Override
-        public Builder routerBridge(DeviceId routerBridge) {
-            this.routerBridge = routerBridge;
-            return this;
-        }
-
-        @Override
         public Builder managementIp(IpAddress managementIp) {
             this.managementIp = managementIp;
             return this;
@@ -347,6 +342,12 @@
         }
 
         @Override
+        public Builder uplinkPort(String uplinkPort) {
+            this.uplinkPort = uplinkPort;
+            return this;
+        }
+
+        @Override
         public Builder state(NodeState state) {
             this.state = state;
             return this;
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 625d41d..7b8cda1 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -15,9 +15,6 @@
  */
 package org.onosproject.openstacknode.impl;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -42,11 +39,9 @@
 import org.onosproject.net.behaviour.BridgeName;
 import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
-import org.onosproject.net.behaviour.DefaultPatchDescription;
 import org.onosproject.net.behaviour.DefaultTunnelDescription;
 import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
 import org.onosproject.net.behaviour.InterfaceConfig;
-import org.onosproject.net.behaviour.PatchDescription;
 import org.onosproject.net.behaviour.TunnelDescription;
 import org.onosproject.net.behaviour.TunnelEndPoints;
 import org.onosproject.net.behaviour.TunnelKeys;
@@ -54,21 +49,11 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.ExtensionPropertyException;
 import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.group.DefaultGroupDescription;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.group.GroupEvent;
-import org.onosproject.net.group.GroupListener;
-import org.onosproject.net.group.GroupService;
+
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
-import org.onosproject.openstacknode.api.OpenstackNode.NetworkMode;
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
 import org.onosproject.openstacknode.api.OpenstackNodeHandler;
@@ -87,19 +72,13 @@
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.packet.TpPort.tpPort;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
-import static org.onosproject.net.group.DefaultGroupBucket.createSelectGroupBucket;
 import static org.onosproject.openstacknode.api.Constants.*;
-import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
 import static org.onosproject.openstacknode.api.NodeState.*;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VXLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.onosproject.openstacknode.api.OpenstackNodeService.APP_ID;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -137,9 +116,6 @@
     protected OvsdbController ovsdbController;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected GroupService groupService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackNodeService osNodeService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -157,7 +133,6 @@
 
     private final DeviceListener ovsdbListener = new InternalOvsdbListener();
     private final DeviceListener bridgeListener = new InternalBridgeListener();
-    private final GroupListener groupListener = new InternalGroupListener();
     private final OpenstackNodeListener osNodeListener = new InternalOpenstackNodeListener();
 
     private ApplicationId appId;
@@ -170,7 +145,6 @@
 
         componentConfigService.registerProperties(getClass());
         leadershipService.runForLeadership(appId.name());
-        groupService.addListener(groupListener);
         deviceService.addListener(ovsdbListener);
         deviceService.addListener(bridgeListener);
         osNodeService.addListener(osNodeListener);
@@ -183,7 +157,6 @@
         osNodeService.removeListener(osNodeListener);
         deviceService.removeListener(bridgeListener);
         deviceService.removeListener(ovsdbListener);
-        groupService.removeListener(groupListener);
         componentConfigService.unregisterProperties(getClass(), false);
         leadershipService.withdraw(appId.name());
         eventExecutor.shutdown();
@@ -211,64 +184,31 @@
         if (!deviceService.isAvailable(osNode.intgBridge())) {
             createBridge(osNode, INTEGRATION_BRIDGE, osNode.intgBridge());
         }
-        if (osNode.type() == GATEWAY &&
-                !isBridgeCreated(osNode.ovsdb(), ROUTER_BRIDGE)) {
-            createBridge(osNode, ROUTER_BRIDGE, osNode.routerBridge());
-        }
     }
 
     @Override
     public void processDeviceCreatedState(OpenstackNode osNode) {
-        if (!isOvsdbConnected(osNode)) {
-            ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
-            return;
-        }
-        if (osNode.type() == GATEWAY && (
-                !isIntfEnabled(osNode, PATCH_INTG_BRIDGE) ||
-                        !isIntfCreated(osNode, PATCH_ROUT_BRIDGE)
-        )) {
-            createPatchInterface(osNode);
-        }
-        if (osNode.dataIp() != null &&
-                !isIntfEnabled(osNode, DEFAULT_TUNNEL)) {
-            createTunnelInterface(osNode);
-        }
-        if (osNode.vlanIntf() != null &&
-                !isIntfEnabled(osNode, osNode.vlanIntf())) {
-            addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.vlanIntf());
-        }
-    }
+        try {
+            if (!isOvsdbConnected(osNode)) {
+                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
+                return;
+            }
 
-    @Override
-    public void processPortCreatedState(OpenstackNode osNode) {
-        switch (osNode.type()) {
-            case COMPUTE:
-                if (osNode.dataIp() != null) {
-                    addOrUpdateGatewayGroup(osNode,
-                            osNodeService.completeNodes(GATEWAY),
-                            VXLAN);
-                }
-                if (osNode.vlanIntf() != null) {
-                    addOrUpdateGatewayGroup(osNode,
-                            osNodeService.completeNodes(GATEWAY),
-                            VLAN);
-                }
-                break;
-            case GATEWAY:
-                Set<OpenstackNode> gateways =
-                        Sets.newHashSet(osNodeService.completeNodes(GATEWAY));
-                gateways.add(osNode);
-                osNodeService.completeNodes(COMPUTE).forEach(n -> {
-                    if (n.dataIp() != null) {
-                        addOrUpdateGatewayGroup(n, gateways, VXLAN);
-                    }
-                    if (n.vlanIntf() != null) {
-                        addOrUpdateGatewayGroup(n, gateways, VLAN);
-                    }
-                });
-                break;
-            default:
-                break;
+            if (osNode.type() == GATEWAY) {
+                addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.uplinkPort());
+            }
+
+            if (osNode.dataIp() != null &&
+                    !isIntfEnabled(osNode, DEFAULT_TUNNEL)) {
+                createTunnelInterface(osNode);
+            }
+
+            if (osNode.vlanIntf() != null &&
+                    !isIntfEnabled(osNode, osNode.vlanIntf())) {
+                addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.vlanIntf());
+            }
+        } catch (Exception e) {
+            log.error("Exception occured because of {}", e.toString());
         }
     }
 
@@ -283,28 +223,7 @@
 
     @Override
     public void processIncompleteState(OpenstackNode osNode) {
-        if (osNode.type() == COMPUTE) {
-            if (osNode.dataIp() != null) {
-                groupService.removeGroup(osNode.intgBridge(), osNode.gatewayGroupKey(VXLAN), appId);
-            }
-            if (osNode.vlanIntf() != null) {
-                groupService.removeGroup(osNode.intgBridge(), osNode.gatewayGroupKey(VLAN), appId);
-            }
-        }
-        if (osNode.type() == GATEWAY) {
-            osNodeService.completeNodes(COMPUTE).forEach(n -> {
-                if (n.dataIp() != null) {
-                    addOrUpdateGatewayGroup(n,
-                            osNodeService.completeNodes(GATEWAY),
-                            VXLAN);
-                }
-                if (n.vlanIntf() != null) {
-                    addOrUpdateGatewayGroup(n,
-                            osNodeService.completeNodes(GATEWAY),
-                            VLAN);
-                }
-            });
-        }
+        //TODO
     }
 
     private boolean isOvsdbConnected(OpenstackNode osNode) {
@@ -322,22 +241,16 @@
             return;
         }
 
-        // TODO fix this when we use single ONOS cluster for both openstackNode and vRouter
-        Set<IpAddress> controllerIps;
-        if (bridgeName.equals(ROUTER_BRIDGE)) {
-            // TODO checks if empty controller does not break anything
-            controllerIps = ImmutableSet.of();
-        } else {
-            controllerIps = clusterService.getNodes().stream()
+        Set<IpAddress> controllerIps = clusterService.getNodes().stream()
                     .map(ControllerNode::ip)
                     .collect(Collectors.toSet());
-        }
 
         List<ControllerInfo> controllers = controllerIps.stream()
                 .map(ip -> new ControllerInfo(ip, DEFAULT_OFPORT, DEFAULT_OF_PROTO))
                 .collect(Collectors.toList());
 
         String dpid = deviceId.toString().substring(DPID_BEGIN);
+
         BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
                 .name(bridgeName)
                 .failMode(BridgeDescription.FailMode.SECURE)
@@ -382,91 +295,6 @@
         ifaceConfig.addTunnelMode(DEFAULT_TUNNEL, tunnelDesc);
     }
 
-    private void createPatchInterface(OpenstackNode osNode) {
-        checkArgument(osNode.type().equals(OpenstackNode.NodeType.GATEWAY));
-        if (isIntfEnabled(osNode, PATCH_INTG_BRIDGE) &&
-                isIntfCreated(osNode, PATCH_ROUT_BRIDGE)) {
-            return;
-        }
-
-        Device device = deviceService.getDevice(osNode.ovsdb());
-        if (device == null || !device.is(InterfaceConfig.class)) {
-            log.error("Failed to create patch interfaces on {}", osNode.hostname());
-            return;
-        }
-
-        PatchDescription patchIntg = DefaultPatchDescription.builder()
-                .deviceId(INTEGRATION_BRIDGE)
-                .ifaceName(PATCH_INTG_BRIDGE)
-                .peer(PATCH_ROUT_BRIDGE)
-                .build();
-
-        PatchDescription patchRout = DefaultPatchDescription.builder()
-                .deviceId(ROUTER_BRIDGE)
-                .ifaceName(PATCH_ROUT_BRIDGE)
-                .peer(PATCH_INTG_BRIDGE)
-                .build();
-
-        InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
-        ifaceConfig.addPatchMode(PATCH_INTG_BRIDGE, patchIntg);
-        ifaceConfig.addPatchMode(PATCH_ROUT_BRIDGE, patchRout);
-    }
-
-    private void addOrUpdateGatewayGroup(OpenstackNode osNode,
-                                         Set<OpenstackNode> gatewayNodes,
-                                         NetworkMode mode) {
-        GroupBuckets buckets = gatewayGroupBuckets(osNode, gatewayNodes, mode);
-        if (groupService.getGroup(osNode.intgBridge(), osNode.gatewayGroupKey(mode)) == null) {
-            GroupDescription groupDescription = new DefaultGroupDescription(
-                    osNode.intgBridge(),
-                    GroupDescription.Type.SELECT,
-                    buckets,
-                    osNode.gatewayGroupKey(mode),
-                    osNode.gatewayGroupId(mode).id(),
-                    appId);
-            groupService.addGroup(groupDescription);
-            log.debug("Created gateway group for {}", osNode.hostname());
-        } else {
-            groupService.setBucketsForGroup(
-                    osNode.intgBridge(),
-                    osNode.gatewayGroupKey(mode),
-                    buckets,
-                    osNode.gatewayGroupKey(mode),
-                    appId);
-            log.debug("Updated gateway group for {}", osNode.hostname());
-        }
-    }
-
-    private GroupBuckets gatewayGroupBuckets(OpenstackNode osNode,
-                                             Set<OpenstackNode> gatewayNodes,
-                                             NetworkMode mode) {
-        List<GroupBucket> bucketList = Lists.newArrayList();
-        switch (mode) {
-            case VXLAN:
-                gatewayNodes.stream().filter(n -> n.dataIp() != null).forEach(n -> {
-                    TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                            .extension(tunnelDstTreatment(osNode.intgBridge(),
-                                    n.dataIp()),
-                                    osNode.intgBridge())
-                            .setOutput(osNode.tunnelPortNum())
-                            .build();
-                    bucketList.add(createSelectGroupBucket(treatment));
-                });
-                return new GroupBuckets(bucketList);
-            case VLAN:
-                gatewayNodes.stream().filter(n -> n.vlanIntf() != null).forEach(n -> {
-                    TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                            .setEthDst(n.vlanPortMac())
-                            .setOutput(osNode.vlanPortNum())
-                            .build();
-                    bucketList.add(createSelectGroupBucket(treatment));
-                });
-                return new GroupBuckets(bucketList);
-            default:
-                return null;
-        }
-    }
-
     private ExtensionTreatment tunnelDstTreatment(DeviceId deviceId, IpAddress remoteIp) {
         Device device = deviceService.getDevice(deviceId);
         if (device != null && !device.is(ExtensionTreatmentResolver.class)) {
@@ -489,17 +317,6 @@
         }
     }
 
-    private boolean isBridgeCreated(DeviceId ovsdbId, String bridgeName) {
-        Device device = deviceService.getDevice(ovsdbId);
-        if (device == null || !deviceService.isAvailable(device.id()) ||
-                !device.is(BridgeConfig.class)) {
-            return false;
-        }
-        BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
-        return bridgeConfig.getBridges().stream()
-                .anyMatch(bridge -> bridge.name().equals(bridgeName));
-    }
-
     private boolean isIntfEnabled(OpenstackNode osNode, String intf) {
         if (!deviceService.isAvailable(osNode.intgBridge())) {
             return false;
@@ -510,67 +327,12 @@
                         port.isEnabled());
     }
 
-    private boolean isIntfCreated(OpenstackNode osNode, String intf) {
-        Device device = deviceService.getDevice(osNode.ovsdb());
-        if (device == null || !deviceService.isAvailable(osNode.ovsdb()) ||
-                !device.is(BridgeConfig.class)) {
-            return false;
-        }
-
-        BridgeConfig bridgeConfig =  device.as(BridgeConfig.class);
-        return bridgeConfig.getPorts().stream()
-                .anyMatch(port -> port.annotations().value(PORT_NAME).equals(intf));
-    }
-
-    private boolean isGroupCreated(OpenstackNode osNode) {
-        for (OpenstackNode gNode : osNodeService.completeNodes(GATEWAY)) {
-            if (!isGatewayBucketAdded(osNode, gNode)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isGatewayBucketAdded(OpenstackNode cNode, OpenstackNode gNode) {
-        if (cNode.dataIp() != null) {
-            Group osGroup = groupService.getGroup(cNode.intgBridge(),
-                    cNode.gatewayGroupKey(VXLAN));
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .extension(tunnelDstTreatment(gNode.intgBridge(),
-                            gNode.dataIp()),
-                            cNode.intgBridge())
-                    .setOutput(cNode.tunnelPortNum())
-                    .build();
-            GroupBucket bucket = createSelectGroupBucket(treatment);
-            if (osGroup == null || !osGroup.buckets().buckets().contains(bucket)) {
-                return false;
-            }
-        }
-        if (cNode.vlanIntf() != null) {
-            Group osGroup = groupService.getGroup(cNode.intgBridge(),
-                    cNode.gatewayGroupKey(VLAN));
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .setEthDst(gNode.vlanPortMac())
-                    .setOutput(cNode.vlanPortNum())
-                    .build();
-            GroupBucket bucket = createSelectGroupBucket(treatment);
-            if (osGroup == null || !osGroup.buckets().buckets().contains(bucket)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     private boolean isCurrentStateDone(OpenstackNode osNode) {
         switch (osNode.state()) {
             case INIT:
                 if (!deviceService.isAvailable(osNode.intgBridge())) {
                     return false;
                 }
-                if (osNode.type() == GATEWAY &&
-                        !isBridgeCreated(osNode.ovsdb(), ROUTER_BRIDGE)) {
-                    return false;
-                }
                 return true;
             case DEVICE_CREATED:
                 if (osNode.dataIp() != null &&
@@ -581,23 +343,11 @@
                         !isIntfEnabled(osNode, osNode.vlanIntf())) {
                     return false;
                 }
-                if (osNode.type() == GATEWAY && (
-                        !isIntfEnabled(osNode, PATCH_INTG_BRIDGE) ||
-                        !isIntfCreated(osNode, PATCH_ROUT_BRIDGE))) {
+                if (osNode.type() == GATEWAY &&
+                        !isIntfEnabled(osNode, osNode.uplinkPort())) {
                     return false;
                 }
                 return true;
-            case PORT_CREATED:
-                if (osNode.type() == COMPUTE) {
-                    return isGroupCreated(osNode);
-                } else {
-                    for (OpenstackNode cNode : osNodeService.completeNodes(COMPUTE)) {
-                        if (!isGatewayBucketAdded(cNode, osNode)) {
-                            return false;
-                        }
-                    }
-                    return true;
-                }
             case COMPLETE:
                 return false;
             case INCOMPLETE:
@@ -700,9 +450,7 @@
                         if (osNode.state() == DEVICE_CREATED && (
                                 Objects.equals(portName, DEFAULT_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
-                                Objects.equals(portName, PATCH_INTG_BRIDGE) ||
-                                Objects.equals(portName, PATCH_ROUT_BRIDGE))) {
-                            // FIXME we never gets PATCH_ROUTE_BRIDGE port added events as of now
+                                Objects.equals(portName, osNode.uplinkPort()))) {
                             log.debug("Interface {} added to {}", portName, event.subject().id());
                             bootstrapNode(osNode);
                         }
@@ -715,8 +463,7 @@
                         if (osNode.state() == COMPLETE && (
                                 Objects.equals(portName, DEFAULT_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
-                                Objects.equals(portName, PATCH_INTG_BRIDGE) ||
-                                Objects.equals(portName, PATCH_ROUT_BRIDGE))) {
+                                        Objects.equals(portName, osNode.uplinkPort()))) {
                             log.warn("Interface {} removed from {}", portName, event.subject().id());
                             setState(osNode, INCOMPLETE);
                         }
@@ -731,54 +478,6 @@
         }
     }
 
-    private class InternalGroupListener implements GroupListener {
-
-        @Override
-        public boolean isRelevant(GroupEvent event) {
-            NodeId leader = leadershipService.getLeader(appId.name());
-            return Objects.equals(localNode, leader);
-        }
-
-        @Override
-        public void event(GroupEvent event) {
-            switch (event.type()) {
-                case GROUP_ADDED:
-                    eventExecutor.execute(() -> {
-                        log.trace("Group added, ID:{} state:{}", event.subject().id(),
-                                event.subject().state());
-                        processGroup(event.subject());
-                    });
-                    break;
-                case GROUP_UPDATED:
-                    eventExecutor.execute(() -> {
-                        log.trace("Group updated, ID:{} state:{}", event.subject().id(),
-                                event.subject().state());
-                        processGroup(event.subject());
-                    });
-                    break;
-                case GROUP_REMOVED:
-                    // TODO handle group removed
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private void processGroup(Group group) {
-            OpenstackNode osNode = osNodeService.nodes(COMPUTE).stream()
-                    .filter(n -> n.state() == PORT_CREATED &&
-                            (n.gatewayGroupId(VXLAN).equals(group.id()) ||
-                            n.gatewayGroupId(VLAN).equals(group.id())))
-                    .findAny().orElse(null);
-            if (osNode != null) {
-                bootstrapNode(osNode);
-            }
-            osNodeService.nodes(GATEWAY).stream()
-                    .filter(gNode -> gNode.state() == PORT_CREATED)
-                    .forEach(DefaultOpenstackNodeHandler.this::bootstrapNode);
-        }
-    }
-
     private class InternalOpenstackNodeListener implements OpenstackNodeListener {
 
         @Override
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
index 4642dd7..f3ece18 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
@@ -171,8 +171,7 @@
     public OpenstackNode node(DeviceId deviceId) {
         OpenstackNode result = osNodeStore.nodes().stream()
                 .filter(osNode -> Objects.equals(osNode.intgBridge(), deviceId) ||
-                        Objects.equals(osNode.ovsdb(), deviceId) ||
-                        Objects.equals(osNode.routerBridge(), deviceId))
+                        Objects.equals(osNode.ovsdb(), deviceId))
                 .findFirst().orElse(null);
         return result;
     }
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeWebResource.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeWebResource.java
index 9d311b2..3f8936e 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeWebResource.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeWebResource.java
@@ -27,6 +27,13 @@
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.onosproject.openstacknode.impl.DefaultOpenstackNode;
 import org.onosproject.rest.AbstractWebResource;
+import static org.onosproject.openstacknode.api.Constants.GATEWAY;
+import static org.onosproject.openstacknode.api.Constants.HOST_NAME;
+import static org.onosproject.openstacknode.api.Constants.MANAGEMENT_IP;
+import static org.onosproject.openstacknode.api.Constants.DATA_IP;
+import static org.onosproject.openstacknode.api.Constants.VLAN_INTF_NAME;
+import static org.onosproject.openstacknode.api.Constants.UPLINK_PORT;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,16 +64,8 @@
     private static final String UPDATE = "UPDATE";
     private static final String NODE_ID = "NODE_ID";
     private static final String DELETE = "DELETE";
-
-    private static final String HOST_NAME = "hostname";
     private static final String TYPE = "type";
-    private static final String MANAGEMENT_IP = "managementIp";
-    private static final String DATA_IP = "dataIp";
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
-    private static final String VLAN_INTF_NAME = "vlanPort";
-
-    // GATEWAY node specific fields
-    private static final String ROUTER_BRIDGE = "routerBridge";
 
 
     private final OpenstackNodeAdminService osNodeAdminService =
@@ -148,10 +147,7 @@
                      String type = node.get(TYPE).asText();
                      String mIp = node.get(MANAGEMENT_IP).asText();
                      String iBridge = node.get(INTEGRATION_BRIDGE).asText();
-                     String rBridge = null;
-                     if (node.get(ROUTER_BRIDGE) != null) {
-                         rBridge = node.get(ROUTER_BRIDGE).asText();
-                     }
+
                      DefaultOpenstackNode.Builder nodeBuilder = DefaultOpenstackNode.builder()
                              .hostname(hostname)
                              .type(OpenstackNode.NodeType.valueOf(type))
@@ -159,15 +155,15 @@
                              .intgBridge(DeviceId.deviceId(iBridge))
                              .state(NodeState.INIT);
 
+                     if (type.equals(GATEWAY)) {
+                         nodeBuilder.uplinkPort(node.get(UPLINK_PORT).asText());
+                     }
                      if (node.get(VLAN_INTF_NAME) != null) {
                          nodeBuilder.vlanIntf(node.get(VLAN_INTF_NAME).asText());
                      }
                      if (node.get(DATA_IP) != null) {
                          nodeBuilder.dataIp(IpAddress.valueOf(node.get(DATA_IP).asText()));
                      }
-                     if (rBridge != null) {
-                         nodeBuilder.routerBridge(DeviceId.deviceId(rBridge));
-                     }
 
                      log.trace("node is {}", nodeBuilder.build().toString());
                      nodeSet.add(nodeBuilder.build());
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
index b748bb8..a55cb25 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
@@ -40,7 +40,6 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreServiceAdapter;
 import org.onosproject.core.DefaultApplicationId;
-import org.onosproject.core.GroupId;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
@@ -70,14 +69,6 @@
 import org.onosproject.net.flow.instructions.ExtensionPropertyException;
 import org.onosproject.net.flow.instructions.ExtensionTreatment;
 import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
-import org.onosproject.net.group.DefaultGroup;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.group.GroupEvent;
-import org.onosproject.net.group.GroupKey;
-import org.onosproject.net.group.GroupListener;
-import org.onosproject.net.group.GroupService;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -113,7 +104,6 @@
 import static org.onosproject.openstacknode.api.NodeState.DEVICE_CREATED;
 import static org.onosproject.openstacknode.api.NodeState.INCOMPLETE;
 import static org.onosproject.openstacknode.api.NodeState.INIT;
-import static org.onosproject.openstacknode.api.NodeState.PORT_CREATED;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
@@ -145,38 +135,28 @@
     private static final String COMPUTE_1_HOSTNAME = "compute_1";
     private static final String COMPUTE_2_HOSTNAME = "compute_2";
     private static final String COMPUTE_3_HOSTNAME = "compute_3";
-    private static final String COMPUTE_4_HOSTNAME = "compute_4";
     private static final String GATEWAY_1_HOSTNAME = "gateway_1";
     private static final String GATEWAY_2_HOSTNAME = "gateway_2";
     private static final String GATEWAY_3_HOSTNAME = "gateway_3";
-    private static final String GATEWAY_4_HOSTNAME = "gateway_4";
 
     private static final IpAddress COMPUTE_1_IP = IpAddress.valueOf("10.100.0.1");
     private static final IpAddress COMPUTE_2_IP = IpAddress.valueOf("10.100.0.2");
     private static final IpAddress COMPUTE_3_IP = IpAddress.valueOf("10.100.0.3");
-    private static final IpAddress COMPUTE_4_IP = IpAddress.valueOf("10.100.0.4");
     private static final IpAddress GATEWAY_1_IP = IpAddress.valueOf("10.100.0.5");
     private static final IpAddress GATEWAY_2_IP = IpAddress.valueOf("10.100.0.6");
     private static final IpAddress GATEWAY_3_IP = IpAddress.valueOf("10.100.0.7");
-    private static final IpAddress GATEWAY_4_IP = IpAddress.valueOf("10.100.0.8");
+
+    private static final String GATEWAY_UPLINK_PORT = "eth0";
 
     private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
     private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
     private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
-    private static final Device COMPUTE_4_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
-    private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
-    private static final Device GATEWAY_1_ROUT_DEVICE = createOpenFlowDevice(6, ROUTER_BRIDGE);
-    private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(7, INTEGRATION_BRIDGE);
-    private static final Device GATEWAY_2_ROUT_DEVICE = createOpenFlowDevice(8, ROUTER_BRIDGE);
-    private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(9, INTEGRATION_BRIDGE);
-    private static final Device GATEWAY_3_ROUT_DEVICE = createOpenFlowDevice(10, ROUTER_BRIDGE);
-    private static final Device GATEWAY_4_INTG_DEVICE = createOpenFlowDevice(11, INTEGRATION_BRIDGE);
-    private static final Device GATEWAY_4_ROUT_DEVICE = createOpenFlowDevice(12, ROUTER_BRIDGE);
+    private static final Device GATEWAY_1_INTG_DEVICE = createOpenFlowDevice(4, INTEGRATION_BRIDGE);
+    private static final Device GATEWAY_2_INTG_DEVICE = createOpenFlowDevice(5, INTEGRATION_BRIDGE);
+    private static final Device GATEWAY_3_INTG_DEVICE = createOpenFlowDevice(6, INTEGRATION_BRIDGE);
 
     private static final Device COMPUTE_1_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_1_IP);
     private static final Device COMPUTE_2_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_2_IP);
-    private static final Device COMPUTE_3_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_3_IP);
-    private static final Device COMPUTE_4_OVSDB_DEVICE = createOvsdbDevice(COMPUTE_4_IP);
     private static final Device GATEWAY_1_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_1_IP);
     private static final Device GATEWAY_2_OVSDB_DEVICE = createOvsdbDevice(GATEWAY_2_IP);
 
@@ -201,14 +181,6 @@
             COMPUTE,
             COMPUTE_3_INTG_DEVICE,
             COMPUTE_3_IP,
-            PORT_CREATED
-    );
-
-    private static final OpenstackNode COMPUTE_4 = createNode(
-            COMPUTE_4_HOSTNAME,
-            COMPUTE,
-            COMPUTE_4_INTG_DEVICE,
-            COMPUTE_4_IP,
             COMPLETE
     );
 
@@ -216,8 +188,8 @@
             GATEWAY_1_HOSTNAME,
             GATEWAY,
             GATEWAY_1_INTG_DEVICE,
-            GATEWAY_1_ROUT_DEVICE,
             GATEWAY_1_IP,
+            GATEWAY_UPLINK_PORT,
             INIT
     );
 
@@ -225,8 +197,8 @@
             GATEWAY_2_HOSTNAME,
             GATEWAY,
             GATEWAY_2_INTG_DEVICE,
-            GATEWAY_2_ROUT_DEVICE,
             GATEWAY_2_IP,
+            GATEWAY_UPLINK_PORT,
             DEVICE_CREATED
     );
 
@@ -234,17 +206,8 @@
             GATEWAY_3_HOSTNAME,
             GATEWAY,
             GATEWAY_3_INTG_DEVICE,
-            GATEWAY_3_ROUT_DEVICE,
             GATEWAY_3_IP,
-            PORT_CREATED
-    );
-
-    private static final OpenstackNode GATEWAY_4 = createNode(
-            GATEWAY_4_HOSTNAME,
-            GATEWAY,
-            GATEWAY_4_INTG_DEVICE,
-            GATEWAY_4_ROUT_DEVICE,
-            GATEWAY_4_IP,
+            GATEWAY_UPLINK_PORT,
             COMPLETE
     );
 
@@ -280,7 +243,6 @@
         target.deviceService = TEST_DEVICE_SERVICE;
         target.deviceAdminService = mockDeviceAdminService;
         target.ovsdbController = mockOvsdbController;
-        target.groupService = new TestGroupService();
         target.osNodeService = testNodeManager;
         target.osNodeAdminService = testNodeManager;
         target.componentConfigService = new TestComponentConfigService();
@@ -341,7 +303,7 @@
         assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
                 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
         target.processDeviceCreatedState(COMPUTE_2);
-        assertEquals(ERR_STATE_NOT_MATCH, PORT_CREATED,
+        assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
                 testNodeManager.node(COMPUTE_2_HOSTNAME).state());
     }
 
@@ -354,69 +316,28 @@
         testNodeManager.createNode(GATEWAY_2);
         TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_OVSDB_DEVICE.id(), GATEWAY_2_OVSDB_DEVICE);
         TEST_DEVICE_SERVICE.devMap.put(GATEWAY_2_INTG_DEVICE.id(), GATEWAY_2_INTG_DEVICE);
+        TEST_DEVICE_SERVICE.portList.add(createPort(GATEWAY_2_INTG_DEVICE, GATEWAY_UPLINK_PORT));
 
         assertEquals(ERR_STATE_NOT_MATCH, DEVICE_CREATED,
                 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
         target.processDeviceCreatedState(GATEWAY_2);
-        assertEquals(ERR_STATE_NOT_MATCH, PORT_CREATED,
+        assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
                 testNodeManager.node(GATEWAY_2_HOSTNAME).state());
     }
 
     /**
-     * Checks if the compute node state changes from PORT_CREATED to
-     * COMPLETE after processing PORT_CREATED state.
-     */
-    @Test
-    public void testComputeNodeProcessPortCreatedState() {
-        testNodeManager.createNode(COMPUTE_3);
-        TEST_DEVICE_SERVICE.devMap.put(COMPUTE_3_OVSDB_DEVICE.id(), COMPUTE_3_OVSDB_DEVICE);
-        TEST_DEVICE_SERVICE.devMap.put(COMPUTE_3_INTG_DEVICE.id(), COMPUTE_3_INTG_DEVICE);
-        TEST_DEVICE_SERVICE.portList.add(createPort(COMPUTE_3_INTG_DEVICE, DEFAULT_TUNNEL));
-
-        testNodeManager.createNode(GATEWAY_4);
-        TEST_DEVICE_SERVICE.devMap.put(GATEWAY_4_INTG_DEVICE.id(), GATEWAY_4_INTG_DEVICE);
-
-        assertEquals(ERR_STATE_NOT_MATCH, PORT_CREATED,
-                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
-        target.processPortCreatedState(COMPUTE_3);
-        assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
-                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
-    }
-
-    /**
-     * Checks if the gateway node state changes from PORT_CREATED to
-     * COMPLETE after processing PORT_CREATED state.
-     */
-    @Test
-    public void testGatewayNodeProcessPortCreatedState() {
-        testNodeManager.createNode(COMPUTE_4);
-        TEST_DEVICE_SERVICE.devMap.put(COMPUTE_4_OVSDB_DEVICE.id(), COMPUTE_4_OVSDB_DEVICE);
-        TEST_DEVICE_SERVICE.devMap.put(COMPUTE_4_INTG_DEVICE.id(), COMPUTE_4_INTG_DEVICE);
-        TEST_DEVICE_SERVICE.portList.add(createPort(COMPUTE_4_INTG_DEVICE, DEFAULT_TUNNEL));
-
-        testNodeManager.createNode(GATEWAY_3);
-        TEST_DEVICE_SERVICE.devMap.put(GATEWAY_3_INTG_DEVICE.id(), GATEWAY_4_INTG_DEVICE);
-
-        assertEquals(ERR_STATE_NOT_MATCH, PORT_CREATED,
-                testNodeManager.node(GATEWAY_3_HOSTNAME).state());
-        target.processPortCreatedState(GATEWAY_3);
-        assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
-                testNodeManager.node(GATEWAY_3_HOSTNAME).state());
-    }
-
-    /**
      * Checks if the compute node state changes from COMPLETE to INCOMPLETE
      * when integration bridge is disconnected.
      */
     @Test
     public void testBackToIncompleteWhenBrIntDisconnected() {
-        testNodeManager.createNode(COMPUTE_4);
+        testNodeManager.createNode(COMPUTE_3);
 
         assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
-                testNodeManager.node(COMPUTE_4_HOSTNAME).state());
-        TEST_DEVICE_SERVICE.removeDevice(COMPUTE_4_INTG_DEVICE);
+                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
+        TEST_DEVICE_SERVICE.removeDevice(COMPUTE_3_INTG_DEVICE);
         assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
-                testNodeManager.node(COMPUTE_4_HOSTNAME).state());
+                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
     }
 
     /**
@@ -425,14 +346,14 @@
      */
     @Test
     public void testBackToIncompleteWhenVxlanRemoved() {
-        testNodeManager.createNode(COMPUTE_4);
+        testNodeManager.createNode(COMPUTE_3);
 
         assertEquals(ERR_STATE_NOT_MATCH, COMPLETE,
-                testNodeManager.node(COMPUTE_4_HOSTNAME).state());
-        TEST_DEVICE_SERVICE.removePort(COMPUTE_4_INTG_DEVICE, createPort(
-                COMPUTE_4_INTG_DEVICE, DEFAULT_TUNNEL));
+                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
+        TEST_DEVICE_SERVICE.removePort(COMPUTE_3_INTG_DEVICE, createPort(
+                COMPUTE_3_INTG_DEVICE, DEFAULT_TUNNEL));
         assertEquals(ERR_STATE_NOT_MATCH, INCOMPLETE,
-                testNodeManager.node(COMPUTE_4_HOSTNAME).state());
+                testNodeManager.node(COMPUTE_3_HOSTNAME).state());
 
     }
 
@@ -474,26 +395,24 @@
                 hostname,
                 type,
                 intgBridge.id(),
-                null,
                 ipAddr,
                 ipAddr,
-                null, state);
+                null, null, state);
     }
 
     private static OpenstackNode createNode(String hostname,
                                             OpenstackNode.NodeType type,
                                             Device intgBridge,
-                                            Device routerBridge,
                                             IpAddress ipAddr,
+                                            String uplinkPort,
                                             NodeState state) {
         return new TestOpenstackNode(
                 hostname,
                 type,
                 intgBridge.id(),
-                routerBridge.id(),
                 ipAddr,
                 ipAddr,
-                null, state);
+                null, uplinkPort, state);
     }
 
     private static final class TestDevice extends DefaultDevice {
@@ -546,18 +465,18 @@
         private TestOpenstackNode(String hostname,
                                   NodeType type,
                                   DeviceId intgBridge,
-                                  DeviceId routerBridge,
                                   IpAddress managementIp,
                                   IpAddress dataIp,
                                   String vlanIntf,
+                                  String uplinkPort,
                                   NodeState state) {
             super(hostname,
                     type,
                     intgBridge,
-                    routerBridge,
                     managementIp,
                     dataIp,
                     vlanIntf,
+                    uplinkPort,
                     state);
         }
 
@@ -572,11 +491,6 @@
         }
 
         @Override
-        public PortNumber patchPortNum() {
-            return PortNumber.portNumber(1);
-        }
-
-        @Override
         public MacAddress vlanPortMac() {
             return MacAddress.NONE;
         }
@@ -621,8 +535,7 @@
         public OpenstackNode node(DeviceId deviceId) {
             return osNodeMap.values().stream()
                     .filter(osNode -> Objects.equals(osNode.intgBridge(), deviceId) ||
-                            Objects.equals(osNode.ovsdb(), deviceId) ||
-                            Objects.equals(osNode.routerBridge(), deviceId))
+                            Objects.equals(osNode.ovsdb(), deviceId))
                     .findFirst().orElse(null);
         }
 
@@ -885,81 +798,6 @@
         }
     }
 
-    private static class TestGroupService implements GroupService {
-        Map<GroupKey, Group> groupMap = Maps.newHashMap();
-        Map<GroupKey, GroupBuckets> groupBucketsMap = Maps.newHashMap();
-        List<GroupListener> listeners = Lists.newArrayList();
-
-        @Override
-        public void addListener(GroupListener listener) {
-            listeners.add(listener);
-        }
-
-        @Override
-        public void removeListener(GroupListener listener) {
-            listeners.remove(listener);
-        }
-
-        @Override
-        public void addGroup(GroupDescription groupDesc) {
-            DefaultGroup group = new DefaultGroup(GroupId.valueOf(groupDesc.givenGroupId()), groupDesc);
-            group.setState(Group.GroupState.ADDED);
-            groupMap.put(groupDesc.appCookie(), group);
-            groupBucketsMap.put(groupDesc.appCookie(), groupDesc.buckets());
-
-            GroupEvent event = new GroupEvent(GroupEvent.Type.GROUP_ADDED, group);
-            listeners.stream().filter(listener -> listener.isRelevant(event))
-                    .forEach(listener -> listener.event(event));
-        }
-
-        @Override
-        public Group getGroup(DeviceId deviceId, GroupKey appCookie) {
-            return groupMap.get(appCookie);
-        }
-
-        @Override
-        public void addBucketsToGroup(DeviceId deviceId, GroupKey oldCookie, GroupBuckets buckets,
-                                      GroupKey newCookie, ApplicationId appId) {
-
-        }
-
-        @Override
-        public void removeBucketsFromGroup(DeviceId deviceId, GroupKey oldCookie, GroupBuckets buckets,
-                                           GroupKey newCookie, ApplicationId appId) {
-
-        }
-
-        @Override
-        public void purgeGroupEntries(DeviceId deviceId) {
-
-        }
-
-        @Override
-        public void removeGroup(DeviceId deviceId, GroupKey appCookie, ApplicationId appId) {
-
-        }
-
-        @Override
-        public Iterable<Group> getGroups(DeviceId deviceId, ApplicationId appId) {
-            return null;
-        }
-
-        @Override
-        public Iterable<Group> getGroups(DeviceId deviceId) {
-            return null;
-        }
-
-        @Override
-        public void setBucketsForGroup(DeviceId deviceId, GroupKey oldCookie, GroupBuckets buckets,
-                                       GroupKey newCookie, ApplicationId appId) {
-            groupBucketsMap.put(newCookie, buckets);
-            GroupEvent event = new GroupEvent(GroupEvent.Type.GROUP_UPDATED, groupMap.get(newCookie));
-            listeners.stream().filter(listener -> listener.isRelevant(event))
-                    .forEach(listener -> listener.event(event));
-        }
-
-    }
-
     private static class TestExtensionTreatment implements ExtensionTreatment {
         Ip4Address tunnelDst;
 
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java
index b881dff..47ce53d 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeTest.java
@@ -133,20 +133,4 @@
                 .state(NodeState.INIT)
                 .build();
     }
-
-    /**
-     * Checks building a gateway type node without router bridge ID
-     * fails with proper exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testGatewayWithoutRouterBridgeId() {
-        DefaultOpenstackNode.builder()
-                .hostname(HOSTNAME_1)
-                .type(OpenstackNode.NodeType.GATEWAY)
-                .intgBridge(DEVICE_1.id())
-                .managementIp(TEST_IP)
-                .dataIp(TEST_IP)
-                .state(NodeState.INIT)
-                .build();
-    }
 }
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
index 28cdfde..df9ae73 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
@@ -64,11 +64,12 @@
     private static final String COMPUTE_3_HOSTNAME = "compute_3";
     private static final String GATEWAY_1_HOSTNAME = "gateway_1";
 
+    private static final String GATEWAY_1_UPLINKPORT = "eth0";
+
     private static final Device COMPUTE_1_INTG_DEVICE = createDevice(1);
     private static final Device COMPUTE_2_INTG_DEVICE = createDevice(2);
     private static final Device COMPUTE_3_INTG_DEVICE = createDevice(3);
     private static final Device GATEWAY_1_INTG_DEVICE = createDevice(4);
-    private static final Device GATEWAY_1_ROUT_DEVICE = createDevice(5);
 
     private static final OpenstackNode COMPUTE_1 = createNode(
             COMPUTE_1_HOSTNAME,
@@ -95,8 +96,8 @@
             GATEWAY_1_HOSTNAME,
             OpenstackNode.NodeType.GATEWAY,
             GATEWAY_1_INTG_DEVICE,
-            GATEWAY_1_ROUT_DEVICE,
             IpAddress.valueOf("10.100.0.4"),
+            GATEWAY_1_UPLINKPORT,
             NodeState.COMPLETE
     );
 
@@ -288,8 +289,6 @@
                 target.node(GATEWAY_1_INTG_DEVICE.id()), GATEWAY_1));
         assertTrue(ERR_NOT_FOUND, Objects.equals(
                 target.node(GATEWAY_1.ovsdb()), GATEWAY_1));
-        assertTrue(ERR_NOT_FOUND, Objects.equals(
-                target.node(GATEWAY_1.routerBridge()), GATEWAY_1));
     }
 
     private void validateEvents(Enum... types) {
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java
index 53bd593..fbec333 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeTest.java
@@ -57,15 +57,15 @@
     }
 
     protected static OpenstackNode createNode(String hostname, NodeType type,
-                                              Device intgBridge, Device routerBridge,
-                                              IpAddress ipAddr, NodeState state) {
+                                              Device intgBridge, IpAddress ipAddr,
+                                              String uplinkPort, NodeState state) {
         return org.onosproject.openstacknode.impl.DefaultOpenstackNode.builder()
                 .hostname(hostname)
                 .type(type)
                 .intgBridge(intgBridge.id())
-                .routerBridge(routerBridge.id())
                 .managementIp(ipAddr)
                 .dataIp(ipAddr)
+                .uplinkPort(uplinkPort)
                 .state(state)
                 .build();
     }
diff --git a/apps/openstacknode/network-cfg.json b/apps/openstacknode/network-cfg.json
index 6cca7ed..a9918d9 100644
--- a/apps/openstacknode/network-cfg.json
+++ b/apps/openstacknode/network-cfg.json
@@ -26,9 +26,7 @@
                                 "dataIp" : "172.16.130.7",
                                 "vlanPort" : "eth2",
                                 "integrationBridge" : "of:00000000000000a3",
-                                "routerBridge" : "of:00000000000000b1",
-                                "uplinkPort" : "quagga-router",
-                                "routerController" : "172.17.0.2"
+                                "uplinkPort" : "ens6"
 
                         }
                 ]
