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();
     }
