diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java
deleted file mode 100644
index 043899f..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2021-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.kubevirtnetworking.web;
-
-import org.onosproject.kubevirtnode.api.KubevirtNode;
-import org.onosproject.kubevirtnode.api.KubevirtNodeAdminService;
-import org.onosproject.rest.AbstractWebResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static java.lang.Thread.sleep;
-import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
-import static org.onosproject.kubevirtnode.api.KubevirtNodeState.COMPLETE;
-import static org.onosproject.kubevirtnode.api.KubevirtNodeState.INIT;
-
-/**
- * REST interface for synchronizing kubevirt network states and rules.
- */
-@Path("management")
-public class KubevirtManagementWebResource extends AbstractWebResource {
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final long SLEEP_MS = 5000; // we wait 5s for init each node
-    private static final long TIMEOUT_MS = 10000; // we wait 10s
-
-    /**
-     * Synchronizes the flow rules.
-     *
-     * @return 200 OK with sync result, 404 not found
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("sync/rules")
-    public Response syncRules() {
-
-        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
-
-        service.completeNodes(WORKER).forEach(this::syncRulesBase);
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    private void syncRulesBase(KubevirtNode node) {
-        KubevirtNode updated = node.updateState(INIT);
-        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
-        service.updateNode(updated);
-
-        boolean result = true;
-        long timeoutExpiredMs = System.currentTimeMillis() + TIMEOUT_MS;
-
-        while (service.node(node.hostname()).state() != COMPLETE) {
-
-            long  waitMs = timeoutExpiredMs - System.currentTimeMillis();
-
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
-
-            if (service.node(node.hostname()).state() == COMPLETE) {
-                break;
-            } else {
-                service.updateNode(updated);
-                log.info("Failed to synchronize flow rules, retrying...");
-            }
-
-            if (waitMs <= 0) {
-                result = false;
-                break;
-            }
-        }
-
-        if (result) {
-            log.info("Successfully synchronize flow rules for node {}!", node.hostname());
-        } else {
-            log.warn("Failed to synchronize flow rules for node {}.", node.hostname());
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
index 45dcdae..1345f95 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
@@ -27,7 +27,6 @@
     public Set<Class<?>> getClasses() {
         return getClasses(
                 KubevirtNetworkWebResource.class,
-                KubevirtManagementWebResource.class,
                 KubevirtRouterWebResource.class,
                 KubevirtFloatingIpsWebResource.class,
                 KubevirtSecurityGroupWebResource.class,
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
index c28bc94..b18f42d 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
@@ -43,9 +43,13 @@
 import java.util.Set;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+import static java.lang.Thread.sleep;
 import static javax.ws.rs.core.Response.created;
 import static org.onlab.util.Tools.nullIsIllegal;
 import static org.onlab.util.Tools.readTreeFromStream;
+import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
+import static org.onosproject.kubevirtnode.api.KubevirtNodeState.COMPLETE;
+import static org.onosproject.kubevirtnode.api.KubevirtNodeState.INIT;
 
 /**
  * Handles REST API call of KubeVirt node config.
@@ -62,11 +66,13 @@
     private static final String NODE_ID = "NODE_ID";
     private static final String REMOVE = "REMOVE";
     private static final String QUERY = "QUERY";
-    private static final String INIT = "INIT";
     private static final String NOT_EXIST = "Not exist";
     private static final String STATE = "State";
     private static final String RESULT = "Result";
 
+    private static final long SLEEP_MS = 5000; // we wait 5s for init each node
+    private static final long TIMEOUT_MS = 10000; // we wait 10s
+
     private static final String HOST_NAME = "hostname";
     private static final String ERROR_MESSAGE = " cannot be null";
 
@@ -197,7 +203,7 @@
             log.error("Given node {} does not exist", hostname);
             return Response.serverError().build();
         }
-        KubevirtNode updated = node.updateState(KubevirtNodeState.INIT);
+        KubevirtNode updated = node.updateState(INIT);
         service.updateNode(updated);
         return ok(mapper().createObjectNode()).build();
     }
@@ -217,7 +223,7 @@
 
         service.nodes()
                 .forEach(n -> {
-                    KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
+                    KubevirtNode updated = n.updateState(INIT);
                     service.updateNode(updated);
                 });
 
@@ -239,13 +245,67 @@
         service.nodes().stream()
                 .filter(n -> n.state() != KubevirtNodeState.COMPLETE)
                 .forEach(n -> {
-                    KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
+                    KubevirtNode updated = n.updateState(INIT);
                     service.updateNode(updated);
                 });
 
         return ok(mapper().createObjectNode()).build();
     }
 
+    /**
+     * Synchronizes the flow rules.
+     *
+     * @return 200 OK with sync result, 404 not found
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("sync/rules")
+    public Response syncRules() {
+
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+
+        service.completeNodes(WORKER).forEach(this::syncRulesBase);
+        return ok(mapper().createObjectNode()).build();
+    }
+
+    private void syncRulesBase(KubevirtNode node) {
+        KubevirtNode updated = node.updateState(INIT);
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        service.updateNode(updated);
+
+        boolean result = true;
+        long timeoutExpiredMs = System.currentTimeMillis() + TIMEOUT_MS;
+
+        while (service.node(node.hostname()).state() != COMPLETE) {
+
+            long  waitMs = timeoutExpiredMs - System.currentTimeMillis();
+
+            try {
+                sleep(SLEEP_MS);
+            } catch (InterruptedException e) {
+                log.error("Exception caused during node synchronization...");
+            }
+
+            if (service.node(node.hostname()).state() == COMPLETE) {
+                break;
+            } else {
+                service.updateNode(updated);
+                log.info("Failed to synchronize flow rules, retrying...");
+            }
+
+            if (waitMs <= 0) {
+                result = false;
+                break;
+            }
+        }
+
+        if (result) {
+            log.info("Successfully synchronize flow rules for node {}!", node.hostname());
+        } else {
+            log.warn("Failed to synchronize flow rules for node {}.", node.hostname());
+        }
+    }
+
     private Set<KubevirtNode> readNodeConfiguration(InputStream input) {
         Set<KubevirtNode> nodeSet = Sets.newHashSet();
         try {
