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
index a1587a5..043899f 100644
--- 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
@@ -42,9 +42,6 @@
     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 final KubevirtNodeAdminService nodeAdminService =
-            get(KubevirtNodeAdminService.class);
-
     /**
      * Synchronizes the flow rules.
      *
@@ -55,18 +52,21 @@
     @Path("sync/rules")
     public Response syncRules() {
 
-        nodeAdminService.completeNodes(WORKER).forEach(this::syncRulesBase);
+        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);
-        nodeAdminService.updateNode(updated);
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        service.updateNode(updated);
 
         boolean result = true;
         long timeoutExpiredMs = System.currentTimeMillis() + TIMEOUT_MS;
 
-        while (nodeAdminService.node(node.hostname()).state() != COMPLETE) {
+        while (service.node(node.hostname()).state() != COMPLETE) {
 
             long  waitMs = timeoutExpiredMs - System.currentTimeMillis();
 
@@ -76,10 +76,10 @@
                 log.error("Exception caused during node synchronization...");
             }
 
-            if (nodeAdminService.node(node.hostname()).state() == COMPLETE) {
+            if (service.node(node.hostname()).state() == COMPLETE) {
                 break;
             } else {
-                nodeAdminService.updateNode(updated);
+                service.updateNode(updated);
                 log.info("Failed to synchronize flow rules, retrying...");
             }
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResource.java
index 8ab531f..4e8f5df 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResource.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResource.java
@@ -55,9 +55,6 @@
 
     private static final String RESULT = "result";
 
-    private final KubevirtNetworkAdminService adminService =
-            get(KubevirtNetworkAdminService.class);
-
     /**
      * Creates a network from the JSON input stream.
      *
@@ -71,13 +68,14 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response createNetwork(InputStream input) {
         log.trace(String.format(MESSAGE, "CREATE"));
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
         URI location;
 
         try {
             ObjectNode jsonTree = readTreeFromStream(mapper(), input);
             final KubevirtNetwork network =
                     codec(KubevirtNetwork.class).decode(jsonTree, this);
-            adminService.createNetwork(network);
+            service.createNetwork(network);
             location = new URI(network.networkId());
         } catch (IOException | URISyntaxException e) {
             throw new IllegalArgumentException(e);
@@ -101,6 +99,7 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response updateNetwork(@PathParam("id") String id, InputStream input) {
         log.trace(String.format(MESSAGE, "UPDATED"));
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
 
         try {
             ObjectNode jsonTree = readTreeFromStream(mapper(), input);
@@ -112,7 +111,7 @@
 
             final KubevirtNetwork network =
                     codec(KubevirtNetwork.class).decode(jsonTree, this);
-            adminService.updateNetwork(network);
+            service.updateNetwork(network);
         } catch (IOException e) {
             throw new IllegalArgumentException(e);
         }
@@ -130,8 +129,9 @@
     @Path("{id}")
     public Response removeNetwork(@PathParam("id") String id) {
         log.trace(String.format(MESSAGE, "DELETE " + id));
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
 
-        adminService.removeNetwork(id);
+        service.removeNetwork(id);
         return Response.noContent().build();
     }
 
@@ -146,8 +146,10 @@
     public Response hasNetwork(@PathParam("id") String id) {
         log.trace(String.format(MESSAGE, "QUERY " + id));
 
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
+
         ObjectNode root = mapper().createObjectNode();
-        KubevirtNetwork network = adminService.network(id);
+        KubevirtNetwork network = service.network(id);
 
         if (network == null) {
             root.put(RESULT, false);
@@ -167,7 +169,8 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNetworks() {
-        final Iterable<KubevirtNetwork> networks = adminService.networks();
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
+        final Iterable<KubevirtNetwork> networks = service.networks();
         return ok(encodeArray(KubevirtNetwork.class, "networks", networks)).build();
     }
 
@@ -182,7 +185,8 @@
     @Produces(MediaType.APPLICATION_JSON)
     @Path("{id}")
     public Response getNetworkById(@PathParam("id") String id) {
-        final KubevirtNetwork network = nullIsNotFound(adminService.network(id),
+        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
+        final KubevirtNetwork network = nullIsNotFound(service.network(id),
                 NETWORK_NOT_FOUND + id);
         return ok(codec(KubevirtNetwork.class).encode(network, this)).build();
     }
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResource.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResource.java
index 1c6985b..e468ce3 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResource.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtApiConfigWebResource.java
@@ -60,8 +60,6 @@
     private static final String ENDPOINT = "endpoint";
     private static final String ERROR_MESSAGE = " cannot be null";
 
-    private final KubevirtApiConfigAdminService service = get(KubevirtApiConfigAdminService.class);
-
     @Context
     private UriInfo uriInfo;
 
@@ -80,6 +78,8 @@
         log.trace(String.format(MESSAGE_CONFIG, CREATE));
 
         KubevirtApiConfig config = readApiConfig(input);
+        KubevirtApiConfigAdminService service = get(KubevirtApiConfigAdminService.class);
+
         if (config != null) {
             service.createApiConfig(config);
         }
@@ -103,6 +103,7 @@
     public Response deleteApiConfig(@PathParam("endpoint") String endpoint) {
         log.trace(String.format(MESSAGE_CONFIG, REMOVE));
 
+        KubevirtApiConfigAdminService service = get(KubevirtApiConfigAdminService.class);
         KubevirtApiConfig existing = service.apiConfig();
 
         if (existing == null) {
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 137fc11..c28bc94 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
@@ -70,8 +70,6 @@
     private static final String HOST_NAME = "hostname";
     private static final String ERROR_MESSAGE = " cannot be null";
 
-    private final KubevirtNodeAdminService nodeAdminService = get(KubevirtNodeAdminService.class);
-
     @Context
     private UriInfo uriInfo;
 
@@ -89,10 +87,12 @@
     public Response createNodes(InputStream input) {
         log.trace(String.format(MESSAGE_NODE, CREATE));
 
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+
         readNodeConfiguration(input).forEach(node -> {
-            KubevirtNode existing = nodeAdminService.node(node.hostname());
+            KubevirtNode existing = service.node(node.hostname());
             if (existing == null) {
-                nodeAdminService.createNode(node);
+                service.createNode(node);
             }
         });
 
@@ -117,14 +117,15 @@
     public Response updateNodes(InputStream input) {
         log.trace(String.format(MESSAGE_NODE, UPDATE));
 
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
         Set<KubevirtNode> nodes = readNodeConfiguration(input);
         for (KubevirtNode node: nodes) {
-            KubevirtNode existing = nodeAdminService.node(node.hostname());
+            KubevirtNode existing = service.node(node.hostname());
             if (existing == null) {
                 log.warn("There is no node configuration to update : {}", node.hostname());
                 return Response.notModified().build();
             } else if (!existing.equals(node)) {
-                nodeAdminService.updateNode(node);
+                service.updateNode(node);
             }
         }
 
@@ -145,14 +146,15 @@
     public Response deleteNode(@PathParam("hostname") String hostname) {
         log.trace(String.format(MESSAGE_NODE, REMOVE));
 
-        KubevirtNode existing = nodeAdminService.node(
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        KubevirtNode existing = service.node(
                 nullIsIllegal(hostname, HOST_NAME + ERROR_MESSAGE));
 
         if (existing == null) {
             log.warn("There is no node configuration to delete : {}", hostname);
             return Response.notModified().build();
         } else {
-            nodeAdminService.removeNode(hostname);
+            service.removeNode(hostname);
         }
 
         return Response.noContent().build();
@@ -170,7 +172,8 @@
     public Response stateOfNode(@PathParam("hostname") String hostname) {
         log.trace(String.format(MESSAGE_NODE, QUERY));
 
-        KubevirtNode node = nodeAdminService.node(hostname);
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        KubevirtNode node = service.node(hostname);
         String nodeState = node != null ? node.state().toString() : NOT_EXIST;
 
         return ok(mapper().createObjectNode().put(STATE, nodeState)).build();
@@ -188,13 +191,14 @@
     public Response initNode(@PathParam("hostname") String hostname) {
         log.trace(String.format(MESSAGE_NODE, QUERY));
 
-        KubevirtNode node = nodeAdminService.node(hostname);
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        KubevirtNode node = service.node(hostname);
         if (node == null) {
             log.error("Given node {} does not exist", hostname);
             return Response.serverError().build();
         }
         KubevirtNode updated = node.updateState(KubevirtNodeState.INIT);
-        nodeAdminService.updateNode(updated);
+        service.updateNode(updated);
         return ok(mapper().createObjectNode()).build();
     }
 
@@ -209,10 +213,12 @@
     public Response initAllNodes() {
         log.trace(String.format(MESSAGE_NODE, QUERY));
 
-        nodeAdminService.nodes()
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+
+        service.nodes()
                 .forEach(n -> {
                     KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
-                    nodeAdminService.updateNode(updated);
+                    service.updateNode(updated);
                 });
 
         return ok(mapper().createObjectNode()).build();
@@ -229,11 +235,12 @@
     public Response initIncompleteNodes() {
         log.trace(String.format(MESSAGE_NODE, QUERY));
 
-        nodeAdminService.nodes().stream()
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        service.nodes().stream()
                 .filter(n -> n.state() != KubevirtNodeState.COMPLETE)
                 .forEach(n -> {
                     KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
-                    nodeAdminService.updateNode(updated);
+                    service.updateNode(updated);
                 });
 
         return ok(mapper().createObjectNode()).build();
