diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
index 350655f..214cfe7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
@@ -21,9 +21,10 @@
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
-import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 import static java.lang.Thread.sleep;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * Re-installs flow rules for OpenStack networking.
@@ -39,28 +40,37 @@
     protected void doExecute() {
         // All handlers in this application reacts the node complete event and
         // tries to re-configure flow rules for the complete node.
-        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
-        OpenstackNodeAdminService osNodeAdminService = AbstractShellCommand.get(OpenstackNodeAdminService.class);
+        OpenstackNodeAdminService osNodeService = AbstractShellCommand.get(OpenstackNodeAdminService.class);
         if (osNodeService == null) {
             error("Failed to re-install flow rules for OpenStack networking.");
             return;
         }
-        osNodeService.completeNodes().forEach(osNode -> {
-            OpenstackNode updated = osNode.updateState(NodeState.INIT);
-            osNodeAdminService.updateNode(updated);
 
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
+        // we first initialize the COMPUTE node, in order to feed all instance ports
+        // by referring to ports' information obtained from neutron server
+        osNodeService.completeNodes(COMPUTE).forEach(osNode ->
+                syncRulesBaseForNode(osNodeService, osNode));
+        osNodeService.completeNodes(GATEWAY).forEach(osNode ->
+                syncRulesBaseForNode(osNodeService, osNode));
 
-            if (osNodeService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
-                print("Finished sync rules for node %s", osNode.hostname());
-            } else {
-                error("Failed to sync rules for node %s", osNode.hostname());
-            }
-        });
         print("Successfully requested re-installing flow rules.");
     }
+
+    private void syncRulesBaseForNode(OpenstackNodeAdminService osNodeService,
+                                      OpenstackNode osNode) {
+        OpenstackNode updated = osNode.updateState(NodeState.INIT);
+        osNodeService.updateNode(updated);
+
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during node synchronization...");
+        }
+
+        if (osNodeService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
+            print("Finished sync rules for node %s", osNode.hostname());
+        } else {
+            error("Failed to sync rules for node %s", osNode.hostname());
+        }
+    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
index 8b335e6..94470eb 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
@@ -54,8 +54,13 @@
 
 import static java.lang.Thread.sleep;
 import static org.onlab.util.Tools.nullIsIllegal;
-import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.*;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkActivationFlag;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * REST interface for synchronizing openstack network states and rules.
@@ -317,22 +322,27 @@
     }
 
     private void syncRulesBase() {
-        osNodeAdminService.completeNodes().forEach(osNode -> {
-            OpenstackNode updated = osNode.updateState(NodeState.INIT);
-            osNodeAdminService.updateNode(updated);
+        // we first initialize the COMPUTE node, in order to feed all instance ports
+        // by referring to ports' information obtained from neutron server
+        osNodeAdminService.completeNodes(COMPUTE).forEach(this::syncRulesBaseForNode);
+        osNodeAdminService.completeNodes(GATEWAY).forEach(this::syncRulesBaseForNode);
+    }
 
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
+    private void syncRulesBaseForNode(OpenstackNode osNode) {
+        OpenstackNode updated = osNode.updateState(NodeState.INIT);
+        osNodeAdminService.updateNode(updated);
 
-            if (osNodeAdminService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
-                log.info("Finished sync rules for node {}", osNode.hostname());
-            } else {
-                log.info("Failed to sync rules for node {}", osNode.hostname());
-            }
-        });
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during node synchronization...");
+        }
+
+        if (osNodeAdminService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
+            log.info("Finished sync rules for node {}", osNode.hostname());
+        } else {
+            log.info("Failed to sync rules for node {}", osNode.hostname());
+        }
     }
 
     private void purgeRulesBase() {
