diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
index 84a5998..43c9c88 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
@@ -165,8 +165,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(name, description, mac, enableSnat,
-                internal, external, peerRouter, gateway);
+        return Objects.hash(name, description, mac);
     }
 
     @Override
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
index d59a260..419672f 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
@@ -398,48 +398,41 @@
         }
 
         private void processRouterGatewayNodeChanged(KubevirtRouter router, String disAssociatedGateway) {
-
-            kubevirtRouterService.floatingIps()
-                    .stream()
-                    .filter(fip -> fip.routerName().equals(router.name())).forEach(fip -> {
-                        KubevirtNode oldGw = kubevirtNodeService.node(disAssociatedGateway);
-                        if (oldGw == null) {
-                            return;
-                        }
-
+            kubevirtRouterService.floatingIpsByRouter(router.name())
+                    .forEach(fip -> {
                         KubevirtNode newGw = kubevirtNodeService.node(router.electedGateway());
                         if (newGw == null) {
                             return;
                         }
-
-                        setFloatingIpRulesForFip(router, fip, oldGw, false);
-
                         setFloatingIpRulesForFip(router, fip, newGw, true);
                         processGarpPacketForFloatingIp(fip, newGw);
+                        KubevirtNode oldGw = kubevirtNodeService.node(disAssociatedGateway);
 
-            });
+                        if (oldGw == null) {
+                            return;
+                        }
+                        setFloatingIpRulesForFip(router, fip, oldGw, false);
+                    });
         }
 
         private void processGatewayNodeAttachment(KubevirtRouter router, String gatewayName) {
-            kubevirtRouterService.floatingIps().forEach(fip -> {
-                if (fip.routerName().equals(router.name())) {
-                    KubevirtNode gw = kubevirtNodeService.node(gatewayName);
-                    if (gw != null) {
-                        setFloatingIpRulesForFip(router, fip, gw, true);
-                    }
-                }
-            });
+            kubevirtRouterService.floatingIpsByRouter(router.name())
+                    .forEach(fip -> {
+                        KubevirtNode gw = kubevirtNodeService.node(gatewayName);
+                        if (gw != null) {
+                            setFloatingIpRulesForFip(router, fip, gw, true);
+                        }
+                    });
         }
 
         private void processGatewayNodeDetachment(KubevirtRouter router, String gatewayName) {
-            kubevirtRouterService.floatingIps().forEach(fip -> {
-                if (fip.routerName().equals(router.name())) {
-                    KubevirtNode gw = kubevirtNodeService.node(gatewayName);
-                    if (gw != null) {
-                        setFloatingIpRulesForFip(router, fip, gw, false);
-                    }
-                }
-            });
+            kubevirtRouterService.floatingIpsByRouter(router.name())
+                    .forEach(fip -> {
+                        KubevirtNode gw = kubevirtNodeService.node(gatewayName);
+                        if (gw != null) {
+                            setFloatingIpRulesForFip(router, fip, gw, false);
+                        }
+                    });
         }
 
         private void processFloatingIpAssociation(KubevirtRouter router, KubevirtFloatingIp floatingIp) {
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index b829980..c3ba661 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -1088,6 +1088,8 @@
             if (!isRelevantHelper()) {
                 return;
             }
+            log.info("###### processRouterGatewayNodeAttached called for router {} and new router is {}",
+                    router.name(), associatedGateway);
 
             KubevirtNode gatewayNode = nodeService.node(associatedGateway);
             if (gatewayNode == null) {
@@ -1151,7 +1153,7 @@
                 KubevirtNetwork network = networkService.network(networkName);
 
                 if (network != null) {
-                    initGatewayNodeForInternalNetwork(network, router, oldGatewayNode, true);
+                    initGatewayNodeForInternalNetwork(network, router, newGatewayNode, true);
                 }
             });
         }
@@ -1263,10 +1265,10 @@
                 case KUBEVIRT_NODE_COMPLETE:
                     eventExecutor.execute(() -> processNodeCompletion(event.subject()));
                     break;
+                case KUBEVIRT_NODE_INCOMPLETE:
                 case KUBEVIRT_NODE_REMOVED:
                     eventExecutor.execute(() -> processNodeDeletion(event.subject()));
                     break;
-                case KUBEVIRT_NODE_INCOMPLETE:
                 case KUBEVIRT_NODE_UPDATED:
                 default:
                     // do nothing
@@ -1304,19 +1306,6 @@
                 }
             } else if (node.type().equals(GATEWAY)) {
                 updateGatewayNodeForRouter();
-                for (KubevirtNetwork network : networkService.networks()) {
-                    switch (network.type()) {
-                        case FLAT:
-                        case VLAN:
-                            break;
-                        case VXLAN:
-                        case GRE:
-                        case GENEVE:
-                        default:
-                            // do nothing
-                            break;
-                    }
-                }
             }
         }
 
@@ -1324,22 +1313,20 @@
             if (!isRelevantHelper()) {
                 return;
             }
-
             if (node.type().equals(GATEWAY)) {
+                kubevirtRouterService.routers()
+                        .stream()
+                        .filter(router -> router.electedGateway().equals(node.hostname()))
+                        .forEach(router -> {
+                            router.internal().forEach(networkName -> {
+                                KubevirtNetwork network = networkService.network(networkName);
+
+                                if (network != null) {
+                                    initGatewayNodeForInternalNetwork(network, router, node, false);
+                                }
+                            });
+                        });
                 updateGatewayNodeForRouter();
-                for (KubevirtNetwork network : networkService.networks()) {
-                    switch (network.type()) {
-                        case FLAT:
-                        case VLAN:
-                            break;
-                        case VXLAN:
-                        case GRE:
-                        case GENEVE:
-                        default:
-                            // do nothing
-                            break;
-                    }
-                }
             }
         }
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
index 1e5260b..40f492d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
@@ -235,8 +235,10 @@
                     eventExecutor.execute(() -> processRouterExternalNetAttachedOrGwAttached(event.subject()));
                     break;
                 case KUBEVIRT_ROUTER_REMOVED:
+                    eventExecutor.execute(() -> processRouterRemoved(event.subject()));
+                    break;
                 case KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED:
-                    eventExecutor.execute(() -> processRouterRemovedOrExternalNetDetached(event.subject(),
+                    eventExecutor.execute(() -> processRouterExternalNetDetached(event.subject(),
                             event.externalIp(), event.externalPeerRouterIp()));
                     break;
                 case KUBEVIRT_GATEWAY_NODE_DETACHED:
@@ -273,8 +275,9 @@
             }
         }
 
-        private void processRouterRemovedOrExternalNetDetached(KubevirtRouter router, String routerSnatIp,
-                                                               String peerRouterIp) {
+        private void processRouterExternalNetDetached(KubevirtRouter router, String routerSnatIp,
+                                                      String peerRouterIp) {
+            log.info("processRouterRemovedOrExternalNetDetached called");
             if (!isRelevantHelper()) {
                 return;
             }
@@ -294,13 +297,42 @@
                     IpAddress.valueOf(peerRouterIp), gatewayNode.hostname(), false);
         }
 
+
+        private void processRouterRemoved(KubevirtRouter router) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            if (router.electedGateway() == null) {
+                return;
+            }
+            KubevirtNode gatewayNode = kubevirtNodeService.node(router.electedGateway());
+            if (gatewayNode == null) {
+                return;
+            }
+
+            String routerSnatIp = router.external().keySet().stream().findAny().orElse(null);
+            if (routerSnatIp == null) {
+                return;
+            }
+
+            IpAddress peerRouterIp = router.peerRouter().ipAddress();
+            if (peerRouterIp == null) {
+                return;
+            }
+
+            setRuleArpRequestToController(IpAddress.valueOf(routerSnatIp),
+                    peerRouterIp, gatewayNode.hostname(), false);
+        }
+
         private void processRouterGatewayNodeDetached(KubevirtRouter router, String detachedGatewayNode) {
             if (!isRelevantHelper()) {
                 return;
             }
+
             if (detachedGatewayNode == null) {
                 return;
             }
+
             String routerSnatIp = router.external().keySet().stream().findAny().orElse(null);
             if (routerSnatIp == null) {
                 return;
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
index 2b99937..5e0aa64 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
@@ -675,6 +675,23 @@
             if (!router.external().isEmpty() && router.peerRouter() != null) {
                 initGatewayNodeSnatForRouter(router, router.electedGateway(), false);
             }
+            KubevirtNode gatewayNode = kubevirtNodeService.node(router.electedGateway());
+
+            router.internal()
+                    .stream()
+                    .filter(networkId -> kubevirtNetworkService.network(networkId) != null)
+                    .map(kubevirtNetworkService::network)
+                    .forEach(network -> {
+                        String routerSnatIp = router.external().keySet().stream().findAny().orElse(null);
+                        if (routerSnatIp == null) {
+                            return;
+                        }
+
+                        kubevirtPortService.ports(network.networkId()).forEach(kubevirtPort -> {
+                            setStatefulSnatDownStreamRuleForKubevirtPort(router,
+                                    gatewayNode, kubevirtPort, false);
+                        });
+                    });
         }
 
         private void processRouterUpdate(KubevirtRouter router) {
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
index e7d3613..de45151 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
@@ -51,6 +51,7 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.ovsdb.controller.OvsdbClientService;
 import org.onosproject.ovsdb.controller.OvsdbController;
 import org.osgi.service.component.ComponentContext;
@@ -152,6 +153,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected FlowRuleService flowRuleService;
+
     /** OVSDB server listen port. */
     private int ovsdbPortNum = OVSDB_PORT_NUM_DEFAULT;
 
@@ -459,6 +463,10 @@
             return;
         }
 
+        // purges all the flow rules installed on the node
+        flowRuleService.purgeFlowRules(node.intgBridge());
+        flowRuleService.purgeFlowRules(node.tunBridge());
+
         // unprovision physical interfaces from the node
         // this procedure includes detaching physical port from physical bridge,
         // remove patch ports from br-int, removing physical bridge
