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 c853e3f..c95f8c4 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
@@ -921,13 +921,6 @@
                 install);
     }
 
-    private void reserveVrouterIp(KubevirtNetwork network) {
-        String networkId = network.networkId();
-        IpAddress vrouterIp = network.ipPool().start();
-
-        networkService.reserveIp(networkId, vrouterIp);
-    }
-
     private class InternalRouterEventListener implements KubevirtRouterListener {
         private boolean isRelevantHelper() {
             return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
@@ -1192,8 +1185,6 @@
                     initIntegrationTunnelBridge(network);
                     break;
                 case FLAT:
-                    reserveVrouterIp(network);
-                    break;
                 case VLAN:
                     break;
                 default:
@@ -1291,8 +1282,6 @@
                             setGatewayRuleToWorkerNodeWhenNodeCreated(node, network);
                             break;
                         case FLAT:
-                            reserveVrouterIp(network);
-                            break;
                         case VLAN:
                         default:
                             // do nothing
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
index d38b5cb..f49b03f 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
@@ -171,8 +171,8 @@
                 }
             }
 
-            Set<KubevirtPort> ports =
-                    getPorts(kubevirtNodeService, kubevirtNetworkAdminService.networks(), pod);
+            Set<KubevirtPort> ports = getPorts(kubevirtNodeService,
+                                      kubevirtNetworkAdminService.networks(), pod);
             if (ports.size() == 0) {
                 return;
             }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPortManager.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPortManager.java
index f7bf516..d6341de 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPortManager.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPortManager.java
@@ -107,7 +107,7 @@
         checkArgument(!Strings.isNullOrEmpty(port.networkId()), ERR_NULL_PORT_NET_ID);
 
         kubevirtPortStore.updatePort(port);
-        log.info(String.format(MSG_PORT, port.macAddress().toString(), MSG_UPDATED));
+        log.debug(String.format(MSG_PORT, port.macAddress().toString(), MSG_UPDATED));
     }
 
     @Override
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
index 0f74dfe..78a7f51 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtVmWatcher.java
@@ -18,10 +18,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.client.KubernetesClient;
-import io.fabric8.kubernetes.client.KubernetesClientException;
 import io.fabric8.kubernetes.client.Watcher;
 import io.fabric8.kubernetes.client.WatcherException;
 import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
@@ -34,7 +32,6 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
 import org.onosproject.kubevirtnetworking.api.KubevirtNetworkAdminService;
 import org.onosproject.kubevirtnetworking.api.KubevirtPodService;
 import org.onosproject.kubevirtnetworking.api.KubevirtPort;
@@ -61,13 +58,11 @@
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
-import static java.lang.Thread.sleep;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPorts;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.k8sClient;
-import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.parseResourceName;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -87,7 +82,6 @@
     private static final String DOMAIN = "domain";
     private static final String DEVICES = "devices";
     private static final String INTERFACES = "interfaces";
-    private static final String NETWORK_POLICIES = "networkPolicies";
     private static final String SECURITY_GROUPS = "securityGroups";
     private static final String NAME = "name";
     private static final String NETWORK = "network";
@@ -242,73 +236,21 @@
                         .networkId(net)
                         .build();
 
-                String name = parseResourceName(resource);
-
                 Set<String> sgs = parseSecurityGroups(resource);
                 port = port.updateSecurityGroups(sgs);
 
                 Map<String, IpAddress> ips = parseIpAddresses(resource);
-                IpAddress ip;
-                IpAddress existingIp = ips.get(port.networkId());
+                IpAddress ip = ips.get(port.networkId());
 
-                KubevirtNetwork network = networkAdminService.network(port.networkId());
-                if (network == null) {
-                    try {
-                        sleep(SLEEP_MS);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
+                port = port.updateIpAddress(ip);
+
+                DeviceId deviceId = getDeviceId(podService.pods(), port);
+
+                if (deviceId != null) {
+                    port = port.updateDeviceId(deviceId);
                 }
 
-                KubevirtPort existingPort = portAdminService.port(port.macAddress());
-
-                if (existingIp == null) {
-
-                    KubernetesClient client = k8sClient(configService);
-
-                    if (client == null) {
-                        return;
-                    }
-
-                    ip = networkAdminService.allocateIp(port.networkId());
-                    log.info("IP address {} is allocated from network {}", ip, port.networkId());
-
-                    try {
-                        // we wait a while to avoid potentially referring to old version resource
-                        // FIXME: we may need to find a better solution to avoid this
-                        sleep(SLEEP_MS);
-                        ObjectMapper mapper = new ObjectMapper();
-                        Map<String, Object> newResource = client.customResource(vmCrdCxt).get(DEFAULT, name);
-                        String newResourceStr = mapper.writeValueAsString(newResource);
-                        String updatedResource = updateIpAddress(newResourceStr, port.networkId(), ip);
-                        client.customResource(vmCrdCxt).edit(DEFAULT, name, updatedResource);
-                    } catch (IOException | InterruptedException e) {
-                        log.error("Failed to annotate IP addresses", e);
-                    } catch (KubernetesClientException kce) {
-                        log.error("Failed to update VM resource", kce);
-                    }
-
-                } else {
-                    if (existingPort != null) {
-                        return;
-                    }
-
-                    ip = existingIp;
-                    networkAdminService.reserveIp(port.networkId(), ip);
-                    log.info("IP address {} is reserved from network {}", ip, port.networkId());
-                }
-
-                if (existingPort == null) {
-                    KubevirtPort updated = port.updateIpAddress(ip);
-
-                    DeviceId deviceId = getDeviceId(podService.pods(), port);
-
-                    if (deviceId != null) {
-                        updated = updated.updateDeviceId(deviceId);
-                    }
-
-                    portAdminService.createPort(updated);
-                }
+                portAdminService.createPort(port);
             });
         }
 
@@ -330,7 +272,12 @@
                 }
 
                 Set<String> sgs = parseSecurityGroups(resource);
-                portAdminService.updatePort(existing.updateSecurityGroups(sgs));
+
+                // we only update the port, if the newly updated security groups
+                // have different values compared to existing ones
+                if (!port.securityGroups().equals(sgs)) {
+                    portAdminService.updatePort(existing.updateSecurityGroups(sgs));
+                }
             });
         }
 
@@ -342,10 +289,6 @@
             parseMacAddresses(resource).forEach((mac, net) -> {
                 KubevirtPort port = portAdminService.port(mac);
                 if (port != null) {
-                    networkAdminService.releaseIp(port.networkId(), port.ipAddress());
-                    log.info("IP address {} is released from network {}",
-                            port.ipAddress(), port.networkId());
-
                     portAdminService.removePort(mac);
                 }
             });
@@ -405,42 +348,6 @@
             return new HashMap<>();
         }
 
-        private String updateIpAddress(String resource, String network, IpAddress ip) {
-            try {
-                ObjectMapper mapper = new ObjectMapper();
-                ObjectNode json = (ObjectNode) mapper.readTree(resource);
-                ObjectNode spec = (ObjectNode) json.get(SPEC);
-                ObjectNode template = (ObjectNode) spec.get(TEMPLATE);
-                ObjectNode metadata = (ObjectNode) template.get(METADATA);
-                ObjectNode annots = (ObjectNode) metadata.get(ANNOTATIONS);
-
-                if (!annots.has(INTERFACES)) {
-                    annots.put(INTERFACES, "[]");
-                }
-
-                String intfs = annots.get(INTERFACES).asText();
-                ArrayNode intfsJson = (ArrayNode) mapper.readTree(intfs);
-
-                ObjectNode intf = mapper.createObjectNode();
-                intf.put(NETWORK, network);
-                intf.put(IP, ip.toString());
-
-                intfsJson.add(intf);
-
-                annots.put(INTERFACES, intfsJson.toString());
-                metadata.set(ANNOTATIONS, annots);
-                template.set(METADATA, metadata);
-                spec.set(TEMPLATE, template);
-                json.set(SPEC, spec);
-
-                return json.toString();
-
-            } catch (IOException e) {
-                log.error("Failed to update kubevirt VM IP addresses");
-            }
-            return null;
-        }
-
         private Set<String> parseSecurityGroups(String resource) {
             try {
                 ObjectMapper mapper = new ObjectMapper();
