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 726abf2..26e27ff 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
@@ -297,7 +297,6 @@
                 install);
     }
 
-
     private void setFloatingIpDownstreamRulesToGatewayTunBridge(KubevirtRouter router,
                                                                 KubevirtFloatingIp floatingIp,
                                                                 KubevirtNetwork network,
@@ -316,6 +315,7 @@
             log.warn("Failed to install floating Ip rules for floating ip {} " +
                     "because fail to fine the worker node that the associated port is running on",
                     floatingIp.floatingIp());
+            return;
         }
 
         PortNumber tunnelPortNumber = tunnelPort(electedGw, network);
@@ -323,7 +323,6 @@
             return;
         }
 
-
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32))
@@ -357,15 +356,6 @@
         @Override
         public void event(KubevirtRouterEvent event) {
             switch (event.type()) {
-                case KUBEVIRT_ROUTER_CREATED:
-                    eventExecutor.execute(() -> processRouterCreation(event.subject()));
-                    break;
-                case KUBEVIRT_ROUTER_UPDATED:
-                    eventExecutor.execute(() -> processRouterUpdate(event.subject()));
-                    break;
-                case KUBEVIRT_ROUTER_REMOVED:
-                    eventExecutor.execute(() -> processRouterDeletion(event.subject()));
-                    break;
                 case KUBEVIRT_FLOATING_IP_ASSOCIATED:
                     eventExecutor.execute(() -> processFloatingIpAssociation(event.subject(),
                             event.floatingIp()));
@@ -381,42 +371,6 @@
             }
         }
 
-        private void processRouterCreation(KubevirtRouter router) {
-            if (!isRelevantHelper()) {
-                return;
-            }
-            kubevirtRouterService.floatingIpsByRouter(router.name())
-                    .stream()
-                    .filter(fip -> fip.fixedIp() != null)
-                    .forEach(fip -> {
-                        processFloatingIpAssociation(router, fip);
-                    });
-        }
-
-        private void processRouterDeletion(KubevirtRouter router) {
-            if (!isRelevantHelper()) {
-                return;
-            }
-            kubevirtRouterService.floatingIpsByRouter(router.name())
-                    .stream()
-                    .filter(fip -> fip.fixedIp() != null)
-                    .forEach(fip -> {
-                        processFloatingIpDisassociation(router, fip);
-                    });
-        }
-
-        private void processRouterUpdate(KubevirtRouter router) {
-            if (!isRelevantHelper()) {
-                return;
-            }
-            kubevirtRouterService.floatingIpsByRouter(router.name())
-                    .stream()
-                    .filter(fip -> fip.fixedIp() != null)
-                    .forEach(fip -> {
-                        processFloatingIpAssociation(router, fip);
-                    });
-        }
-
         private void processFloatingIpAssociation(KubevirtRouter router, KubevirtFloatingIp floatingIp) {
             if (!isRelevantHelper()) {
                 return;
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index e061495..94a7883 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -42,6 +42,7 @@
 import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeService;
+import org.onosproject.kubevirtnode.api.KubevirtPhyInterface;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
@@ -471,14 +472,6 @@
     }
 
     /**
-     * Returns the mac address of the br-int port of specified device.
-     *
-     * @param deviceService device service
-     * @param deviceId      device Id
-     * @return mac address of the br-int port
-     */
-
-    /**
      * Returns the mac address of the router.
      *
      * @param router kubevirt router
@@ -553,13 +546,20 @@
      * Returns the external patch port number with specified gateway.
      *
      * @param deviceService device service
-     * @param gatewayNode gateawy node
+     * @param gatewayNode gateway node
      * @return external patch port number
      */
     public static PortNumber externalPatchPortNum(DeviceService deviceService, KubevirtNode gatewayNode) {
+        KubevirtPhyInterface intf = gatewayNode.phyIntfs().stream().findFirst().orElse(null);
+        if (intf == null) {
+            log.warn("No external interface is attached to gateway {}", gatewayNode.hostname());
+            return null;
+        }
+
+        String patchPortName = "int-to-" + intf.network();
         Port port = deviceService.getPorts(gatewayNode.intgBridge()).stream()
                 .filter(p -> p.isEnabled() &&
-                        Objects.equals(p.annotations().value(PORT_NAME), "int-to-gateway"))
+                        Objects.equals(p.annotations().value(PORT_NAME), patchPortName))
                 .findAny().orElse(null);
 
         return port != null ? port.number() : null;
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
index f11547f..a4b0abb 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
@@ -16,7 +16,6 @@
 package org.onosproject.kubevirtnode.util;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Strings;
@@ -372,12 +371,8 @@
                 nodeType = GATEWAY;
                 gatewayBridgeName = jsonNode.get(GATEWAY_BRIDGE_NAME).asText();
             }
-        } catch (JSONException e) {
-            log.error("Failed to parse physnet config or gateway config object because of{}", e);
-        } catch (JsonMappingException e) {
-            log.error("Failed to parse physnet config or gateway config object because of{}", e);
-        } catch (JsonProcessingException e) {
-            log.error("Failed to parse physnet config or gateway config object because of{}", e);
+        } catch (JSONException | JsonProcessingException e) {
+            log.error("Failed to parse physnet config or gateway config object", e);
         }
 
         return DefaultKubevirtNode.builder()
