diff --git a/apps/kubevirt-networking/app/BUILD b/apps/kubevirt-networking/app/BUILD
index 76ccbfa..0358e6e 100644
--- a/apps/kubevirt-networking/app/BUILD
+++ b/apps/kubevirt-networking/app/BUILD
@@ -5,7 +5,6 @@
     "//apps/kubevirt-node/api:onos-apps-kubevirt-node-api",
     "//apps/kubevirt-networking/api:onos-apps-kubevirt-networking-api",
     "@commons_net//jar",
-    "@jersey_client//jar",
     "@json//jar",
     "@k8s_client//jar",
     "@k8s_model//jar",
@@ -40,20 +39,13 @@
     "@dns_java//jar",
 ]
 
-TEST_DEPS = TEST_ADAPTERS + TEST_REST + [
+TEST_DEPS = TEST_ADAPTERS + [
     "//core/api:onos-api-tests",
     "//core/common:onos-core-common-tests",
-    "//web/api:onos-rest-tests",
-    "@minimal_json//jar",
 ]
 
 osgi_jar_with_tests(
-    api_description = "REST API for KubeVirt Networking",
-    api_package = "org.onosproject.kubevirtnetworking.web",
-    api_title = "KubeVirt Networking API",
-    api_version = "1.0",
     karaf_command_packages = ["org.onosproject.kubevirtnetworking.cli"],
     test_deps = TEST_DEPS,
-    web_context = "/onos/kubevirtnetworking",
     deps = COMPILE_DEPS,
 )
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java
deleted file mode 100644
index fd530a1..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java
+++ /dev/null
@@ -1,110 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtFloatingIp;
-import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt floating IP codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtFloatingIpCodec extends JsonCodec<KubevirtFloatingIp> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String ID = "id";
-    private static final String ROUTER_NAME = "routerName";
-    private static final String POD_NAME = "podName";
-    private static final String VM_NAME = "vmName";
-    private static final String NETWORK_NAME = "networkName";
-    private static final String FLOATING_IP = "floatingIp";
-    private static final String FIXED_IP = "fixedIp";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtFloatingIp";
-
-    @Override
-    public ObjectNode encode(KubevirtFloatingIp fip, CodecContext context) {
-        checkNotNull(fip, "Kubevirt floating IP cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(ID, fip.id())
-                .put(ROUTER_NAME, fip.routerName())
-                .put(NETWORK_NAME, fip.networkName())
-                .put(FLOATING_IP, fip.floatingIp().toString());
-
-        if (fip.podName() != null) {
-            result.put(POD_NAME, fip.podName());
-        }
-
-        if (fip.vmName() != null) {
-            result.put(VM_NAME, fip.vmName());
-        }
-
-        if (fip.fixedIp() != null) {
-            result.put(FIXED_IP, fip.fixedIp().toString());
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtFloatingIp decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String id = nullIsIllegal(json.get(ID).asText(), ID + MISSING_MESSAGE);
-        String routerName = nullIsIllegal(json.get(ROUTER_NAME).asText(),
-                ROUTER_NAME + MISSING_MESSAGE);
-        String floatingIp = nullIsIllegal(json.get(FLOATING_IP).asText(),
-                FLOATING_IP + MISSING_MESSAGE);
-        String networkName = nullIsIllegal(json.get(NETWORK_NAME).asText(),
-                NETWORK_NAME + MISSING_MESSAGE);
-
-        KubevirtFloatingIp.Builder builder = DefaultKubevirtFloatingIp.builder()
-                .id(id)
-                .routerName(routerName)
-                .networkName(networkName)
-                .floatingIp(IpAddress.valueOf(floatingIp));
-
-        JsonNode podName = json.get(POD_NAME);
-        if (podName != null) {
-            builder.podName(podName.asText());
-        }
-
-        JsonNode vmName = json.get(VM_NAME);
-        if (vmName != null) {
-            builder.vmName(vmName.asText());
-        }
-
-        JsonNode fixedIp = json.get(FIXED_IP);
-        if (fixedIp != null) {
-            builder.fixedIp(IpAddress.valueOf(fixedIp.asText()));
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteCodec.java
deleted file mode 100644
index 2d73979..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteCodec.java
+++ /dev/null
@@ -1,74 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt host route codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtHostRouteCodec extends JsonCodec<KubevirtHostRoute> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String DESTINATION = "destination";
-    private static final String NEXTHOP = "nexthop";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtHostRoute";
-
-    @Override
-    public ObjectNode encode(KubevirtHostRoute hostRoute, CodecContext context) {
-        checkNotNull(hostRoute, "Kubernetes network cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(DESTINATION, hostRoute.destination().toString());
-
-        if (hostRoute.nexthop() != null) {
-            result.put(NEXTHOP, hostRoute.nexthop().toString());
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtHostRoute decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String destination = nullIsIllegal(json.get(DESTINATION).asText(),
-                DESTINATION + MISSING_MESSAGE);
-        JsonNode nexthopJson = json.get(NEXTHOP);
-        IpAddress nexthop = null;
-
-        if (nexthopJson != null) {
-            nexthop = IpAddress.valueOf(nexthopJson.asText());
-        }
-
-        return new KubevirtHostRoute(IpPrefix.valueOf(destination), nexthop);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolCodec.java
deleted file mode 100644
index 8f5522c..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolCodec.java
+++ /dev/null
@@ -1,61 +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.codec;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt IP pool codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtIpPoolCodec extends JsonCodec<KubevirtIpPool> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String START = "start";
-    private static final String END = "end";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtIpPool";
-
-    @Override
-    public ObjectNode encode(KubevirtIpPool ipPool, CodecContext context) {
-        checkNotNull(ipPool, "Kubevirt IP pool cannot be null");
-
-        return context.mapper().createObjectNode()
-                .put(START, ipPool.start().toString())
-                .put(END, ipPool.end().toString());
-    }
-
-    @Override
-    public KubevirtIpPool decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String start = nullIsIllegal(json.get(START).asText(), START + MISSING_MESSAGE);
-        String end = nullIsIllegal(json.get(END).asText(), END + MISSING_MESSAGE);
-
-        return new KubevirtIpPool(IpAddress.valueOf(start), IpAddress.valueOf(end));
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java
deleted file mode 100644
index c11d829..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodec.java
+++ /dev/null
@@ -1,130 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-import org.slf4j.Logger;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.IntStream;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-public final class KubevirtLoadBalancerCodec extends JsonCodec<KubevirtLoadBalancer> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String VIP = "vip";
-    private static final String NETWORK_ID = "networkId";
-    private static final String MEMBERS = "members";
-    private static final String RULES = "rules";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtLoadBalancer";
-
-    @Override
-    public ObjectNode encode(KubevirtLoadBalancer lb, CodecContext context) {
-        checkNotNull(lb, "Kubevirt load balancer cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NAME, lb.name())
-                .put(VIP, lb.vip().toString())
-                .put(NETWORK_ID, lb.networkId());
-
-        if (lb.description() != null) {
-            result.put(DESCRIPTION, lb.description());
-        }
-
-        if (lb.members() != null && !lb.members().isEmpty()) {
-            ArrayNode members = context.mapper().createArrayNode();
-            for (IpAddress ip : lb.members()) {
-                members.add(ip.toString());
-            }
-            result.set(MEMBERS, members);
-        }
-
-        if (lb.rules() != null && !lb.rules().isEmpty()) {
-            ArrayNode rules = context.mapper().createArrayNode();
-            for (KubevirtLoadBalancerRule rule : lb.rules()) {
-                ObjectNode ruleJson = context.codec(
-                        KubevirtLoadBalancerRule.class).encode(rule, context);
-                rules.add(ruleJson);
-            }
-            result.set(RULES, rules);
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtLoadBalancer decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String name = nullIsIllegal(json.get(NAME).asText(), NAME + MISSING_MESSAGE);
-        IpAddress vip = IpAddress.valueOf(nullIsIllegal(json.get(VIP).asText(),
-                VIP + MISSING_MESSAGE));
-        String networkId = nullIsIllegal(json.get(NETWORK_ID).asText(),
-                NETWORK_ID + MISSING_MESSAGE);
-
-        KubevirtLoadBalancer.Builder builder = DefaultKubevirtLoadBalancer.builder()
-                .name(name)
-                .vip(vip)
-                .networkId(networkId);
-
-        JsonNode description = json.get(DESCRIPTION);
-        if (description != null) {
-            builder.description(description.asText());
-        }
-
-        ArrayNode membersJson = (ArrayNode) json.get(MEMBERS);
-        if (membersJson != null) {
-            Set<IpAddress> members = new HashSet<>();
-            for (JsonNode memberJson : membersJson) {
-                members.add(IpAddress.valueOf(memberJson.asText()));
-            }
-            builder.members(members);
-        }
-
-        JsonNode rulesJson = json.get(RULES);
-        if (rulesJson != null) {
-            Set<KubevirtLoadBalancerRule> rules = new HashSet<>();
-            IntStream.range(0, rulesJson.size())
-                    .forEach(i -> {
-                        ObjectNode ruleJson = get(rulesJson, i);
-                        KubevirtLoadBalancerRule rule = context.codec(
-                                KubevirtLoadBalancerRule.class).decode(ruleJson, context);
-                        rules.add(rule);
-                    });
-            builder.rules(rules);
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleCodec.java
deleted file mode 100644
index 582d4d3..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleCodec.java
+++ /dev/null
@@ -1,79 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtLoadBalancerRule;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt load balancer rule codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtLoadBalancerRuleCodec extends JsonCodec<KubevirtLoadBalancerRule> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String PROTOCOL = "protocol";
-    private static final String PORT_RANGE_MAX = "portRangeMax";
-    private static final String PORT_RANGE_MIN = "portRangeMin";
-    private static final String TCP = "TCP";
-    private static final String UDP = "UDP";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtLoadBalancerRule";
-
-    @Override
-    public ObjectNode encode(KubevirtLoadBalancerRule rule, CodecContext context) {
-        checkNotNull(rule, "Kubevirt load balancer rule cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode().put(PROTOCOL, rule.protocol());
-
-        if (rule.protocol().equalsIgnoreCase(TCP) || rule.protocol().equalsIgnoreCase(UDP)) {
-            result.put(PORT_RANGE_MAX, rule.portRangeMax()).put(PORT_RANGE_MIN, rule.portRangeMin());
-        }
-        return result;
-    }
-
-    @Override
-    public KubevirtLoadBalancerRule decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        KubevirtLoadBalancerRule.Builder builder = DefaultKubevirtLoadBalancerRule.builder();
-
-        JsonNode protocolJson = json.get(PROTOCOL);
-        String protocol = "";
-        if (protocolJson != null) {
-            protocol = protocolJson.asText();
-        }
-        builder.protocol(protocol);
-
-        if (protocol.equalsIgnoreCase(TCP) || protocol.equalsIgnoreCase(UDP)) {
-            Integer portRangeMax = json.get(PORT_RANGE_MAX).asInt();
-            Integer portRangeMin = json.get(PORT_RANGE_MIN).asInt();
-            builder.portRangeMax(portRangeMax).portRangeMin(portRangeMin);
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java
deleted file mode 100644
index 2d8a07c..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodec.java
+++ /dev/null
@@ -1,178 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.slf4j.Logger;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.IntStream;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt network codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtNetworkCodec extends JsonCodec<KubevirtNetwork> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String NETWORK_ID = "networkId";
-    private static final String TYPE = "type";
-    private static final String NAME = "name";
-    private static final String MTU = "mtu";
-    private static final String SEGMENT_ID = "segmentId";
-    private static final String GATEWAY_IP = "gatewayIp";
-    private static final String DEFAULT_ROUTE = "defaultRoute";
-    private static final String CIDR = "cidr";
-    private static final String HOST_ROUTES = "hostRoutes";
-    private static final String IP_POOL = "ipPool";
-    private static final String DNSES = "dnses";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtNetwork";
-
-    @Override
-    public ObjectNode encode(KubevirtNetwork network, CodecContext context) {
-        checkNotNull(network, "Kubevirt network cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, network.networkId())
-                .put(TYPE, network.type().name())
-                .put(NAME, network.name())
-                .put(MTU, network.mtu())
-                .put(GATEWAY_IP, network.gatewayIp().toString())
-                .put(DEFAULT_ROUTE, network.defaultRoute())
-                .put(CIDR, network.cidr());
-
-        if (network.segmentId() != null) {
-            result.put(SEGMENT_ID, network.segmentId());
-        }
-
-        if (network.hostRoutes() != null && !network.hostRoutes().isEmpty()) {
-            ArrayNode hostRoutes = context.mapper().createArrayNode();
-            network.hostRoutes().forEach(hostRoute -> {
-                ObjectNode hostRouteJson =
-                        context.codec(KubevirtHostRoute.class).encode(hostRoute, context);
-                hostRoutes.add(hostRouteJson);
-            });
-            result.set(HOST_ROUTES, hostRoutes);
-        }
-
-        if (network.ipPool() != null) {
-            ObjectNode ipPoolJson = context.codec(KubevirtIpPool.class).encode(network.ipPool(), context);
-            result.set(IP_POOL, ipPoolJson);
-        }
-
-        if (network.dnses() != null && !network.dnses().isEmpty()) {
-            ArrayNode dnses = context.mapper().createArrayNode();
-            network.dnses().forEach(dns -> {
-                dnses.add(dns.toString());
-            });
-            result.set(DNSES, dnses);
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtNetwork decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String networkId = nullIsIllegal(json.get(NETWORK_ID).asText(),
-                NETWORK_ID + MISSING_MESSAGE);
-        String type = nullIsIllegal(json.get(TYPE).asText(),
-                TYPE + MISSING_MESSAGE);
-        String name = nullIsIllegal(json.get(NAME).asText(),
-                NAME + MISSING_MESSAGE);
-        Integer mtu = nullIsIllegal(json.get(MTU).asInt(),
-                MTU + MISSING_MESSAGE);
-        String gatewayIp = nullIsIllegal(json.get(GATEWAY_IP).asText(),
-                GATEWAY_IP + MISSING_MESSAGE);
-        boolean defaultRoute = nullIsIllegal(json.get(DEFAULT_ROUTE).asBoolean(),
-                DEFAULT_ROUTE + MISSING_MESSAGE);
-        String cidr = nullIsIllegal(json.get(CIDR).asText(),
-                CIDR + MISSING_MESSAGE);
-
-        KubevirtNetwork.Builder networkBuilder = DefaultKubevirtNetwork.builder()
-                .networkId(networkId)
-                .type(KubevirtNetwork.Type.valueOf(type))
-                .name(name)
-                .mtu(mtu)
-                .gatewayIp(IpAddress.valueOf(gatewayIp))
-                .defaultRoute(defaultRoute)
-                .cidr(cidr);
-
-        if (!type.equals(KubevirtNetwork.Type.FLAT.name())) {
-            JsonNode segmentIdJson = json.get(SEGMENT_ID);
-            if (segmentIdJson != null) {
-                networkBuilder.segmentId(segmentIdJson.asText());
-            }
-        }
-
-        JsonNode ipPoolJson = json.get(IP_POOL);
-        if (ipPoolJson != null) {
-            final JsonCodec<KubevirtIpPool>
-                    ipPoolCodec = context.codec(KubevirtIpPool.class);
-            networkBuilder.ipPool(ipPoolCodec.decode(
-                    (ObjectNode) ipPoolJson.deepCopy(), context));
-        }
-
-        // parse host routes
-        Set<KubevirtHostRoute> hostRoutes = new HashSet<>();
-        JsonNode hostRoutesJson = json.get(HOST_ROUTES);
-        if (hostRoutesJson != null) {
-            final JsonCodec<KubevirtHostRoute>
-                    hostRouteCodec = context.codec(KubevirtHostRoute.class);
-
-            IntStream.range(0, hostRoutesJson.size()).forEach(i -> {
-                ObjectNode routeJson = get(hostRoutesJson, i);
-                hostRoutes.add(hostRouteCodec.decode(routeJson, context));
-            });
-        }
-        networkBuilder.hostRoutes(hostRoutes);
-
-        // parse DNSes
-        Set<IpAddress> dnses = new HashSet<>();
-        JsonNode dnsesJson = json.get(DNSES);
-        if (dnsesJson != null) {
-            for (int i = 0; i < dnsesJson.size(); i++) {
-                JsonNode dnsJson = dnsesJson.get(i);
-                if (dnsJson != null) {
-                    dnses.add(IpAddress.valueOf(dnsJson.asText()));
-                }
-            }
-        }
-        networkBuilder.dnses(dnses);
-
-        log.trace("Network is {}", networkBuilder.build().toString());
-
-        return networkBuilder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
deleted file mode 100644
index 281855e..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
+++ /dev/null
@@ -1,123 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
-import org.onosproject.kubevirtnetworking.api.KubevirtPort;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-public final class KubevirtPortCodec extends JsonCodec<KubevirtPort> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String VM_NAME = "vmName";
-    private static final String NETWORK_ID = "networkId";
-    private static final String MAC_ADDRESS = "macAddress";
-    private static final String IP_ADDRESS = "ipAddress";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String PORT_NUMBER = "portNumber";
-    private static final String SECURITY_GROUPS = "securityGroups";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtPort";
-
-    @Override
-    public ObjectNode encode(KubevirtPort port, CodecContext context) {
-        checkNotNull(port, "Kubevirt port cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(VM_NAME, port.vmName())
-                .put(NETWORK_ID, port.networkId())
-                .put(MAC_ADDRESS, port.macAddress().toString());
-
-        if (port.ipAddress() != null) {
-            result.put(IP_ADDRESS, port.ipAddress().toString());
-        }
-
-        if (port.deviceId() != null) {
-            result.put(DEVICE_ID, port.deviceId().toString());
-        }
-
-        if (port.portNumber() != null) {
-            result.put(PORT_NUMBER, port.portNumber().toString());
-        }
-
-        if (port.securityGroups() != null) {
-            ArrayNode sgIds = context.mapper().createArrayNode();
-            for (String sgId : port.securityGroups()) {
-                sgIds.add(sgId);
-            }
-            result.set(SECURITY_GROUPS, sgIds);
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtPort decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String vmName = nullIsIllegal(json.get(VM_NAME).asText(),
-                VM_NAME + MISSING_MESSAGE);
-
-        String networkId = nullIsIllegal(json.get(NETWORK_ID).asText(),
-                NETWORK_ID + MISSING_MESSAGE);
-
-        String macAddress = nullIsIllegal(json.get(MAC_ADDRESS).asText(),
-                MAC_ADDRESS + MISSING_MESSAGE);
-
-        KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
-                .vmName(vmName)
-                .networkId(networkId)
-                .macAddress(MacAddress.valueOf(macAddress));
-
-        JsonNode ipAddressJson = json.get(IP_ADDRESS);
-        if (ipAddressJson != null) {
-            final IpAddress ipAddress = IpAddress.valueOf(ipAddressJson.asText());
-            builder.ipAddress(ipAddress);
-        }
-
-        JsonNode deviceIdJson = json.get(DEVICE_ID);
-        if (deviceIdJson != null) {
-            final DeviceId deviceId = DeviceId.deviceId(deviceIdJson.asText());
-            builder.deviceId(deviceId);
-        }
-
-        JsonNode portNumberJson = json.get(PORT_NUMBER);
-        if (portNumberJson != null) {
-            final PortNumber portNumber = PortNumber.portNumber(portNumberJson.asText());
-            builder.portNumber(portNumber);
-        }
-
-        log.trace("Port is {}", builder.build().toString());
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java
deleted file mode 100644
index 5ca4ab6..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodec.java
+++ /dev/null
@@ -1,177 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableMap;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtPeerRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-import org.slf4j.Logger;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt router codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtRouterCodec extends JsonCodec<KubevirtRouter> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String ENABLE_SNAT = "enableSnat";
-    private static final String INTERNAL = "internal";
-    private static final String EXTERNAL = "external";
-    private static final String PEER_ROUTER = "peerRouter";
-    private static final String IP_ADDRESS = "ip";
-    private static final String MAC_ADDRESS = "mac";
-    private static final String NETWORK = "network";
-    private static final String GATEWAY = "gateway";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtRouter";
-
-    @Override
-    public ObjectNode encode(KubevirtRouter router, CodecContext context) {
-        checkNotNull(router, "Kubevirt router cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NAME, router.name())
-                .put(ENABLE_SNAT, router.enableSnat())
-                .put(MAC_ADDRESS, router.mac().toString());
-
-        if (router.description() != null) {
-            result.put(DESCRIPTION, router.description());
-        }
-
-        if (router.internal() != null && !router.internal().isEmpty()) {
-            ArrayNode internal = context.mapper().createArrayNode();
-            router.internal().forEach(internal::add);
-
-            result.set(INTERNAL, internal);
-        }
-
-        if (router.external() != null && !router.external().isEmpty()) {
-            ArrayNode external = context.mapper().createArrayNode();
-            router.external().forEach((k, v) -> {
-                ObjectNode item = context.mapper().createObjectNode();
-                item.put(IP_ADDRESS, k);
-                item.put(NETWORK, v);
-                external.add(item);
-            });
-            result.set(EXTERNAL, external);
-        }
-
-        if (router.peerRouter() != null) {
-            ObjectNode peerRouter = context.mapper().createObjectNode();
-            peerRouter.put(IP_ADDRESS, router.peerRouter().ipAddress().toString());
-
-            if (router.peerRouter().macAddress() != null) {
-                peerRouter.put(MAC_ADDRESS, router.peerRouter().macAddress().toString());
-            }
-
-            result.set(PEER_ROUTER, peerRouter);
-        }
-
-        if (router.electedGateway() != null) {
-            result.put(GATEWAY, router.electedGateway());
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtRouter decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String name = nullIsIllegal(json.get(NAME).asText(),
-                NAME + MISSING_MESSAGE);
-
-        String vrouterMac = nullIsIllegal(json.get(MAC_ADDRESS).asText(),
-                MAC_ADDRESS + MISSING_MESSAGE);
-
-        KubevirtRouter.Builder builder = DefaultKubevirtRouter.builder()
-                .name(name)
-                .mac(MacAddress.valueOf(vrouterMac));
-
-        JsonNode descriptionJson = json.get(DESCRIPTION);
-        if (descriptionJson != null) {
-            builder.description(descriptionJson.asText());
-        }
-
-        JsonNode enableSnatJson = json.get(ENABLE_SNAT);
-        if (enableSnatJson != null) {
-            builder.enableSnat(enableSnatJson.asBoolean());
-        }
-        JsonNode electedGwJson = json.get(GATEWAY);
-        if (electedGwJson != null) {
-            builder.electedGateway(electedGwJson.asText());
-        }
-
-        ArrayNode internalJson = (ArrayNode) json.get(INTERNAL);
-        Set<String> internal = new HashSet<>();
-        if (internalJson != null) {
-            for (int i = 0; i < internalJson.size(); i++) {
-                internal.add(internalJson.get(i).asText());
-            }
-            builder.internal(internal);
-        }
-
-        ObjectNode externalJson = (ObjectNode) json.get(EXTERNAL);
-        if (externalJson != null) {
-            Map<String, String> external = ImmutableMap.of(
-                    externalJson.get(IP_ADDRESS).asText(),
-                    externalJson.get(NETWORK).asText());
-            builder.external(external);
-        }
-
-        ObjectNode peerRouterJson = (ObjectNode) json.get(PEER_ROUTER);
-        if (peerRouterJson != null) {
-            JsonNode ipJson = peerRouterJson.get(IP_ADDRESS);
-            JsonNode macJson = peerRouterJson.get(MAC_ADDRESS);
-
-            if (ipJson != null && macJson != null) {
-                IpAddress ip = IpAddress.valueOf(ipJson.asText());
-                MacAddress mac = MacAddress.valueOf(macJson.asText());
-                KubevirtPeerRouter peer = new KubevirtPeerRouter(ip, mac);
-                builder.peerRouter(peer);
-            }
-
-            // if mac address is not specified, we will not add mac address to peer router
-            if (ipJson != null && macJson == null) {
-                IpAddress ip = IpAddress.valueOf(ipJson.asText());
-                KubevirtPeerRouter peer = new KubevirtPeerRouter(ip, null);
-                builder.peerRouter(peer);
-            }
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodec.java
deleted file mode 100644
index fe290f9..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodec.java
+++ /dev/null
@@ -1,108 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-import org.slf4j.Logger;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.IntStream;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt security group codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtSecurityGroupCodec extends JsonCodec<KubevirtSecurityGroup> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String ID = "id";
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String RULES = "rules";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtSecurityGroup";
-
-    @Override
-    public ObjectNode encode(KubevirtSecurityGroup sg, CodecContext context) {
-        checkNotNull(sg, "Kubevirt Security Group cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(ID, sg.id())
-                .put(NAME, sg.name());
-
-        if (sg.description() != null) {
-            result.put(DESCRIPTION, sg.description());
-        }
-
-        if (sg.rules() != null && !sg.rules().isEmpty()) {
-            ArrayNode rules = context.mapper().createArrayNode();
-            sg.rules().forEach(rule -> {
-                ObjectNode ruleJson = context.codec(
-                        KubevirtSecurityGroupRule.class).encode(rule, context);
-                rules.add(ruleJson);
-            });
-            result.set(RULES, rules);
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtSecurityGroup decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String id = nullIsIllegal(json.get(ID).asText(), ID + MISSING_MESSAGE);
-        String name = nullIsIllegal(json.get(NAME).asText(), NAME + MISSING_MESSAGE);
-
-        KubevirtSecurityGroup.Builder builder = DefaultKubevirtSecurityGroup.builder()
-                .id(id)
-                .name(name);
-
-        JsonNode description = json.get(DESCRIPTION);
-        if (description != null) {
-            builder.description(description.asText());
-        }
-
-        JsonNode rulesJson = json.get(RULES);
-        if (rulesJson != null) {
-            Set<KubevirtSecurityGroupRule> rules = new HashSet<>();
-            IntStream.range(0, rulesJson.size())
-                    .forEach(i -> {
-                        ObjectNode ruleJson = get(rulesJson, i);
-                        KubevirtSecurityGroupRule rule = context.codec(
-                                KubevirtSecurityGroupRule.class).decode(ruleJson, context);
-                        rules.add(rule);
-                    });
-            builder.rules(rules);
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleCodec.java
deleted file mode 100644
index b63b555..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleCodec.java
+++ /dev/null
@@ -1,135 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtSecurityGroupRule;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-import org.slf4j.Logger;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Kubevirt security group rule codec used for serializing and de-serializing JSON string.
- */
-public final class KubevirtSecurityGroupRuleCodec extends JsonCodec<KubevirtSecurityGroupRule> {
-
-    private final Logger log = getLogger(getClass());
-
-    private static final String ID = "id";
-    private static final String SECURITY_GROUP_ID = "securityGroupId";
-    private static final String DIRECTION = "direction";
-    private static final String ETHER_TYPE = "etherType";
-    private static final String PORT_RANGE_MAX = "portRangeMax";
-    private static final String PORT_RANGE_MIN = "portRangeMin";
-    private static final String PROTOCOL = "protocol";
-    private static final String REMOTE_IP_PREFIX = "remoteIpPrefix";
-    private static final String REMOTE_GROUP_ID = "remoteGroupId";
-
-    private static final String MISSING_MESSAGE = " is required in KubevirtSecurityGroupRule";
-
-    @Override
-    public ObjectNode encode(KubevirtSecurityGroupRule sgRule, CodecContext context) {
-        checkNotNull(sgRule, "Kubevirt security group rule cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(ID, sgRule.id())
-                .put(SECURITY_GROUP_ID, sgRule.securityGroupId())
-                .put(DIRECTION, sgRule.direction());
-
-        if (sgRule.etherType() != null) {
-            result.put(ETHER_TYPE, sgRule.etherType());
-        }
-
-        if (sgRule.portRangeMax() != null) {
-            result.put(PORT_RANGE_MAX, sgRule.portRangeMax());
-        }
-
-        if (sgRule.portRangeMin() != null) {
-            result.put(PORT_RANGE_MIN, sgRule.portRangeMin());
-        }
-
-        if (sgRule.protocol() != null) {
-            result.put(PROTOCOL, sgRule.protocol());
-        }
-
-        if (sgRule.remoteIpPrefix() != null) {
-            result.put(REMOTE_IP_PREFIX, sgRule.remoteIpPrefix().toString());
-        }
-
-        if (sgRule.remoteGroupId() != null) {
-            result.put(REMOTE_GROUP_ID, sgRule.remoteGroupId());
-        }
-
-        return result;
-    }
-
-    @Override
-    public KubevirtSecurityGroupRule decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String id = nullIsIllegal(json.get(ID).asText(), ID + MISSING_MESSAGE);
-        String securityGroupId = nullIsIllegal(json.get(SECURITY_GROUP_ID).asText(),
-                SECURITY_GROUP_ID + MISSING_MESSAGE);
-        String direction = nullIsIllegal(json.get(DIRECTION).asText(),
-                DIRECTION + MISSING_MESSAGE);
-
-        KubevirtSecurityGroupRule.Builder builder = DefaultKubevirtSecurityGroupRule.builder()
-                .id(id)
-                .securityGroupId(securityGroupId)
-                .direction(direction);
-
-        JsonNode etherType = json.get(ETHER_TYPE);
-        if (etherType != null) {
-            builder.etherType(etherType.asText());
-        }
-
-        JsonNode portRangeMax = json.get(PORT_RANGE_MAX);
-        if (portRangeMax != null) {
-            builder.portRangeMax(portRangeMax.asInt());
-        }
-
-        JsonNode portRangeMin = json.get(PORT_RANGE_MIN);
-        if (portRangeMin != null) {
-            builder.portRangeMin(portRangeMin.asInt());
-        }
-
-        JsonNode protocol = json.get(PROTOCOL);
-        if (protocol != null) {
-            builder.protocol(protocol.asText());
-        }
-
-        JsonNode remoteIpPrefix = json.get(REMOTE_IP_PREFIX);
-        if (remoteIpPrefix != null) {
-            builder.remoteIpPrefix(IpPrefix.valueOf(remoteIpPrefix.asText()));
-        }
-
-        JsonNode remoteGroupId = json.get(REMOTE_GROUP_ID);
-        if (remoteGroupId != null) {
-            builder.remoteGroupId(remoteGroupId.asText());
-        }
-
-        return builder.build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/package-info.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/package-info.java
deleted file mode 100644
index 91d8c00..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2020-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.
- */
-
-/**
- * Implementations of the codec broker and KubeVirt networking entity JSON codecs.
- */
-package org.onosproject.kubevirtnetworking.codec;
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtFloatingIpsWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtFloatingIpsWebResource.java
deleted file mode 100644
index ec41622..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtFloatingIpsWebResource.java
+++ /dev/null
@@ -1,53 +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.kubevirtnetworking.api.KubevirtFloatingIp;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
-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;
-
-/**
- * Handles REST API call for kubevirt floating IPs.
- */
-@Path("floating-ip")
-public class KubevirtFloatingIpsWebResource extends AbstractWebResource {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final String FLOATING_IPS = "floating-ips";
-
-    /**
-     * Returns set of all floating IPs.
-     *
-     * @return 200 OK with set of all floating IPs
-     * @onos.rsModel KubevirtFloatingIps
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getFloatingIps() {
-        KubevirtRouterService service = get(KubevirtRouterService.class);
-        final Iterable<KubevirtFloatingIp> fips = service.floatingIps();
-        return ok(encodeArray(KubevirtFloatingIp.class, FLOATING_IPS, fips)).build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtLoadBalancerWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtLoadBalancerWebResource.java
deleted file mode 100644
index 8fa61a2..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtLoadBalancerWebResource.java
+++ /dev/null
@@ -1,52 +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.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerService;
-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;
-
-/**
- * Handles REST API call for kubevirt load balancer.
- */
-@Path("loadbalancer")
-public class KubevirtLoadBalancerWebResource extends AbstractWebResource {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-    private static final String LOAD_BALANCERS = "loadBalancers";
-
-    /**
-     * Returns set of all load balancers.
-     *
-     * @return 200 OK with set of all load balancers
-     * @onos.rsModel KubevirtLoadBalancers
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLoadBalancers() {
-        KubevirtLoadBalancerService service = get(KubevirtLoadBalancerService.class);
-        final Iterable<KubevirtLoadBalancer> lbs = service.loadBalancers();
-        return ok(encodeArray(KubevirtLoadBalancer.class, LOAD_BALANCERS, lbs)).build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResource.java
deleted file mode 100644
index ef8f707..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResource.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright 2022-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 com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
-import org.onosproject.kubevirtnetworking.api.KubevirtInstance;
-import org.onosproject.kubevirtnetworking.api.KubevirtInstanceService;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerService;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
-import org.onosproject.kubevirtnode.api.KubevirtNode;
-import org.onosproject.kubevirtnode.api.KubevirtNodeService;
-import org.onosproject.rest.AbstractWebResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import java.io.InputStream;
-
-/**
- * Handles REST API for communication with MEC Orchestrator.
- */
-@Path("api/mm5/v1")
-public class KubevirtMm5WebResource extends AbstractWebResource {
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final String RECEIVED_REQUEST = "Received %s request";
-    private static final String QUERY_STATUS_LEG = "LEG status query";
-    private static final String QUERY_STATUS_VR = "VR status query";
-
-    private static final String QUERY_GET_NETWORK = "get network query";
-    private static final String QUERY_CREATE_NETWORK = "create network query";
-    private static final String QUERY_UPDATE_NETWORK = "update network query";
-    private static final String QUERY_DELETE_NETWORK = "delete network query";
-
-    private static final String QUERY_GET_VR = "get virtual router query";
-    private static final String QUERY_CREATE_VR = "create virtual router query";
-    private static final String QUERY_UPDATE_VR = "update virtual router query";
-    private static final String QUERY_DELETE_VR = "delete virtual router query";
-
-    private static final String QUERY_GET_FIP = "get floating ip query";
-    private static final String QUERY_CREATE_FIP = "create floating ip query";
-    private static final String QUERY_UPDATE_FIP = "update floating ip query";
-    private static final String QUERY_DELETE_FIP = "delete floating ip query";
-
-    private static final String QUERY_GET_LB = "get LoadBalancer query";
-    private static final String QUERY_CREATE_LB = "create LoadBalancer query";
-    private static final String QUERY_UPDATE_LB = "update LoadBalancer query";
-    private static final String QUERY_DELETE_LB = "delete LoadBalancer query";
-
-    private static final String QUERY_GET_INSTANCE = "get instance query";
-    private static final String QUERY_CREATE_INSTANCE = "create instance query";
-    private static final String QUERY_UPDATE_INSTANCE = "update floating ip query";
-    private static final String QUERY_DELETE_INSTANCE = "delete floating ip query";
-
-    private static final String NODE_NAME = "nodeName";
-    private static final String STATE = "state";
-    private static final String ACTIVE = "ACTIVE";
-    private static final String INACTIVE = "INACTIVE";
-
-    private static final String NETWORKS = "networks";
-    private static final String INSTANCES = "instances";
-    private static final String VIRTUAL_ROUTERS = "virtualRouters";
-    private static final String LOAD_BALANCERS = "loadBalancers";
-    private static final String FLOATING_IPS = "floatingIps";
-
-    private static final String UP = "up";
-    private static final String DOWN = "down";
-    private static final String NONE = "none";
-
-    private static final String VR_NAME = "vrName";
-
-    @Context
-    private UriInfo uriInfo;
-
-    /**
-     * Obtains the status of the virtual router.
-     *
-     * @param vrName virtual router name
-     * @return the state of the virtual router in Json
-     */
-    @GET
-    @Path("status/vr/{vrName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response vrStatus(@PathParam(VR_NAME) String vrName) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_STATUS_VR));
-
-        KubevirtRouterService service = get(KubevirtRouterService.class);
-
-        KubevirtRouter router = service.routers().stream()
-                .filter(r -> r.name().equals(vrName))
-                .findAny().orElse(null);
-
-        if (router == null) {
-            return Response.status(Response.Status.NOT_FOUND).build();
-        } else {
-            ObjectNode jsonResult = mapper().createObjectNode();
-
-            jsonResult.put(VR_NAME, router.name());
-
-            if (router.electedGateway() == null) {
-                jsonResult.put("merName", NONE);
-                jsonResult.put("status", DOWN);
-            } else {
-                jsonResult.put("merName", router.electedGateway());
-                jsonResult.put("status", UP);
-            }
-
-            jsonResult.put("timeUpdated",  System.currentTimeMillis());
-            return ok(jsonResult).build();
-        }
-    }
-
-    /**
-     * Obtains the state of the leg node.
-     *
-     * @param nodeName leg host name
-     * @return the state of the leg node in Json
-     */
-    @PUT
-    @Path("state/mer/{nodeName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response legStatus(@PathParam("nodeName") String nodeName) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_STATUS_LEG));
-
-        KubevirtNodeService service = get(KubevirtNodeService.class);
-
-        ObjectNode jsonResult = mapper().createObjectNode();
-        jsonResult.put(NODE_NAME, nodeName);
-
-        boolean isActive = service.completeNodes().stream()
-                .anyMatch(node -> node.type().equals(KubevirtNode.Type.GATEWAY) &&
-                        node.hostname().equals(nodeName));
-        if (isActive) {
-            jsonResult.put(STATE, ACTIVE);
-        } else {
-            jsonResult.put(STATE, INACTIVE);
-        }
-        return ok(jsonResult).build();
-    }
-
-    /**
-     * Obtains the network information in Json Array.
-     *
-     * @return network information in Json
-     */
-    @GET
-    @Path("network")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getNetwork() {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_NETWORK));
-
-        KubevirtNetworkService service = get(KubevirtNetworkService.class);
-        final Iterable<KubevirtNetwork> networks = service.networks();
-        return ok(encodeArray(KubevirtNetwork.class, NETWORKS, networks)).build();
-    }
-
-    /**
-     * Creates the kubevirt network with specified input stream.
-     *
-     * @param inputStream network Json input stream
-     * @return 200 OK if succeeded
-     */
-    @POST
-    @Path("network")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createNetwork(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_NETWORK));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Updates the kubevirt network with the specified input stream.
-     *
-     * @param inputStream network Json input stream
-     * @return 200 OK if succeeded
-     */
-    @PUT
-    @Path("network/{networkName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateNetwork(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_NETWORK));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Deletes the kubevirt network with the specified input stream.
-     *
-     * @param inputStream network Json input stream
-     * @return 200 OK if succeeded
-     */
-    @DELETE
-    @Path("network/{networkName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteNetwork(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_NETWORK));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Obtains the instance information in Json Array.
-     *
-     * @return instance information in Json
-     */
-    @GET
-    @Path("instance")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getInstance() {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_INSTANCE));
-
-        KubevirtInstanceService service = get(KubevirtInstanceService.class);
-        final Iterable<KubevirtInstance> instances = service.instances();
-        return ok(encodeArray(KubevirtInstance.class, INSTANCES, instances)).build();
-    }
-
-    /**
-     * Creates the instance with specified input stream.
-     *
-     * @param inputStream instance Json insput stream
-     * @return 200 OK if succeeded
-     */
-    @POST
-    @Path("instance")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createInstance(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_INSTANCE));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Updates the instance with specified input stream.
-     *
-     * @param inputStream instance Json insput stream
-     * @return 200 OK if succeeded
-     */
-    @PUT
-    @Path("instance/{instanceName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateInstance(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_INSTANCE));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Deletes the instance with specified input stream.
-     *
-     * @param inputStream inputStream instance Json insput stream
-     * @return 200 OK if succeeded
-     */
-    @DELETE
-    @Path("instance/{instanceName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteInstance(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_INSTANCE));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Obtains the virtual router in Json array.
-     *
-     * @return virtual router information in Json
-     */
-    @GET
-    @Path("vr")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getVirtualRouter() {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_VR));
-
-        KubevirtRouterService service = get(KubevirtRouterService.class);
-        final Iterable<KubevirtRouter> routers = service.routers();
-        return ok(encodeArray(KubevirtRouter.class, VIRTUAL_ROUTERS, routers)).build();
-    }
-
-    /**
-     * Creates the virtual router with specified input stream.
-     *
-     * @param inputStream virtual router Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @POST
-    @Path("vr")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createVirtualRouter(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_VR));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Updates the virtual router with specified input stream.
-     *
-     * @param inputStream virtual router Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @PUT
-    @Path("vr/{vrName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateVirtualRouter(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_VR));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Deletes the virtual router with specified input stream.
-     *
-     * @param inputStream virtual router Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @DELETE
-    @Path("vr/{vrName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteVirtualRouter(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_VR));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Obtains the floating ip in Json array.
-     *
-     * @return floating ip information in Json
-     */
-    @GET
-    @Path("fip")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getFloatingIp() {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_FIP));
-
-        KubevirtRouterService service = get(KubevirtRouterService.class);
-        final Iterable<KubevirtFloatingIp> fips = service.floatingIps();
-        return ok(encodeArray(KubevirtFloatingIp.class, FLOATING_IPS, fips)).build();
-    }
-
-    /**
-     * Creates the floating ip with specified input stream.
-     *
-     * @param inputStream floating ip Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @POST
-    @Path("fip")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createFloatingIp(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_FIP));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Updates the floating ip with specified input stream.
-     *
-     * @param inputStream floating ip Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @PUT
-    @Path("fip/{fipName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateFloatingIp(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_FIP));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Deletes the floating ip with specified input stream.
-     *
-     * @param inputStream floating ip Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @DELETE
-    @Path("fip/{fipName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteFloatingIp(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_FIP));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Obtains the loadbalaner in Json array.
-     *
-     * @return loadbalancer information in Json
-     */
-    @GET
-    @Path("lb")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLoadBalancer() {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_LB));
-
-        KubevirtLoadBalancerService service = get(KubevirtLoadBalancerService.class);
-        final Iterable<KubevirtLoadBalancer> lbs = service.loadBalancers();
-        return ok(encodeArray(KubevirtLoadBalancer.class, LOAD_BALANCERS, lbs)).build();
-    }
-
-    /**
-     * Creates the loadbalander with specified input stream.
-     *
-     * @param inputStream loadbalancer Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @POST
-    @Path("lb")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createLoadBalancer(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_LB));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Updates the loadbalander with specified input stream.
-     *
-     * @param inputStream loadbalancer Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @PUT
-    @Path("lb/{lbName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateLoadBalancer(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_LB));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    /**
-     * Deletes the loadbalander with specified input stream.
-     *
-     * @param inputStream loadbalancer Json inputstream
-     * @return 200 OK if succeeded
-     */
-    @DELETE
-    @Path("lb/{lbName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteLoadBalancer(InputStream inputStream) {
-        log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_LB));
-        //Just sends 200 OK for now.
-        return ok(mapper().createObjectNode()).build();
-    }
-}
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
deleted file mode 100644
index 4e8f5df..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResource.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2020-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 com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetworkAdminService;
-import org.onosproject.rest.AbstractWebResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import static org.onlab.util.Tools.nullIsNotFound;
-import static org.onlab.util.Tools.readTreeFromStream;
-
-/**
- * Handles REST API call from CNI plugin.
- */
-@Path("network")
-public class KubevirtNetworkWebResource extends AbstractWebResource {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final String MESSAGE = "Received network %s request";
-    private static final String NETWORK_NOT_FOUND = "Network is not found for";
-    private static final String NETWORK_INVALID = "Invalid networkId in network update request";
-
-    private static final String RESULT = "result";
-
-    /**
-     * Creates a network from the JSON input stream.
-     *
-     * @param input network JSON input stream
-     * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
-     * is invalid or duplicated network already exists
-     * @onos.rsModel KubevirtNetwork
-     */
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @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);
-            service.createNetwork(network);
-            location = new URI(network.networkId());
-        } catch (IOException | URISyntaxException e) {
-            throw new IllegalArgumentException(e);
-        }
-
-        return Response.created(location).build();
-    }
-
-    /**
-     * Updates the network with the specified identifier.
-     *
-     * @param id    network identifier
-     * @param input network JSON input stream
-     * @return 200 OK with the updated network, 400 BAD_REQUEST if the requested
-     * network does not exist
-     * @onos.rsModel KubevirtNetwork
-     */
-    @PUT
-    @Path("{id}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @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);
-            JsonNode specifiedNetworkId = jsonTree.get("networkId");
-
-            if (specifiedNetworkId != null && !specifiedNetworkId.asText().equals(id)) {
-                throw new IllegalArgumentException(NETWORK_INVALID);
-            }
-
-            final KubevirtNetwork network =
-                    codec(KubevirtNetwork.class).decode(jsonTree, this);
-            service.updateNetwork(network);
-        } catch (IOException e) {
-            throw new IllegalArgumentException(e);
-        }
-
-        return Response.ok().build();
-    }
-
-    /**
-     * Removes the network with the given id.
-     *
-     * @param id network identifier
-     * @return 204 NO_CONTENT, 400 BAD_REQUEST if the network does not exist
-     */
-    @DELETE
-    @Path("{id}")
-    public Response removeNetwork(@PathParam("id") String id) {
-        log.trace(String.format(MESSAGE, "DELETE " + id));
-        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
-
-        service.removeNetwork(id);
-        return Response.noContent().build();
-    }
-
-    /**
-     * Checks whether the network exists with given network id.
-     *
-     * @param id network identifier
-     * @return 200 OK with true/false result
-     */
-    @GET
-    @Path("exist/{id}")
-    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 = service.network(id);
-
-        if (network == null) {
-            root.put(RESULT, false);
-        } else {
-            root.put(RESULT, true);
-        }
-
-        return Response.ok(root).build();
-    }
-
-    /**
-     * Returns set of all networks.
-     *
-     * @return 200 OK with set of all networks
-     * @onos.rsModel KubevirtNetworks
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getNetworks() {
-        KubevirtNetworkAdminService service = get(KubevirtNetworkAdminService.class);
-        final Iterable<KubevirtNetwork> networks = service.networks();
-        return ok(encodeArray(KubevirtNetwork.class, "networks", networks)).build();
-    }
-
-    /**
-     * Returns the network with the specified identifier.
-     *
-     * @param id network identifier
-     * @return 200 OK with a network, 404 not found
-     * @onos.rsModel KubevirtNetwork
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("{id}")
-    public Response getNetworkById(@PathParam("id") String 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-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java
deleted file mode 100644
index 0280c6a..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java
+++ /dev/null
@@ -1,92 +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.codec.CodecService;
-import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtPort;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-import org.onosproject.kubevirtnetworking.codec.KubevirtFloatingIpCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtHostRouteCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtIpPoolCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtLoadBalancerCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtLoadBalancerRuleCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtNetworkCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtPortCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtRouterCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtSecurityGroupCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtSecurityGroupRuleCodec;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Implementation of the JSON codec brokering service for KubevirtNetworking.
- */
-@Component(immediate = true)
-public class KubevirtNetworkingCodecRegister {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected CodecService codecService;
-
-    @Activate
-    protected void activate() {
-
-        codecService.registerCodec(KubevirtHostRoute.class, new KubevirtHostRouteCodec());
-        codecService.registerCodec(KubevirtIpPool.class, new KubevirtIpPoolCodec());
-        codecService.registerCodec(KubevirtNetwork.class, new KubevirtNetworkCodec());
-        codecService.registerCodec(KubevirtPort.class, new KubevirtPortCodec());
-        codecService.registerCodec(KubevirtRouter.class, new KubevirtRouterCodec());
-        codecService.registerCodec(KubevirtFloatingIp.class, new KubevirtFloatingIpCodec());
-        codecService.registerCodec(KubevirtSecurityGroup.class, new KubevirtSecurityGroupCodec());
-        codecService.registerCodec(KubevirtSecurityGroupRule.class, new KubevirtSecurityGroupRuleCodec());
-        codecService.registerCodec(KubevirtLoadBalancer.class, new KubevirtLoadBalancerCodec());
-        codecService.registerCodec(KubevirtLoadBalancerRule.class, new KubevirtLoadBalancerRuleCodec());
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-
-        codecService.unregisterCodec(KubevirtHostRoute.class);
-        codecService.unregisterCodec(KubevirtIpPool.class);
-        codecService.unregisterCodec(KubevirtNetwork.class);
-        codecService.unregisterCodec(KubevirtPort.class);
-        codecService.unregisterCodec(KubevirtRouter.class);
-        codecService.unregisterCodec(KubevirtFloatingIp.class);
-        codecService.unregisterCodec(KubevirtSecurityGroup.class);
-        codecService.unregisterCodec(KubevirtSecurityGroupRule.class);
-        codecService.unregisterCodec(KubevirtLoadBalancer.class);
-        codecService.unregisterCodec(KubevirtLoadBalancerRule.class);
-
-        log.info("Stopped");
-    }
-}
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
deleted file mode 100644
index dc2afbc..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2020-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.onlab.rest.AbstractWebApplication;
-
-import java.util.Set;
-
-/**
- * KubeVirt networking REST APIs web application.
- */
-public class KubevirtNetworkingWebApplication extends AbstractWebApplication {
-    @Override
-    public Set<Class<?>> getClasses() {
-        return getClasses(
-                KubevirtNetworkWebResource.class,
-                KubevirtRouterWebResource.class,
-                KubevirtFloatingIpsWebResource.class,
-                KubevirtSecurityGroupWebResource.class,
-                KubevirtLoadBalancerWebResource.class,
-                KubevirtMm5WebResource.class
-        );
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtRouterWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtRouterWebResource.java
deleted file mode 100644
index 8a40f51..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtRouterWebResource.java
+++ /dev/null
@@ -1,52 +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.kubevirtnetworking.api.KubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
-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;
-
-/**
- * Handles REST API call for kubevirt router.
- */
-@Path("router")
-public class KubevirtRouterWebResource extends AbstractWebResource {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-    private static final String ROUTERS = "routers";
-
-    /**
-     * Returns set of all routers.
-     *
-     * @return 200 OK with set of all routers
-     * @onos.rsModel KubevirtRouters
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getRouters() {
-        KubevirtRouterService service = get(KubevirtRouterService.class);
-        final Iterable<KubevirtRouter> routers = service.routers();
-        return ok(encodeArray(KubevirtRouter.class, ROUTERS, routers)).build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtSecurityGroupWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtSecurityGroupWebResource.java
deleted file mode 100644
index 02acd87..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtSecurityGroupWebResource.java
+++ /dev/null
@@ -1,52 +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.kubevirtnetworking.api.KubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupService;
-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;
-
-/**
- * Handles REST API call for kubevirt security group.
- */
-@Path("security-group")
-public class KubevirtSecurityGroupWebResource extends AbstractWebResource {
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-    private static final String SECURITY_GROUPS = "security-groups";
-
-    /**
-     * Returns set of all security groups.
-     *
-     * @return 200 OK with set of all security groups
-     * @onos.rsModel KubevirtSecurityGroups
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSecurityGroups() {
-        KubevirtSecurityGroupService service = get(KubevirtSecurityGroupService.class);
-        final Iterable<KubevirtSecurityGroup> sgs = service.securityGroups();
-        return ok(encodeArray(KubevirtSecurityGroup.class, SECURITY_GROUPS, sgs)).build();
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/package-info.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/package-info.java
deleted file mode 100644
index bc4157c..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2020-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.
- */
-
-/**
- * KubeVirt networking web implementation.
- */
-package org.onosproject.kubevirtnetworking.web;
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtFloatingIps.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtFloatingIps.json
deleted file mode 100644
index 07a45e2..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtFloatingIps.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "type": "object",
-  "title": "floatingips",
-  "required": [
-    "floatingips"
-  ],
-  "properties": {
-    "floatingips": {
-      "type": "array",
-      "xml": {
-        "name": "floatingips",
-        "wrapped": true
-      },
-      "items": {
-        "type": "object",
-        "description": "A floating IP object.",
-        "required": [
-          "id",
-          "routerName",
-          "networkName",
-          "floatingIp",
-          "podName",
-          "fixedIp"
-        ],
-        "properties": {
-          "id": {
-            "type": "string",
-            "example": "6a073105-c735-4e53-8d74-64191c6985fe",
-            "description": "The ID of floating IP."
-          },
-          "routerName": {
-            "type": "string",
-            "example": "router-1",
-            "description": "Name of router."
-          },
-          "networkName": {
-            "type": "string",
-            "example": "flat-1",
-            "description": "Name of network."
-          },
-          "floatingIp": {
-            "type": "string",
-            "example": "10.10.10.5",
-            "description": "Floating IP address."
-          },
-          "podName": {
-            "type": "string",
-            "example": "pod-1",
-            "description": "Name of POD associated with this floating IP"
-          },
-          "fixedIp": {
-            "type": "string",
-            "example": "20.20.20.5",
-            "description": "Fixed IP address."
-          }
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtLoadBalancers.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtLoadBalancers.json
deleted file mode 100644
index f06aedf..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtLoadBalancers.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
-  "type": "object",
-  "title": "loadBalancers",
-  "required": [
-    "loadBalancers"
-  ],
-  "properties": {
-    "loadBalancers": {
-      "type": "array",
-      "xml": {
-        "name": "loadBalancers",
-        "wrapped": true
-      },
-      "items": {
-        "type": "object",
-        "description": "A load balancer object.",
-        "required": [
-          "name",
-          "description",
-          "networkId",
-          "vip",
-          "members",
-          "rules"
-        ],
-        "properties": {
-          "name": {
-            "type": "string",
-            "example": "lb-1",
-            "description": "The name of load balancer."
-          },
-          "description": {
-            "type": "string",
-            "example": "Example load balancer",
-            "description": "The description of load balancer."
-          },
-          "networkId": {
-            "type": "string",
-            "example": "net-1",
-            "description": "The name of network where the load balancer is attached to."
-          },
-          "vip": {
-            "type": "string",
-            "example": "10.10.10.10",
-            "description": "The virtual IP address of the load balancer."
-          },
-          "members": {
-            "type": "array",
-            "xml": {
-              "name": "members",
-              "wrapped": true
-            },
-            "items": {
-              "type": "string",
-              "example": "10.10.10.11",
-              "description": "IP address of member instance."
-            }
-          },
-          "rules": {
-            "type": "array",
-            "description": "A list of load balancer rule objects.",
-            "items": {
-              "type": "object",
-              "description": "A load balancer rule object.",
-              "required": [
-                "portRangeMax",
-                "portRangeMin",
-                "protocol"
-              ],
-              "properties": {
-                "portRangeMax": {
-                  "type": "integer",
-                  "format": "int32",
-                  "example": 80,
-                  "description": "The maximum port number in the range that is matched by the rule."
-                },
-                "portRangeMin": {
-                  "type": "integer",
-                  "format": "int32",
-                  "example": 80,
-                  "description": "The minimum port number in the range that is matched by the rule."
-                },
-                "protocol": {
-                  "type": "string",
-                  "example": "tcp",
-                  "description": "The IP protocol can be represented by a string, an integer, or null."
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetwork.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetwork.json
deleted file mode 100644
index 5653ae8..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetwork.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "type": "object",
-  "description": "A network object.",
-  "required": [
-    "networkId",
-    "type",
-    "name",
-    "segmentId",
-    "gatewayIp",
-    "cidr",
-    "mtu"
-  ],
-  "properties": {
-    "networkId": {
-      "type": "string",
-      "example": "sona-network",
-      "description": "The ID of the attached network."
-    },
-    "type": {
-      "type": "string",
-      "example": "VXLAN",
-      "description": "Type of kubernetes network."
-    },
-    "name": {
-      "type": "string",
-      "example": "sona-network",
-      "description": "The name of network."
-    },
-    "segmentId": {
-      "type": "string",
-      "example": "1",
-      "description": "Segment ID of tenant network."
-    },
-    "gatewayIp": {
-      "type": "string",
-      "example": "10.10.10.1",
-      "description": "The IP address of the gateway."
-    },
-    "cidr": {
-      "type": "string",
-      "example": "10.10.10.0/24",
-      "description": "The CIDR of this network."
-    },
-    "mtu": {
-      "type": "integer",
-      "example": 1500,
-      "description": "The Maximum Transmission Unit of this network."
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetworks.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetworks.json
deleted file mode 100644
index 5ce66f0..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtNetworks.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "type": "object",
-  "title": "networks",
-  "required": [
-    "networks"
-  ],
-  "properties": {
-    "networks": {
-      "type": "array",
-      "xml": {
-        "name": "networks",
-        "wrapped": true
-      },
-      "items": {
-        "type": "object",
-        "description": "A network object.",
-        "required": [
-          "networkId",
-          "type",
-          "name",
-          "segmentId",
-          "gatewayIp",
-          "cidr",
-          "mtu"
-        ],
-        "properties": {
-          "networkId": {
-            "type": "string",
-            "example": "sona-network",
-            "description": "The ID of the attached network."
-          },
-          "type": {
-            "type": "string",
-            "example": "VXLAN",
-            "description": "Type of kubernetes network."
-          },
-          "name": {
-            "type": "string",
-            "example": "sona-network",
-            "description": "The name of network."
-          },
-          "segmentId": {
-            "type": "string",
-            "example": "1",
-            "description": "Segment ID of tenant network."
-          },
-          "gatewayIp": {
-            "type": "string",
-            "example": "10.10.10.1",
-            "description": "The IP address of the gateway."
-          },
-          "cidr": {
-            "type": "string",
-            "example": "10.10.10.0/24",
-            "description": "The CIDR of this network."
-          },
-          "mtu": {
-            "type": "integer",
-            "example": 1500,
-            "description": "The Maximum Transmission Unit of this network."
-          }
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtRouters.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtRouters.json
deleted file mode 100644
index 835dfea..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtRouters.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  "type": "object",
-  "title": "routers",
-  "required": [
-    "routers"
-  ],
-  "properties": {
-    "routers": {
-      "type": "array",
-      "xml": {
-        "name": "routers",
-        "wrapped": true
-      },
-      "items": {
-        "type": "object",
-        "description": "A router object.",
-        "required": [
-          "name",
-          "enableSnat",
-          "mac",
-          "internal",
-          "external",
-          "peerRouter"
-        ],
-        "properties": {
-          "name": {
-            "type": "string",
-            "example": "router-1",
-            "description": "The name of router."
-          },
-          "enableSnat": {
-            "type": "boolean",
-            "example": "true",
-            "description": "Enable SNAT flag."
-          },
-          "mac": {
-            "type": "string",
-            "example": "11:22:33:44:55:66",
-            "description": "The MAC address of virtual router."
-          },
-          "internal": {
-            "type": "array",
-            "xml": {
-              "name": "internal",
-              "wrapped": true
-            },
-            "items": {
-              "type": "string",
-              "example": "vxlan-1",
-              "description": "name of internal network"
-            }
-          },
-          "external": {
-            "type": "object",
-            "description": "external networks",
-            "required": [
-              "ip",
-              "name"
-            ],
-            "properties": {
-              "ipaddress": {
-                "type": "string",
-                "example": "10.10.10.5",
-                "description": "Router IP address of the external network"
-              },
-              "name": {
-                "type": "string",
-                "example": "flat",
-                "description": "Name of the external network"
-              }
-            }
-          },
-          "peerRouter": {
-            "type": "object",
-            "description": "peer router",
-            "required": [
-              "ip",
-              "mac"
-            ],
-            "properties": {
-              "ipaddress": {
-                "type": "string",
-                "example": "10.10.10.1",
-                "description": "IP address of the peer router"
-              },
-              "mac": {
-                "type": "string",
-                "example": "11:22:33:44:55:66",
-                "description": "MAC address of the peer router"
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtSecurityGroups.json b/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtSecurityGroups.json
deleted file mode 100644
index bd724c9..0000000
--- a/apps/kubevirt-networking/app/src/main/resources/definitions/KubevirtSecurityGroups.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
-  "type": "object",
-  "description": "A security_group object.",
-  "required": [
-    "securityGroup"
-  ],
-  "properties": {
-    "securityGroup": {
-      "type": "object",
-      "required": [
-        "id",
-        "description",
-        "name",
-        "securityGroupRules"
-      ],
-      "properties": {
-        "id": {
-          "type": "string",
-          "example": "2076db17-a522-4506-91de-c6dd8e837028",
-          "description": "The ID of the security group."
-        },
-        "description": {
-          "type": "string",
-          "example": "security group for webservers",
-          "description": "A human-readable description for the resource."
-        },
-        "name": {
-          "type": "string",
-          "example": "new-webservers",
-          "description": "Human-readable name of the resource."
-        },
-        "securityGroupRules": {
-          "type": "array",
-          "description": "A list of security_group_rule objects.",
-          "items": {
-            "type": "object",
-            "description": "A security group rule object.",
-            "required": [
-              "id",
-              "securityGroupId",
-              "direction",
-              "etherType",
-              "portRangeMax",
-              "portRangeMin",
-              "protocol",
-              "remoteIpPrefix",
-              "remoteGroupId"
-            ],
-            "properties": {
-              "id": {
-                "type": "string",
-                "example": "2bc0accf-312e-429a-956e-e4407625eb62",
-                "description": "The ID of this security group rule."
-              },
-              "securityGroupId": {
-                "type": "string",
-                "example": "a7734e61-b545-452d-a3cd-0189cbd9747a",
-                "description": "The security group ID to associate with this security group rule."
-              },
-              "direction": {
-                "type": "string",
-                "example": "ingress",
-                "description": "Ingress or egress, which is the direction in which the metering rule is applied."
-              },
-              "etherType": {
-                "type": "string",
-                "example": "IPv4",
-                "description": "Must be IPv4 or IPv6, and addresses represented in CIDR must match the ingress or egress rules."
-              },
-              "portRangeMax": {
-                "type": "integer",
-                "format": "int32",
-                "example": 80,
-                "description": "The maximum port number in the range that is matched by the security group rule."
-              },
-              "portRangeMin": {
-                "type": "integer",
-                "format": "int32",
-                "example": 80,
-                "description": "The minimum port number in the range that is matched by the security group rule."
-              },
-              "protocol": {
-                "type": "string",
-                "example": "tcp",
-                "description": "The IP protocol can be represented by a string, an integer, or null."
-              },
-              "remoteIpPrefix": {
-                "type": "string",
-                "example": "",
-                "description": "The remote IP prefix to associate with this metering rule packet."
-              },
-              "remoteGroupId": {
-                "type": "string",
-                "example": "85cc3048-abc3-43cc-89b3-377341426ac5",
-                "description": "The remote group UUID to associate with this security group rule."
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/main/webapp/WEB-INF/web.xml b/apps/kubevirt-networking/app/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 0b4876a..0000000
--- a/apps/kubevirt-networking/app/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2020-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.
-  -->
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
-         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-         id="ONOS" version="2.5">
-    <display-name>KubeVirt Networking REST API v1.0</display-name>
-
-    <security-constraint>
-        <web-resource-collection>
-            <web-resource-name>Secured</web-resource-name>
-            <url-pattern>/*</url-pattern>
-        </web-resource-collection>
-        <auth-constraint>
-            <role-name>admin</role-name>
-            <role-name>viewer</role-name>
-        </auth-constraint>
-    </security-constraint>
-
-    <security-role>
-        <role-name>admin</role-name>
-        <role-name>viewer</role-name>
-    </security-role>
-
-    <login-config>
-        <auth-method>BASIC</auth-method>
-        <realm-name>karaf</realm-name>
-    </login-config>
-
-    <servlet>
-        <servlet-name>JAX-RS Service</servlet-name>
-        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
-        <init-param>
-            <param-name>javax.ws.rs.Application</param-name>
-            <param-value>org.onosproject.kubevirtnetworking.web.KubevirtNetworkingWebApplication</param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <servlet-mapping>
-        <servlet-name>JAX-RS Service</servlet-name>
-        <url-pattern>/*</url-pattern>
-    </servlet-mapping>
-</web-app>
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java
deleted file mode 100644
index 216f3e0..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java
+++ /dev/null
@@ -1,106 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.hamcrest.MatcherAssert;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.MockCodecContext;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtFloatingIp;
-import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import static junit.framework.TestCase.assertEquals;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtFloatingIpJsonMatcher.matchesKubevirtFloatingIp;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtFloatingIp codec.
- */
-public final class KubevirtFloatingIpCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtFloatingIp> kubevirtFloatingIpCodec;
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtFloatingIpCodec = new KubevirtFloatingIpCodec();
-
-        assertThat(kubevirtFloatingIpCodec, notNullValue());
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt floating IP encoding.
-     */
-    @Test
-    public void testKubevirtFloatingIpEncode() {
-        KubevirtFloatingIp floatingIp = DefaultKubevirtFloatingIp.builder()
-                .id("fip-id")
-                .routerName("router-1")
-                .networkName("flat-1")
-                .floatingIp(IpAddress.valueOf("10.10.10.10"))
-                .podName("pod-1")
-                .vmName("vm-1")
-                .fixedIp(IpAddress.valueOf("20.20.20.20"))
-                .build();
-
-        ObjectNode floatingIpJson = kubevirtFloatingIpCodec.encode(floatingIp, context);
-        assertThat(floatingIpJson, matchesKubevirtFloatingIp(floatingIp));
-    }
-
-    @Test
-    public void testKubevirtFloatingIpDecode() throws IOException {
-        KubevirtFloatingIp floatingIp = getKubevirtFloatingIp("KubevirtFloatingIp.json");
-
-        assertEquals("fip-1", floatingIp.id());
-        assertEquals("router-1", floatingIp.routerName());
-        assertEquals("flat-1", floatingIp.networkName());
-        assertEquals("10.10.10.10", floatingIp.floatingIp().toString());
-        assertEquals("pod-1", floatingIp.podName());
-        assertEquals("vm-1", floatingIp.vmName());
-        assertEquals("20.20.20.20", floatingIp.fixedIp().toString());
-    }
-
-    private KubevirtFloatingIp getKubevirtFloatingIp(String resourceName) throws IOException {
-        InputStream jsonStream = KubevirtFloatingIpCodecTest.class.getResourceAsStream(resourceName);
-        JsonNode json = context.mapper().readTree(jsonStream);
-        MatcherAssert.assertThat(json, notNullValue());
-        KubevirtFloatingIp fip = kubevirtFloatingIpCodec.decode((ObjectNode) json, context);
-        assertThat(fip, notNullValue());
-        return fip;
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java
deleted file mode 100644
index 41d8cfe..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java
+++ /dev/null
@@ -1,120 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
-
-/**
- * Hamcrest matcher for kubevirt router interface.
- */
-public final class KubevirtFloatingIpJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtFloatingIp floatingIp;
-    private static final String ID = "id";
-    private static final String ROUTER_NAME = "routerName";
-    private static final String NETWORK_NAME = "networkName";
-    private static final String POD_NAME = "podName";
-    private static final String VM_NAME = "vmName";
-    private static final String FLOATING_IP = "floatingIp";
-    private static final String FIXED_IP = "fixedIp";
-
-    private KubevirtFloatingIpJsonMatcher(KubevirtFloatingIp floatingIp) {
-        this.floatingIp = floatingIp;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-
-        // check ID
-        String jsonId = jsonNode.get(ID).asText();
-        String id = floatingIp.id();
-        if (!jsonId.equals(id)) {
-            description.appendText("ID was " + jsonId);
-            return false;
-        }
-
-        // check router name
-        String jsonRouterName = jsonNode.get(ROUTER_NAME).asText();
-        String routerName = floatingIp.routerName();
-        if (!jsonRouterName.equals(routerName)) {
-            description.appendText("Router name was " + jsonRouterName);
-            return false;
-        }
-
-        // check network name
-        String jsonNetworkName = jsonNode.get(NETWORK_NAME).asText();
-        String networkName = floatingIp.networkName();
-        if (!jsonNetworkName.equals(networkName)) {
-            description.appendText("Network name was " + jsonNetworkName);
-            return false;
-        }
-
-        // check floating IP
-        String jsonFip = jsonNode.get(FLOATING_IP).asText();
-        String fip = floatingIp.floatingIp().toString();
-        if (!jsonFip.equals(fip)) {
-            description.appendText("Floating IP was " + jsonFip);
-            return false;
-        }
-
-        // check POD name
-        JsonNode jsonPodName = jsonNode.get(POD_NAME);
-        if (jsonPodName != null) {
-            if (!floatingIp.podName().equals(jsonPodName.asText())) {
-                description.appendText("POD name was " + jsonPodName);
-                return false;
-            }
-        }
-
-        JsonNode jsonVmName = jsonNode.get(VM_NAME);
-        if (jsonVmName != null) {
-            if (!floatingIp.vmName().equals(jsonVmName.asText())) {
-                description.appendText("VM name was " + jsonVmName);
-                return false;
-            }
-        }
-
-
-        // check fixed IP
-        JsonNode jsonFixedIp = jsonNode.get(FIXED_IP);
-        if (jsonFixedIp != null) {
-            if (!floatingIp.fixedIp().toString().equals(jsonFixedIp.asText())) {
-                description.appendText("Fixed IP was " + jsonFixedIp);
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(floatingIp.toString());
-    }
-
-    /**
-     * Factory to allocate a kubevirt floating IP matcher.
-     *
-     * @param fip kubevirt floating IP object we are looking for
-     * @return matcher
-     */
-    public static KubevirtFloatingIpJsonMatcher matchesKubevirtFloatingIp(KubevirtFloatingIp fip) {
-        return new KubevirtFloatingIpJsonMatcher(fip);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteJsonMatcher.java
deleted file mode 100644
index 4603980..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtHostRouteJsonMatcher.java
+++ /dev/null
@@ -1,74 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-
-/**
- * Hamcrest matcher for kubevirt host route interface.
- */
-public final class KubevirtHostRouteJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtHostRoute hostRoute;
-
-    private static final String DESTINATION = "destination";
-    private static final String NEXTHOP = "nexthop";
-
-    private KubevirtHostRouteJsonMatcher(KubevirtHostRoute hostRoute) {
-        this.hostRoute = hostRoute;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check destination
-        String jsonDestination = jsonNode.get(DESTINATION).asText();
-        String destination = hostRoute.destination().toString();
-        if (!jsonDestination.equals(destination)) {
-            description.appendText("destination was " + jsonDestination);
-            return false;
-        }
-
-        // check nexthop
-        JsonNode jsonNexthop = jsonNode.get(NEXTHOP);
-        if (jsonNexthop != null) {
-            String nexthop = hostRoute.nexthop().toString();
-            if (!jsonNexthop.asText().equals(nexthop)) {
-                description.appendText("nexthop was " + jsonNexthop);
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(description.toString());
-    }
-
-    /**
-     * Factory to allocate an kubevirt host route matcher.
-     *
-     * @param route kubevirt host route object we are looking for
-     * @return matcher
-     */
-    public static KubevirtHostRouteJsonMatcher matchesKubevirtHostRoute(KubevirtHostRoute route) {
-        return new KubevirtHostRouteJsonMatcher(route);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolJsonMatcher.java
deleted file mode 100644
index 6217335..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtIpPoolJsonMatcher.java
+++ /dev/null
@@ -1,71 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-
-/**
- * Hamcrest matcher for kubevirt IP pool interface.
- */
-public final class KubevirtIpPoolJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtIpPool ipPool;
-    private static final String START = "start";
-    private static final String END = "end";
-
-    private KubevirtIpPoolJsonMatcher(KubevirtIpPool ipPool) {
-        this.ipPool = ipPool;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check start
-        String jsonStart = jsonNode.get(START).asText();
-        String start = ipPool.start().toString();
-        if (!jsonStart.equals(start)) {
-            description.appendText("start was " + jsonStart);
-            return false;
-        }
-
-        // check end
-        String jsonEnd = jsonNode.get(END).asText();
-        String end = ipPool.end().toString();
-        if (!jsonEnd.equals(end)) {
-            description.appendText("end was " + jsonEnd);
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(ipPool.toString());
-    }
-
-    /**
-     * Factory to allocate an kubevirt IP pool matcher.
-     *
-     * @param ipPool kubevirt IP pool object we are looking for
-     * @return matcher
-     */
-    public static KubevirtIpPoolJsonMatcher matchesKubevirtIpPool(KubevirtIpPool ipPool) {
-        return new KubevirtIpPoolJsonMatcher(ipPool);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java
deleted file mode 100644
index cd86402..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerCodecTest.java
+++ /dev/null
@@ -1,181 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.hamcrest.MatcherAssert;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtLoadBalancerRule;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtLoadBalancerJsonMatcher.matchesKubevirtLoadBalancer;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtLoadBalancer codec.
- */
-public final class KubevirtLoadBalancerCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtLoadBalancer> kubevirtLoadBalancerCodec;
-    JsonCodec<KubevirtLoadBalancerRule> kubevirtLoadBalancerRuleCodec;
-
-    private static final KubevirtLoadBalancerRule RULE1 = DefaultKubevirtLoadBalancerRule.builder()
-            .protocol("tcp")
-            .portRangeMax(8000)
-            .portRangeMin(7000)
-            .build();
-    private static final KubevirtLoadBalancerRule RULE2 = DefaultKubevirtLoadBalancerRule.builder()
-            .protocol("udp")
-            .portRangeMax(9000)
-            .portRangeMin(8000)
-            .build();
-
-    private static final KubevirtLoadBalancerRule RULE3 = DefaultKubevirtLoadBalancerRule.builder()
-            .protocol("icmp")
-            .build();
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtLoadBalancerCodec = new KubevirtLoadBalancerCodec();
-        kubevirtLoadBalancerRuleCodec = new KubevirtLoadBalancerRuleCodec();
-
-        assertThat(kubevirtLoadBalancerCodec, notNullValue());
-        assertThat(kubevirtLoadBalancerRuleCodec, notNullValue());
-
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt load balancer encoding.
-     */
-    @Test
-    public void testKubevirtLoadBalancerEncode() {
-        KubevirtLoadBalancer lb = DefaultKubevirtLoadBalancer.builder()
-                .name("lb-1")
-                .networkId("net-1")
-                .vip(IpAddress.valueOf("10.10.10.10"))
-                .members(ImmutableSet.of(IpAddress.valueOf("10.10.10.11"),
-                        IpAddress.valueOf("10.10.10.12")))
-                .rules(ImmutableSet.of(RULE1, RULE2, RULE3))
-                .description("network load balancer")
-                .build();
-
-        ObjectNode lbJson = kubevirtLoadBalancerCodec.encode(lb, context);
-        assertThat(lbJson, matchesKubevirtLoadBalancer(lb));
-    }
-
-    /**
-     * Tests the kubevirt load balancer decoding.
-     */
-    @Test
-    public void testKubevirtLoadBalancerDecode() throws IOException {
-        KubevirtLoadBalancer lb = getKubevirtLoadBalancer("KubevirtLoadBalancer.json");
-
-        assertThat(lb.name(), is("lb-1"));
-        assertThat(lb.description(), is("Example Load Balancer"));
-        assertThat(lb.networkId(), is("net-1"));
-        assertThat(lb.vip(), is(IpAddress.valueOf("10.10.10.10")));
-
-        Set<IpAddress> expectedMembers = ImmutableSet.of(IpAddress.valueOf("10.10.10.11"),
-                IpAddress.valueOf("10.10.10.12"));
-        Set<IpAddress> realMembers = lb.members();
-        assertThat(true, is(expectedMembers.containsAll(realMembers)));
-        assertThat(true, is(realMembers.containsAll(expectedMembers)));
-
-        Set<KubevirtLoadBalancerRule> expectedRules = ImmutableSet.of(RULE1, RULE2, RULE3);
-        Set<KubevirtLoadBalancerRule> realRules = lb.rules();
-        assertThat(true, is(expectedRules.containsAll(realRules)));
-        assertThat(true, is(realRules.containsAll(expectedRules)));
-    }
-
-    private KubevirtLoadBalancer getKubevirtLoadBalancer(String resourceName) throws IOException {
-        InputStream jsonStream = KubevirtLoadBalancerCodecTest.class.getResourceAsStream(resourceName);
-        JsonNode json = context.mapper().readTree(jsonStream);
-        MatcherAssert.assertThat(json, notNullValue());
-        KubevirtLoadBalancer lb = kubevirtLoadBalancerCodec.decode((ObjectNode) json, context);
-        assertThat(lb, notNullValue());
-        return lb;
-    }
-
-    private class MockCodecContext implements CodecContext {
-
-        private final ObjectMapper mapper = new ObjectMapper();
-        private final CodecManager manager = new CodecManager();
-        private final Map<Class<?>, Object> services = new HashMap<>();
-
-        /**
-         * Constructs a new mock codec context.
-         */
-        public MockCodecContext() {
-            manager.activate();
-        }
-
-        @Override
-        public ObjectMapper mapper() {
-            return mapper;
-        }
-
-        @Override
-        public <T> JsonCodec<T> codec(Class<T> entityClass) {
-            if (entityClass == KubevirtLoadBalancerRule.class) {
-                return (JsonCodec<T>) kubevirtLoadBalancerRuleCodec;
-            }
-            return manager.getCodec(entityClass);
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceClass) {
-            return (T) services.get(serviceClass);
-        }
-
-        // for registering mock services
-        public <T> void registerService(Class<T> serviceClass, T impl) {
-            services.put(serviceClass, impl);
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java
deleted file mode 100644
index 9122bd0..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerJsonMatcher.java
+++ /dev/null
@@ -1,144 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onlab.packet.IpAddress;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-
-/**
- * Hamcrest matcher for load balancer.
- */
-public final class KubevirtLoadBalancerJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String VIP = "vip";
-    private static final String NETWORK_ID = "networkId";
-    private static final String MEMBERS = "members";
-    private static final String RULES = "rules";
-
-    private final KubevirtLoadBalancer lb;
-
-    private KubevirtLoadBalancerJsonMatcher(KubevirtLoadBalancer lb) {
-        this.lb = lb;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check name
-        String jsonName = jsonNode.get(NAME).asText();
-        String name = lb.name();
-        if (!jsonName.equals(name)) {
-            description.appendText("Name was " + jsonName);
-            return false;
-        }
-
-        // check description
-        JsonNode jsonDescription = jsonNode.get(DESCRIPTION);
-        if (jsonDescription != null) {
-            String myDescription = lb.description();
-            if (!jsonDescription.asText().equals(myDescription)) {
-                description.appendText("Description was " + jsonDescription);
-                return false;
-            }
-        }
-
-        // check VIP
-        String jsonVip = jsonNode.get(VIP).asText();
-        String vip = lb.vip().toString();
-        if (!jsonVip.equals(vip)) {
-            description.appendText("VIP was " + jsonVip);
-            return false;
-        }
-
-        // check network ID
-        String jsonNetworkId = jsonNode.get(NETWORK_ID).asText();
-        String networkId = lb.networkId();
-        if (!jsonNetworkId.equals(networkId)) {
-            description.appendText("NetworkId was " + jsonNetworkId);
-            return false;
-        }
-
-        // check members
-        ArrayNode jsonMembers = (ArrayNode) jsonNode.get(MEMBERS);
-        if (jsonMembers != null) {
-            // check size of members array
-            if (jsonMembers.size() != lb.members().size()) {
-                description.appendText("Members was " + jsonMembers.size());
-                return false;
-            }
-
-            for (JsonNode jsonMember : jsonMembers) {
-                IpAddress member = IpAddress.valueOf(jsonMember.asText());
-                if (!lb.members().contains(member)) {
-                    description.appendText("Member not found " + jsonMember.toString());
-                    return false;
-                }
-            }
-        }
-
-        ArrayNode jsonRules = (ArrayNode) jsonNode.get(RULES);
-        if (jsonRules != null) {
-            // check size of rules array
-            if (jsonRules.size() != lb.rules().size()) {
-                description.appendText("Rules was " + jsonRules.size());
-                return false;
-            }
-
-            // check rules
-            for (KubevirtLoadBalancerRule rule : lb.rules()) {
-                boolean ruleFound = false;
-                for (int ruleIndex = 0; ruleIndex < jsonRules.size(); ruleIndex++) {
-                    KubevirtLoadBalancerRuleJsonMatcher ruleMatcher =
-                            KubevirtLoadBalancerRuleJsonMatcher
-                                    .matchesKubevirtLoadBalancerRule(rule);
-                    if (ruleMatcher.matches(jsonRules.get(ruleIndex))) {
-                        ruleFound = true;
-                        break;
-                    }
-                }
-
-                if (!ruleFound) {
-                    description.appendText("Rule not found " + rule.toString());
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(lb.toString());
-    }
-
-    /**
-     * Factory to allocate a kubevirt load balancer matcher.
-     *
-     * @param lb kubevirt load balancer object we are looking for
-     * @return matcher
-     */
-    public static KubevirtLoadBalancerJsonMatcher
-        matchesKubevirtLoadBalancer(KubevirtLoadBalancer lb) {
-        return new KubevirtLoadBalancerJsonMatcher(lb);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleJsonMatcher.java
deleted file mode 100644
index 404d1ee..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancerRuleJsonMatcher.java
+++ /dev/null
@@ -1,89 +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.codec;
-
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerRule;
-
-/**
- * Hamcrest matcher for kubevirt load balancer.
- */
-public final class KubevirtLoadBalancerRuleJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtLoadBalancerRule rule;
-
-    private static final String PROTOCOL = "protocol";
-    private static final String PORT_RANGE_MAX = "portRangeMax";
-    private static final String PORT_RANGE_MIN = "portRangeMin";
-
-    private KubevirtLoadBalancerRuleJsonMatcher(KubevirtLoadBalancerRule rule) {
-        this.rule = rule;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check protocol
-        JsonNode jsonProtocol = jsonNode.get(PROTOCOL);
-        if (jsonProtocol != null) {
-            String protocol = rule.protocol();
-            if (!jsonProtocol.asText().equals(protocol)) {
-                description.appendText("Protocol was " + jsonProtocol);
-                return false;
-            }
-        }
-
-        // check port range max
-        JsonNode jsonPortRangeMax = jsonNode.get(PORT_RANGE_MAX);
-        if (jsonPortRangeMax != null) {
-            int portRangeMax = rule.portRangeMax();
-            if (portRangeMax != jsonPortRangeMax.asInt()) {
-                description.appendText("PortRangeMax was " + jsonPortRangeMax);
-                return false;
-            }
-        }
-
-        // check port range min
-        JsonNode jsonPortRangeMin = jsonNode.get(PORT_RANGE_MIN);
-        if (jsonPortRangeMin != null) {
-            int portRangeMin = rule.portRangeMin();
-            if (portRangeMin != jsonPortRangeMin.asInt()) {
-                description.appendText("PortRangeMin was " + jsonPortRangeMin);
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(rule.toString());
-    }
-
-    /**
-     * Factory to allocate an kubevirt load balancer rule matcher.
-     *
-     * @param rule kubevirt load balancer rule object we are looking for
-     * @return matcher
-     */
-    public static KubevirtLoadBalancerRuleJsonMatcher
-        matchesKubevirtLoadBalancerRule(KubevirtLoadBalancerRule rule) {
-        return new KubevirtLoadBalancerRuleJsonMatcher(rule);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java
deleted file mode 100644
index 667ca4b..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkCodecTest.java
+++ /dev/null
@@ -1,184 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.hamcrest.MatcherAssert;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtNetworkJsonMatcher.matchesKubevirtNetwork;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtNetwork codec.
- */
-public final class KubevirtNetworkCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtNetwork> kubevirtNetworkCodec;
-    JsonCodec<KubevirtHostRoute> kubevirtHostRouteCodec;
-    JsonCodec<KubevirtIpPool> kubevirtIpPoolCodec;
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtNetworkCodec = new KubevirtNetworkCodec();
-        kubevirtHostRouteCodec = new KubevirtHostRouteCodec();
-        kubevirtIpPoolCodec = new KubevirtIpPoolCodec();
-
-        assertThat(kubevirtNetworkCodec, notNullValue());
-        assertThat(kubevirtHostRouteCodec, notNullValue());
-        assertThat(kubevirtIpPoolCodec, notNullValue());
-
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt network encoding.
-     */
-    @Test
-    public void testKubevirtNetworkEncode() {
-        KubevirtHostRoute hostRoute1 = new KubevirtHostRoute(IpPrefix.valueOf("10.10.10.0/24"),
-                IpAddress.valueOf("20.20.20.1"));
-        KubevirtHostRoute hostRoute2 = new KubevirtHostRoute(IpPrefix.valueOf("20.20.20.0/24"),
-                IpAddress.valueOf("10.10.10.1"));
-
-        KubevirtIpPool ipPool = new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
-                IpAddress.valueOf("10.10.10.200"));
-
-        KubevirtNetwork network = DefaultKubevirtNetwork.builder()
-                .networkId("net-1")
-                .name("net-1")
-                .type(KubevirtNetwork.Type.FLAT)
-                .gatewayIp(IpAddress.valueOf("10.10.10.1"))
-                .defaultRoute(true)
-                .mtu(1500)
-                .cidr("10.10.10.0/24")
-                .hostRoutes(ImmutableSet.of(hostRoute1, hostRoute2))
-                .ipPool(ipPool)
-                .dnses(ImmutableSet.of(IpAddress.valueOf("8.8.8.8")))
-                .build();
-
-        ObjectNode networkJson = kubevirtNetworkCodec.encode(network, context);
-        assertThat(networkJson, matchesKubevirtNetwork(network));
-    }
-
-    /**
-     * Tests the kubevirt network decoding.
-     *
-     * @throws IOException io exception
-     */
-    @Test
-    public void testKubevirtNetworkDecode() throws IOException {
-        KubevirtNetwork network = getKubevirtNetwork("KubevirtNetwork.json");
-
-        assertThat(network.networkId(), is("network-1"));
-        assertThat(network.name(), is("network-1"));
-        assertThat(network.type().name(), is("FLAT"));
-        assertThat(network.cidr(), is("10.10.0.0/24"));
-        assertThat(network.gatewayIp().toString(), is("10.10.0.1"));
-        assertThat(network.defaultRoute(), is(true));
-        assertThat(network.ipPool().start().toString(), is("10.10.10.100"));
-        assertThat(network.ipPool().end().toString(), is("10.10.10.200"));
-        assertThat(network.dnses().size(), is(1));
-        KubevirtHostRoute route = network.hostRoutes().stream().findFirst().orElse(null);
-        assertThat(route, is(new KubevirtHostRoute(IpPrefix.valueOf("10.10.10.0/24"),
-                IpAddress.valueOf("10.10.10.1"))));
-    }
-
-    private KubevirtNetwork getKubevirtNetwork(String resourceName) throws IOException {
-        InputStream jsonStream = KubevirtNetworkCodecTest.class.getResourceAsStream(resourceName);
-        JsonNode json = context.mapper().readTree(jsonStream);
-        MatcherAssert.assertThat(json, notNullValue());
-        KubevirtNetwork network = kubevirtNetworkCodec.decode((ObjectNode) json, context);
-        assertThat(network, notNullValue());
-        return network;
-    }
-
-    private class MockCodecContext implements CodecContext {
-
-        private final ObjectMapper mapper = new ObjectMapper();
-        private final CodecManager manager = new CodecManager();
-        private final Map<Class<?>, Object> services = new HashMap<>();
-
-        /**
-         * Constructs a new mock codec context.
-         */
-        public MockCodecContext() {
-            manager.activate();
-        }
-
-        @Override
-        public ObjectMapper mapper() {
-            return mapper;
-        }
-
-        @Override
-        public <T> JsonCodec<T> codec(Class<T> entityClass) {
-            if (entityClass == KubevirtHostRoute.class) {
-                return (JsonCodec<T>) kubevirtHostRouteCodec;
-            }
-
-            if (entityClass == KubevirtIpPool.class) {
-                return (JsonCodec<T>) kubevirtIpPoolCodec;
-            }
-
-            return manager.getCodec(entityClass);
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceClass) {
-            return (T) services.get(serviceClass);
-        }
-
-        // for registering mock services
-        public <T> void registerService(Class<T> serviceClass, T impl) {
-            services.put(serviceClass, impl);
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonArrayMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonArrayMatcher.java
deleted file mode 100644
index 6701c7b..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonArrayMatcher.java
+++ /dev/null
@@ -1,68 +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.codec;
-
-import com.eclipsesource.json.JsonArray;
-import com.eclipsesource.json.JsonObject;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-
-public final class KubevirtNetworkJsonArrayMatcher extends TypeSafeMatcher<JsonArray> {
-
-    private final KubevirtNetwork network;
-    private String reason = "";
-
-    public KubevirtNetworkJsonArrayMatcher(KubevirtNetwork network) {
-        this.network = network;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonArray json) {
-        boolean networkFound = false;
-        for (int jsonNetworkIndex = 0; jsonNetworkIndex < json.size(); jsonNetworkIndex++) {
-            final JsonObject jsonNode = json.get(jsonNetworkIndex).asObject();
-
-            final String networkId = network.networkId();
-            final String jsonNetworkId = jsonNode.get("networkId").asString();
-            if (jsonNetworkId.equals(networkId)) {
-                networkFound = true;
-            }
-        }
-
-        if (!networkFound) {
-            reason = "Network with networkId " + network.networkId() + " not found";
-            return false;
-        } else {
-            return true;
-        }
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(reason);
-    }
-
-    /**
-     * Factory to allocate a network array matcher.
-     *
-     * @param network network object we are looking for
-     * @return matcher
-     */
-    public static KubevirtNetworkJsonArrayMatcher hasNetwork(KubevirtNetwork network) {
-        return new KubevirtNetworkJsonArrayMatcher(network);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java
deleted file mode 100644
index 7cbc587..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtNetworkJsonMatcher.java
+++ /dev/null
@@ -1,200 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onlab.packet.IpAddress;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-
-/**
- * Hamcrest matcher for kubevirt network.
- */
-public final class KubevirtNetworkJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtNetwork network;
-    private static final String NETWORK_ID = "networkId";
-    private static final String TYPE = "type";
-    private static final String NAME = "name";
-    private static final String MTU = "mtu";
-    private static final String SEGMENT_ID = "segmentId";
-    private static final String GATEWAY_IP = "gatewayIp";
-    private static final String DEFAULT_ROUTE = "defaultRoute";
-    private static final String CIDR = "cidr";
-    private static final String HOST_ROUTES = "hostRoutes";
-    private static final String IP_POOL = "ipPool";
-    private static final String DNSES = "dnses";
-
-    private KubevirtNetworkJsonMatcher(KubevirtNetwork network) {
-        this.network = network;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check network ID
-        String jsonNetworkId = jsonNode.get(NETWORK_ID).asText();
-        String networkId = network.networkId();
-        if (!jsonNetworkId.equals(networkId)) {
-            description.appendText("network ID was " + jsonNetworkId);
-            return false;
-        }
-
-        // check type
-        String jsonType = jsonNode.get(TYPE).asText();
-        String type = network.type().name();
-        if (!jsonType.equals(type)) {
-            description.appendText("network type was " + jsonType);
-            return false;
-        }
-
-        // check name
-        String jsonName = jsonNode.get(NAME).asText();
-        String name = network.name();
-        if (!jsonName.equals(name)) {
-            description.appendText("network name was " + jsonName);
-            return false;
-        }
-
-        // check MTU
-        int jsonMtu = jsonNode.get(MTU).asInt();
-        int mtu = network.mtu();
-        if (jsonMtu != mtu) {
-            description.appendText("network MTU was " + jsonMtu);
-            return false;
-        }
-
-        // check gateway IP
-        String jsonGatewayIp = jsonNode.get(GATEWAY_IP).asText();
-        String gatewayIp = network.gatewayIp().toString();
-        if (!jsonGatewayIp.equals(gatewayIp)) {
-            description.appendText("gateway IP was " + jsonGatewayIp);
-            return false;
-        }
-
-        // check default route
-        boolean jsonDefaultRoute = jsonNode.get(DEFAULT_ROUTE).asBoolean();
-        boolean defaultRoute = network.defaultRoute();
-        if (jsonDefaultRoute != defaultRoute) {
-            description.appendText("Default route was " + jsonDefaultRoute);
-            return false;
-        }
-
-        // check CIDR
-        String jsonCidr = jsonNode.get(CIDR).asText();
-        String cidr = network.cidr();
-        if (!jsonCidr.equals(cidr)) {
-            description.appendText("CIDR was " + jsonCidr);
-            return false;
-        }
-
-        // check segment ID
-        JsonNode jsonSegmentId = jsonNode.get(SEGMENT_ID);
-        if (jsonSegmentId != null) {
-            String segmentId = network.segmentId();
-            if (!jsonSegmentId.asText().equals(segmentId)) {
-                description.appendText("segment ID was " + jsonSegmentId.asText());
-                return false;
-            }
-        }
-
-        // check ip pool
-        JsonNode jsonIpPool = jsonNode.get(IP_POOL);
-        if (jsonIpPool != null) {
-            KubevirtIpPool ipPool = network.ipPool();
-            KubevirtIpPoolJsonMatcher ipPoolMatcher =
-                    KubevirtIpPoolJsonMatcher.matchesKubevirtIpPool(ipPool);
-            if (ipPoolMatcher.matches(jsonIpPool)) {
-                return true;
-            } else {
-                description.appendText("IP pool was " + jsonIpPool.toString());
-                return false;
-            }
-        }
-
-        // check host routes
-        JsonNode jsonHostRoutes = jsonNode.get(HOST_ROUTES);
-        if (jsonHostRoutes != null) {
-            if (jsonHostRoutes.size() != network.hostRoutes().size()) {
-                description.appendText("host routes size was " + jsonHostRoutes.size());
-                return false;
-            }
-
-            for (KubevirtHostRoute hostRoute : network.hostRoutes()) {
-                boolean routeFound = false;
-                for (int routeIndex = 0; routeIndex < jsonHostRoutes.size(); routeIndex++) {
-                    KubevirtHostRouteJsonMatcher routeMatcher =
-                            KubevirtHostRouteJsonMatcher.matchesKubevirtHostRoute(hostRoute);
-                    if (routeMatcher.matches(jsonHostRoutes.get(routeIndex))) {
-                        routeFound = true;
-                        break;
-                    }
-                }
-
-                if (!routeFound) {
-                    description.appendText("Host route not found " + hostRoute.toString());
-                    return false;
-                }
-            }
-        }
-
-        // check dnses
-        JsonNode jsonDnses = jsonNode.get(DNSES);
-        if (jsonDnses != null) {
-            if (jsonDnses.size() != network.dnses().size()) {
-                description.appendText("DNSes size was " + jsonDnses.size());
-                return false;
-            }
-
-
-            for (IpAddress dns : network.dnses()) {
-                boolean dnsFound = false;
-                for (int dnsIndex = 0; dnsIndex < jsonDnses.size(); dnsIndex++) {
-                    String jsonDns = jsonDnses.get(dnsIndex).asText();
-                    if (jsonDns.equals(dns.toString())) {
-                        dnsFound = true;
-                        break;
-                    }
-                }
-
-                if (!dnsFound) {
-                    description.appendText("DNS not found " + dns.toString());
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(network.toString());
-    }
-
-    /**
-     * Factory to allocate an kubevirt network matcher.
-     *
-     * @param network kubevirt network object we are looking for
-     * @return matcher
-     */
-    public static KubevirtNetworkJsonMatcher
-                    matchesKubevirtNetwork(KubevirtNetwork network) {
-        return new KubevirtNetworkJsonMatcher(network);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java
deleted file mode 100644
index 5c21a28..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java
+++ /dev/null
@@ -1,121 +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.codec;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
-import org.onosproject.kubevirtnetworking.api.KubevirtPort;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtPortJsonMatcher.matchesKubevirtPort;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtPort codec.
- */
-public final class KubevirtPortCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtPort> kubevirtPortCodec;
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtPortCodec = new KubevirtPortCodec();
-
-        assertThat(kubevirtPortCodec, notNullValue());
-
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt port encoding.
-     */
-    @Test
-    public void testKubevirtPortEncode() {
-        KubevirtPort port = DefaultKubevirtPort.builder()
-                .vmName("test-vm-1")
-                .networkId("net-1")
-                .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
-                .ipAddress(IpAddress.valueOf("10.10.10.100"))
-                .deviceId(DeviceId.deviceId("of:foo"))
-                .portNumber(PortNumber.portNumber("1"))
-                .build();
-        ObjectNode portJson = kubevirtPortCodec.encode(port, context);
-        assertThat(portJson, matchesKubevirtPort(port));
-    }
-
-    private class MockCodecContext implements CodecContext {
-
-        private final ObjectMapper mapper = new ObjectMapper();
-        private final CodecManager manager = new CodecManager();
-        private final Map<Class<?>, Object> services = new HashMap<>();
-
-        /**
-         * Constructs a new mock codec context.
-         */
-        public MockCodecContext() {
-            manager.activate();
-        }
-
-        @Override
-        public ObjectMapper mapper() {
-            return mapper;
-        }
-
-        @Override
-        public <T> JsonCodec<T> codec(Class<T> entityClass) {
-            return manager.getCodec(entityClass);
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceClass) {
-            return (T) services.get(serviceClass);
-        }
-
-        // for registering mock services
-        public <T> void registerService(Class<T> serviceClass, T impl) {
-            services.put(serviceClass, impl);
-        }
-    }
-}
-
-
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java
deleted file mode 100644
index 1fc6207..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java
+++ /dev/null
@@ -1,116 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onlab.packet.IpAddress;
-import org.onosproject.kubevirtnetworking.api.KubevirtPort;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-
-/**
- * Hamcrest matcher for kubevirt port.
- */
-public final class KubevirtPortJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtPort port;
-
-    private static final String VM_NAME = "vmName";
-    private static final String NETWORK_ID = "networkId";
-    private static final String MAC_ADDRESS = "macAddress";
-    private static final String IP_ADDRESS = "ipAddress";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String PORT_NUMBER = "portNumber";
-
-    private KubevirtPortJsonMatcher(KubevirtPort port) {
-        this.port = port;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check VM name
-        String jsonVmName = jsonNode.get(VM_NAME).asText();
-        String vmName = port.vmName();
-        if (!jsonVmName.equals(vmName)) {
-            description.appendText("VM name was " + jsonVmName);
-            return false;
-        }
-
-        // check network ID
-        String jsonNetworkId = jsonNode.get(NETWORK_ID).asText();
-        String networkId = port.networkId();
-        if (!jsonNetworkId.equals(networkId)) {
-            description.appendText("network ID was " + jsonNetworkId);
-            return false;
-        }
-
-        // check MAC address
-        String jsonMacAddress = jsonNode.get(MAC_ADDRESS).asText();
-        String macAddress = port.macAddress().toString();
-        if (!jsonMacAddress.equals(macAddress)) {
-            description.appendText("MAC address was " + jsonMacAddress);
-            return false;
-        }
-
-        // check IP address
-        JsonNode jsonIpAddress = jsonNode.get(IP_ADDRESS);
-        if (jsonIpAddress != null) {
-            IpAddress ipAddress = port.ipAddress();
-            if (!jsonIpAddress.asText().equals(ipAddress.toString())) {
-                description.appendText("IP address was " + jsonIpAddress.asText());
-                return false;
-            }
-        }
-
-        // check device ID
-        JsonNode jsonDeviceId = jsonNode.get(DEVICE_ID);
-        if (jsonDeviceId != null) {
-            DeviceId deviceId = port.deviceId();
-            if (!jsonDeviceId.asText().equals(deviceId.toString())) {
-                description.appendText("Device ID was " + jsonDeviceId.asText());
-                return false;
-            }
-        }
-
-        // check port number
-        JsonNode jsonPortNumber = jsonNode.get(PORT_NUMBER);
-        if (jsonPortNumber != null) {
-            PortNumber portNUmber = port.portNumber();
-            if (!jsonPortNumber.asText().equals(portNUmber.toString())) {
-                description.appendText("Port number was " + jsonPortNumber.asText());
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(port.toString());
-    }
-    /**
-     * Factory to allocate an kubevirt port matcher.
-     *
-     * @param port kubevirt port object we are looking for
-     * @return matcher
-     */
-    public static KubevirtPortJsonMatcher matchesKubevirtPort(KubevirtPort port) {
-        return new KubevirtPortJsonMatcher(port);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java
deleted file mode 100644
index 1ff8951..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterCodecTest.java
+++ /dev/null
@@ -1,119 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import org.hamcrest.MatcherAssert;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.MockCodecContext;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtPeerRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtRouterJsonMatcher.matchesKubevirtRouter;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtRouter codec.
- */
-public final class KubevirtRouterCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtRouter> kubevirtRouterCodec;
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtRouterCodec = new KubevirtRouterCodec();
-
-        assertThat(kubevirtRouterCodec, notNullValue());
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt router encoding.
-     */
-    @Test
-    public void testKubevirtRouterEncode() {
-        KubevirtPeerRouter peerRouter = new KubevirtPeerRouter(IpAddress.valueOf("10.10.10.10"),
-                MacAddress.valueOf("11:22:33:44:55:66"));
-
-        KubevirtRouter router = DefaultKubevirtRouter.builder()
-                .name("router-1")
-                .enableSnat(true)
-                .mac(MacAddress.valueOf("11:22:33:44:55:66"))
-                .description("router-1")
-                .internal(ImmutableSet.of("vlan-1"))
-                .external(ImmutableMap.of("10.10.10.20", "flat-1"))
-                .peerRouter(peerRouter)
-                .electedGateway("gatewayNode")
-                .build();
-
-        ObjectNode routerJson = kubevirtRouterCodec.encode(router, context);
-        assertThat(routerJson, matchesKubevirtRouter(router));
-    }
-
-    @Test
-    public void testKubevirtRouterDecode() throws IOException {
-        KubevirtRouter router = getKubevirtRouter("KubevirtRouter.json");
-
-        assertEquals("router-1", router.name());
-        assertEquals("Example Virtual Router", router.description());
-        assertTrue(router.enableSnat());
-        assertEquals("11:22:33:44:55:66", router.mac().toString());
-        assertEquals("192.168.10.5",
-                router.external().keySet().stream().findAny().orElse(null));
-        assertEquals("external-network", router.external().get("192.168.10.5"));
-        assertTrue(router.internal().contains("vxlan-network-1"));
-        assertTrue(router.internal().contains("vxlan-network-2"));
-        assertEquals("192.168.10.1", router.peerRouter().ipAddress().toString());
-        assertEquals("gatewayNode", router.electedGateway());
-    }
-
-    private KubevirtRouter getKubevirtRouter(String resourceName) throws IOException {
-        InputStream jsonStream = KubevirtRouterCodecTest.class.getResourceAsStream(resourceName);
-        JsonNode json = context.mapper().readTree(jsonStream);
-        MatcherAssert.assertThat(json, notNullValue());
-        KubevirtRouter router = kubevirtRouterCodec.decode((ObjectNode) json, context);
-        assertThat(router, notNullValue());
-        return router;
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java
deleted file mode 100644
index a855f42..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtRouterJsonMatcher.java
+++ /dev/null
@@ -1,172 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-
-/**
- * Hamcrest matcher for kubevirt router interface.
- */
-public final class KubevirtRouterJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtRouter router;
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String ENABLE_SNAT = "enableSnat";
-    private static final String INTERNAL = "internal";
-    private static final String EXTERNAL = "external";
-    private static final String PEER_ROUTER = "peerRouter";
-    private static final String IP_ADDRESS = "ip";
-    private static final String MAC_ADDRESS = "mac";
-    private static final String NETWORK = "network";
-
-    private KubevirtRouterJsonMatcher(KubevirtRouter router) {
-        this.router = router;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-
-        // check name
-        String jsonName = jsonNode.get(NAME).asText();
-        String name = router.name();
-        if (!jsonName.equals(name)) {
-            description.appendText("Name was " + jsonName);
-            return false;
-        }
-
-        // check description
-        JsonNode jsonDescription = jsonNode.get(DESCRIPTION);
-        if (jsonDescription != null) {
-            String myDescription = router.description();
-            if (!jsonDescription.asText().equals(myDescription)) {
-                description.appendText("Description was " + jsonDescription);
-                return false;
-            }
-        }
-
-        // check enable snat
-        JsonNode jsonEnableSnat = jsonNode.get(ENABLE_SNAT);
-        if (jsonEnableSnat != null) {
-            boolean enableSnat = router.enableSnat();
-            if (jsonEnableSnat.asBoolean() != enableSnat) {
-                description.appendText("EnableSNAT was " + jsonEnableSnat);
-                return false;
-            }
-        }
-
-        // check vrouter MAC
-        String jsonMac = jsonNode.get(MAC_ADDRESS).asText();
-        String mac = router.mac().toString();
-        if (!jsonMac.equals(mac)) {
-            description.appendText("MAC was " + jsonMac);
-            return false;
-        }
-
-        // check internal
-        JsonNode jsonInternal = jsonNode.get(INTERNAL);
-        if (jsonInternal != null) {
-            if (jsonInternal.size() != router.internal().size()) {
-                description.appendText("Internal networks size was " + jsonInternal.size());
-                return false;
-            }
-
-            for (int networkIndex = 0; networkIndex < jsonInternal.size(); networkIndex++) {
-                boolean networkFound = false;
-                String jsonNetwork = jsonInternal.get(networkIndex).asText();
-                if (router.internal().contains(jsonNetwork)) {
-                    networkFound = true;
-                }
-
-                if (!networkFound) {
-                    description.appendText("network not found " + jsonNetwork);
-                    return false;
-                }
-            }
-        }
-
-        // check external
-        ArrayNode jsonExternal = (ArrayNode) jsonNode.get(EXTERNAL);
-        if (jsonExternal != null) {
-            if (jsonExternal.size() != router.external().size()) {
-                description.appendText("External networks size was " + jsonExternal.size());
-                return false;
-            }
-
-            for (int itemIndex = 0; itemIndex < jsonExternal.size(); itemIndex++) {
-                boolean itemFound = false;
-                ObjectNode jsonItem = (ObjectNode) jsonExternal.get(itemIndex);
-                String jsonIp = jsonItem.get(IP_ADDRESS).asText();
-                String jsonNetwork = jsonItem.get(NETWORK).asText();
-
-                if (router.external().containsKey(jsonIp)) {
-                    if (router.external().get(jsonIp).equals(jsonNetwork)) {
-                        itemFound = true;
-                    }
-                }
-
-                if (!itemFound) {
-                    description.appendText("External not found " + jsonItem.toString());
-                    return false;
-                }
-            }
-        }
-
-        // check peer router
-        ObjectNode jsonPeerRouter = (ObjectNode) jsonNode.get(PEER_ROUTER);
-        if (jsonPeerRouter != null) {
-            JsonNode jsonIp = jsonPeerRouter.get(IP_ADDRESS);
-
-            if (jsonIp != null) {
-                if (!jsonIp.asText().equals(router.peerRouter().ipAddress().toString())) {
-                    description.appendText("Peer router IP was " + jsonIp);
-                    return false;
-                }
-            }
-
-            JsonNode jsonProuterMac = jsonPeerRouter.get(MAC_ADDRESS);
-
-            if (jsonProuterMac != null) {
-                if (!jsonProuterMac.asText().equals(router.peerRouter().macAddress().toString())) {
-                    description.appendText("Peer router MAC was " + jsonMac);
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(router.toString());
-    }
-
-    /**
-     * Factory to allocate a kubevirt router matcher.
-     *
-     * @param router kubevirt router object we are looking for
-     * @return matcher
-     */
-    public static KubevirtRouterJsonMatcher matchesKubevirtRouter(KubevirtRouter router) {
-        return new KubevirtRouterJsonMatcher(router);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodecTest.java
deleted file mode 100644
index 51bdeb5..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupCodecTest.java
+++ /dev/null
@@ -1,173 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.hamcrest.MatcherAssert;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.core.CoreService;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtSecurityGroupRule;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import static junit.framework.TestCase.assertEquals;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onosproject.kubevirtnetworking.codec.KubevirtSecurityGroupJsonMatcher.matchesKubevirtSecurityGroup;
-import static org.onosproject.net.NetTestTools.APP_ID;
-
-/**
- * Unit tests for KubevirtSecurityGroup codec.
- */
-public final class KubevirtSecurityGroupCodecTest {
-
-    MockCodecContext context;
-
-    JsonCodec<KubevirtSecurityGroup> kubevirtSecurityGroupCodec;
-    JsonCodec<KubevirtSecurityGroupRule> kubevirtSecurityGroupRuleCodec;
-
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        kubevirtSecurityGroupCodec = new KubevirtSecurityGroupCodec();
-        kubevirtSecurityGroupRuleCodec = new KubevirtSecurityGroupRuleCodec();
-
-        assertThat(kubevirtSecurityGroupCodec, notNullValue());
-        assertThat(kubevirtSecurityGroupRuleCodec, notNullValue());
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the kubevirt security group encoding.
-     */
-    @Test
-    public void testKubevirtSecurityGroupEncode() {
-        KubevirtSecurityGroupRule rule = DefaultKubevirtSecurityGroupRule.builder()
-                .id("sgr-1")
-                .securityGroupId("sg-1")
-                .direction("ingress")
-                .etherType("IPv4")
-                .portRangeMin(0)
-                .portRangeMax(80)
-                .protocol("tcp")
-                .remoteIpPrefix(IpPrefix.valueOf("0.0.0.0/0"))
-                .remoteGroupId("g-1")
-                .build();
-
-        KubevirtSecurityGroup sg = DefaultKubevirtSecurityGroup.builder()
-                .id("sg-1")
-                .name("sg")
-                .description("example-sg")
-                .rules(ImmutableSet.of(rule))
-                .build();
-
-        ObjectNode sgJson = kubevirtSecurityGroupCodec.encode(sg, context);
-        assertThat(sgJson, matchesKubevirtSecurityGroup(sg));
-    }
-
-    /**
-     * Tests the kubevirt security group decoding.
-     */
-    @Test
-    public void testKubevirtSecurityGroupDecode() throws IOException {
-        KubevirtSecurityGroup sg = getKubevirtSecurityGroup("KubevirtSecurityGroup.json");
-        KubevirtSecurityGroupRule rule = sg.rules().stream().findAny().orElse(null);
-
-        assertEquals("sg-1", sg.id());
-        assertEquals("sg", sg.name());
-        assertEquals("example-sg", sg.description());
-
-        assertEquals("sgr-1", rule.id());
-        assertEquals("sg-1", rule.securityGroupId());
-        assertEquals("ingress", rule.direction());
-        assertEquals("IPv4", rule.etherType());
-        assertEquals((Integer) 80, rule.portRangeMax());
-        assertEquals((Integer) 0, rule.portRangeMin());
-        assertEquals("tcp", rule.protocol());
-        assertEquals("0.0.0.0/0", rule.remoteIpPrefix().toString());
-        assertEquals("g-1", rule.remoteGroupId());
-    }
-
-    private KubevirtSecurityGroup getKubevirtSecurityGroup(String resourceName) throws IOException {
-        InputStream jsonStream = KubevirtSecurityGroupCodecTest.class.getResourceAsStream(resourceName);
-        JsonNode json = context.mapper().readTree(jsonStream);
-        MatcherAssert.assertThat(json, notNullValue());
-        KubevirtSecurityGroup sg = kubevirtSecurityGroupCodec.decode((ObjectNode) json, context);
-        assertThat(sg, notNullValue());
-        return sg;
-    }
-
-    private class MockCodecContext implements CodecContext {
-
-        private final ObjectMapper mapper = new ObjectMapper();
-        private final CodecManager manager = new CodecManager();
-        private final Map<Class<?>, Object> services = new HashMap<>();
-
-        /**
-         * Constructs a new mock codec context.
-         */
-        public MockCodecContext() {
-            manager.activate();
-        }
-
-        @Override
-        public ObjectMapper mapper() {
-            return mapper;
-        }
-
-        @Override
-        public <T> JsonCodec<T> codec(Class<T> entityClass) {
-            if (entityClass == KubevirtSecurityGroupRule.class) {
-                return (JsonCodec<T>) kubevirtSecurityGroupRuleCodec;
-            }
-
-            return manager.getCodec(entityClass);
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceClass) {
-            return (T) services.get(serviceClass);
-        }
-
-        // for registering mock services
-        public <T> void registerService(Class<T> serviceClass, T impl) {
-            services.put(serviceClass, impl);
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupJsonMatcher.java
deleted file mode 100644
index ea04c60..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupJsonMatcher.java
+++ /dev/null
@@ -1,114 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroup;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-
-/**
- * Hamcrest matcher for security group.
- */
-public final class KubevirtSecurityGroupJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private static final String ID = "id";
-    private static final String NAME = "name";
-    private static final String DESCRIPTION = "description";
-    private static final String RULES = "rules";
-
-    private final KubevirtSecurityGroup sg;
-
-    private KubevirtSecurityGroupJsonMatcher(KubevirtSecurityGroup sg) {
-        this.sg = sg;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check sg ID
-        String jsonId = jsonNode.get(ID).asText();
-        String id = sg.id();
-        if (!jsonId.equals(id)) {
-            description.appendText("ID was " + jsonId);
-            return false;
-        }
-
-        // check sg name
-        String jsonName = jsonNode.get(NAME).asText();
-        String name = sg.name();
-        if (!jsonName.equals(name)) {
-            description.appendText("Name was " + jsonName);
-            return false;
-        }
-
-        // check description
-        JsonNode jsonDescription = jsonNode.get(DESCRIPTION);
-        if (jsonDescription != null) {
-            String myDescription = sg.description();
-            if (!jsonDescription.asText().equals(myDescription)) {
-                description.appendText("Description was " + jsonDescription);
-                return false;
-            }
-        }
-
-        JsonNode jsonSgr = jsonNode.get(RULES);
-        if (jsonSgr != null) {
-            // check size of rule array
-            if (jsonSgr.size() != sg.rules().size()) {
-                description.appendText("Rules was " + jsonSgr.size());
-                return false;
-            }
-
-            // check rules
-            for (KubevirtSecurityGroupRule sgr : sg.rules()) {
-                boolean ruleFound = false;
-                for (int ruleIndex = 0; ruleIndex < jsonSgr.size(); ruleIndex++) {
-                    KubevirtSecurityGroupRuleJsonMatcher ruleMatcher =
-                            KubevirtSecurityGroupRuleJsonMatcher
-                                    .matchesKubevirtSecurityGroupRule(sgr);
-                    if (ruleMatcher.matches(jsonSgr.get(ruleIndex))) {
-                        ruleFound = true;
-                        break;
-                    }
-                }
-
-                if (!ruleFound) {
-                    description.appendText("Rule not found " + sgr.toString());
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(sg.toString());
-    }
-
-    /**
-     * Factory to allocate a kubevirt security group matcher.
-     *
-     * @param sg kubevirt security group object we are looking for
-     * @return matcher
-     */
-    public static KubevirtSecurityGroupJsonMatcher
-    matchesKubevirtSecurityGroup(KubevirtSecurityGroup sg) {
-        return new KubevirtSecurityGroupJsonMatcher(sg);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleJsonMatcher.java
deleted file mode 100644
index 81ba374..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroupRuleJsonMatcher.java
+++ /dev/null
@@ -1,149 +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.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onlab.packet.IpPrefix;
-import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupRule;
-
-/**
- * Hamcrest matcher for kubevirt port.
- */
-public final class KubevirtSecurityGroupRuleJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final KubevirtSecurityGroupRule rule;
-
-    private static final String ID = "id";
-    private static final String SECURITY_GROUP_ID = "securityGroupId";
-    private static final String DIRECTION = "direction";
-    private static final String ETHER_TYPE = "etherType";
-    private static final String PORT_RANGE_MAX = "portRangeMax";
-    private static final String PORT_RANGE_MIN = "portRangeMin";
-    private static final String PROTOCOL = "protocol";
-    private static final String REMOTE_IP_PREFIX = "remoteIpPrefix";
-    private static final String REMOTE_GROUP_ID = "remoteGroupId";
-
-    private KubevirtSecurityGroupRuleJsonMatcher(KubevirtSecurityGroupRule rule) {
-        this.rule = rule;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-        // check rule ID
-        String jsonId = jsonNode.get(ID).asText();
-        String id = rule.id();
-        if (!jsonId.equals(id)) {
-            description.appendText("Rule ID was " + jsonId);
-            return false;
-        }
-
-        // check security group ID
-        String jsonSecurityGroupId = jsonNode.get(SECURITY_GROUP_ID).asText();
-        String securityGroupId = rule.securityGroupId();
-        if (!jsonSecurityGroupId.equals(securityGroupId)) {
-            description.appendText("Security group ID was " + jsonSecurityGroupId);
-            return false;
-        }
-
-        // check direction
-        String jsonDirection = jsonNode.get(DIRECTION).asText();
-        String direction = rule.direction();
-        if (!jsonDirection.equals(direction)) {
-            description.appendText("Direction was " + jsonDirection);
-            return false;
-        }
-
-        // check ether type
-        JsonNode jsonEtherType = jsonNode.get(ETHER_TYPE);
-        if (jsonEtherType != null) {
-            String etherType = rule.etherType();
-            if (!jsonEtherType.asText().equals(etherType)) {
-                description.appendText("EtherType was " + jsonEtherType);
-                return false;
-            }
-        }
-
-        // check port range max
-        JsonNode jsonPortRangeMax = jsonNode.get(PORT_RANGE_MAX);
-        if (jsonPortRangeMax != null) {
-            int portRangeMax = rule.portRangeMax();
-            if (portRangeMax != jsonPortRangeMax.asInt()) {
-                description.appendText("PortRangeMax was " + jsonPortRangeMax);
-                return false;
-            }
-        }
-
-        // check port range min
-        JsonNode jsonPortRangeMin = jsonNode.get(PORT_RANGE_MIN);
-        if (jsonPortRangeMin != null) {
-            int portRangeMin = rule.portRangeMin();
-            if (portRangeMin != jsonPortRangeMin.asInt()) {
-                description.appendText("PortRangeMin was " + jsonPortRangeMin);
-                return false;
-            }
-        }
-
-        // check protocol
-        JsonNode jsonProtocol = jsonNode.get(PROTOCOL);
-        if (jsonProtocol != null) {
-            String protocol = rule.protocol();
-            if (!jsonProtocol.asText().equals(protocol)) {
-                description.appendText("Protocol was " + jsonProtocol);
-                return false;
-            }
-        }
-
-        // check remote IP prefix
-        JsonNode jsonRemoteIpPrefix = jsonNode.get(REMOTE_IP_PREFIX);
-        if (jsonRemoteIpPrefix != null) {
-            IpPrefix remoteIpPrefix = rule.remoteIpPrefix();
-            if (!jsonRemoteIpPrefix.asText().equals(remoteIpPrefix.toString())) {
-                description.appendText("Remote IP prefix was " + jsonRemoteIpPrefix);
-                return false;
-            }
-        }
-
-        // check remote group ID
-        JsonNode jsonRemoteGroupId = jsonNode.get(REMOTE_GROUP_ID);
-        if (jsonRemoteGroupId != null) {
-            String remoteGroupId = rule.remoteGroupId();
-            if (!jsonRemoteGroupId.asText().equals(remoteGroupId)) {
-                description.appendText("Remote group ID was " + jsonRemoteGroupId);
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(rule.toString());
-    }
-
-    /**
-     * Factory to allocate an kubevirt security group rule matcher.
-     *
-     * @param rule kubevirt security group rule object we are looking for
-     * @return matcher
-     */
-    public static KubevirtSecurityGroupRuleJsonMatcher
-        matchesKubevirtSecurityGroupRule(KubevirtSecurityGroupRule rule) {
-        return new KubevirtSecurityGroupRuleJsonMatcher(rule);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java
deleted file mode 100644
index c1415fd..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtMm5WebResourceTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2022-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 com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonArray;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.collect.ImmutableSet;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.osgi.TestServiceDirectory;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecService;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
-import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
-import org.onosproject.kubevirtnetworking.codec.KubevirtHostRouteCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtIpPoolCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtNetworkCodec;
-import org.onosproject.kubevirtnode.api.DefaultKubevirtNode;
-import org.onosproject.kubevirtnode.api.KubevirtNode;
-import org.onosproject.kubevirtnode.api.KubevirtNodeService;
-import org.onosproject.kubevirtnode.api.KubevirtNodeState;
-import org.onosproject.net.DeviceId;
-import org.onosproject.rest.resources.ResourceTest;
-
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-public class KubevirtMm5WebResourceTest extends ResourceTest {
-
-    final KubevirtRouterService mockRouterService = createMock(KubevirtRouterService.class);
-    final KubevirtNodeService mockNodeService = createMock(KubevirtNodeService.class);
-    final KubevirtNetworkService mockNetworkService = createMock(KubevirtNetworkService.class);
-
-    private static final String VR_STATUS_PATH = "api/mm5/v1/status/vr/";
-    private static final String NETWORK_PATH = "api/mm5/v1/network";
-
-    private static final String ROUTER_NAME = "router1";
-    private static final String HOST_NAME = "hostname1";
-
-
-    private static final KubevirtNetwork NETWORK_1 = DefaultKubevirtNetwork.builder()
-            .networkId("network")
-            .name("network")
-            .type(KubevirtNetwork.Type.FLAT)
-            .cidr("10.10.10.0/24")
-            .mtu(1500)
-            .gatewayIp(IpAddress.valueOf("10.10.10.1"))
-            .defaultRoute(true)
-            .ipPool(new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
-                    IpAddress.valueOf("10.10.10.200")))
-            .build();
-
-    private static final KubevirtNode NODE_1 = DefaultKubevirtNode.builder()
-            .hostname(HOST_NAME)
-            .type(KubevirtNode.Type.GATEWAY)
-            .dataIp(IpAddress.valueOf("10.134.34.222"))
-            .managementIp(IpAddress.valueOf("10.134.231.30"))
-            .intgBridge(DeviceId.deviceId("of:00000000000000a1"))
-            .tunBridge(DeviceId.deviceId("of:00000000000000a2"))
-            .state(KubevirtNodeState.COMPLETE)
-            .build();
-
-
-    private static final KubevirtRouter ROUTER_1 = DefaultKubevirtRouter.builder()
-            .name(ROUTER_NAME).build();
-
-    /**
-     * Constructs a kubevirt mm5 resource test instance.
-     */
-    public KubevirtMm5WebResourceTest() {
-        super(ResourceConfig.forApplicationClass(KubevirtNetworkingWebApplication.class));
-    }
-
-    /**
-     * Sets up the global values for all the tests.
-     */
-    @Before
-    public void setUpTest() {
-        final CodecManager codecService = new CodecManager();
-        codecService.activate();
-        codecService.registerCodec(KubevirtNetwork.class, new KubevirtNetworkCodec());
-        codecService.registerCodec(KubevirtHostRoute.class, new KubevirtHostRouteCodec());
-        codecService.registerCodec(KubevirtIpPool.class, new KubevirtIpPoolCodec());
-
-        ServiceDirectory testDirectory =
-                new TestServiceDirectory()
-                        .add(KubevirtNodeService.class, mockNodeService)
-                        .add(KubevirtNetworkService.class, mockNetworkService)
-                        .add(KubevirtRouterService.class, mockRouterService)
-                        .add(CodecService.class, codecService);
-
-        setServiceDirectory(testDirectory);
-    }
-
-    @Test
-    public void testVrStatusWithExistingRouterOperation() {
-        expect(mockRouterService.routers()).andReturn(ImmutableSet.of(ROUTER_1)).anyTimes();
-        replay(mockRouterService);
-
-        final WebTarget wt = target();
-
-        final String stringResponse = wt.path(VR_STATUS_PATH + ROUTER_NAME).request().get(String.class);
-        final Response response = wt.path(VR_STATUS_PATH + ROUTER_NAME).request().get();
-
-        final JsonObject result = Json.parse(stringResponse).asObject();
-
-        assertThat(result, notNullValue());
-        assertThat(result.names(), hasSize(4));
-        assertThat(response.getStatus(), is(200));
-
-        verify(mockRouterService);
-    }
-
-    @Test
-    public void testVrStatusWithNonRouterOperation() {
-        expect(mockRouterService.routers()).andReturn(ImmutableSet.of(ROUTER_1)).anyTimes();
-        replay(mockRouterService);
-
-        final WebTarget wt = target();
-
-        final Response response = wt.path(VR_STATUS_PATH + "anyRouter").request().get();
-        assertThat(response.getStatus(), is(404));
-
-        verify(mockRouterService);
-    }
-
-    @Test
-    public void testGetNetworkOperation() {
-        expect(mockNetworkService.networks()).andReturn(ImmutableSet.of(NETWORK_1)).anyTimes();
-        replay(mockNetworkService);
-
-        final WebTarget wt = target();
-
-        final String response = wt.path(NETWORK_PATH).request().get(String.class);
-        final JsonObject result = Json.parse(response).asObject();
-
-        assertThat(result, notNullValue());
-        assertThat(result.names(), hasSize(1));
-        assertThat(result.names().get(0), is("networks"));
-
-        final JsonArray jsonNodes = result.get("networks").asArray();
-        assertThat(jsonNodes, notNullValue());
-        assertThat(jsonNodes.size(), is(1));
-
-        verify(mockNetworkService);
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java
deleted file mode 100644
index b453dad..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkWebResourceTest.java
+++ /dev/null
@@ -1,198 +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.glassfish.jersey.server.ResourceConfig;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.osgi.TestServiceDirectory;
-import org.onlab.packet.IpAddress;
-import org.onosproject.codec.CodecService;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetworkAdminService;
-import org.onosproject.kubevirtnetworking.codec.KubevirtHostRouteCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtIpPoolCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtNetworkCodec;
-import org.onosproject.rest.resources.ResourceTest;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.anyString;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-/**
- * Unit tests for kubevirt network REST API.
- */
-public class KubevirtNetworkWebResourceTest extends ResourceTest {
-
-    final KubevirtNetworkAdminService mockAdminService = createMock(KubevirtNetworkAdminService.class);
-    private static final String PATH = "network";
-
-    private KubevirtNetwork network;
-
-    /**
-     * Constructs a kubernetes networking resource test instance.
-     */
-    public KubevirtNetworkWebResourceTest() {
-        super(ResourceConfig.forApplicationClass(KubevirtNetworkingWebApplication.class));
-    }
-
-    /**
-     * Sets up the global values for all the tests.
-     */
-    @Before
-    public void setUpTest() {
-        final CodecManager codecService = new CodecManager();
-        codecService.activate();
-        codecService.registerCodec(KubevirtHostRoute.class, new KubevirtHostRouteCodec());
-        codecService.registerCodec(KubevirtIpPool.class, new KubevirtIpPoolCodec());
-        codecService.registerCodec(KubevirtNetwork.class, new KubevirtNetworkCodec());
-        ServiceDirectory testDirectory =
-                new TestServiceDirectory()
-                        .add(KubevirtNetworkAdminService.class, mockAdminService)
-                        .add(CodecService.class, codecService);
-        setServiceDirectory(testDirectory);
-
-        network = DefaultKubevirtNetwork.builder()
-                .networkId("network")
-                .name("network")
-                .type(KubevirtNetwork.Type.FLAT)
-                .cidr("10.10.10.0/24")
-                .mtu(1500)
-                .gatewayIp(IpAddress.valueOf("10.10.10.1"))
-                .defaultRoute(true)
-                .ipPool(new KubevirtIpPool(IpAddress.valueOf("10.10.10.100"),
-                        IpAddress.valueOf("10.10.10.200")))
-                .build();
-    }
-
-    /**
-     * Tests the results of the REST API POST method with creating new network operation.
-     */
-    @Test
-    public void testCreateNetworkWithCreateOperation() {
-        mockAdminService.createNetwork(anyObject());
-        replay(mockAdminService);
-
-        final WebTarget wt = target();
-        InputStream jsonStream = KubevirtNetworkWebResourceTest.class
-                .getResourceAsStream("kubevirt-network.json");
-        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
-                .post(Entity.json(jsonStream));
-        final int status = response.getStatus();
-
-        assertThat(status, is(201));
-
-        verify(mockAdminService);
-    }
-
-    /**
-     * Tests the results of the REST API PUT method with modifying the network.
-     */
-    @Test
-    public void testUpdateNetworkWithModifyOperation() {
-        mockAdminService.updateNetwork(anyObject());
-        replay(mockAdminService);
-
-        String location = PATH + "/network";
-
-        final WebTarget wt = target();
-        InputStream jsonStream = KubevirtNetworkWebResourceTest.class
-                .getResourceAsStream("kubevirt-network.json");
-        Response response = wt.path(location)
-                .request(MediaType.APPLICATION_JSON_TYPE)
-                .put(Entity.json(jsonStream));
-        final int status = response.getStatus();
-
-        assertThat(status, is(200));
-
-        verify(mockAdminService);
-    }
-
-    /**
-     * Tests the results of the REST API DELETE method with deleting the network.
-     */
-    @Test
-    public void testDeleteNetworkWithDeletionOperation() {
-        mockAdminService.removeNetwork(anyString());
-        replay(mockAdminService);
-
-        String location = PATH + "/network";
-
-        final WebTarget wt = target();
-        Response response = wt.path(location).request(
-                MediaType.APPLICATION_JSON_TYPE).delete();
-
-        final int status = response.getStatus();
-
-        assertThat(status, is(204));
-
-        verify(mockAdminService);
-    }
-
-    /**
-     * Tests the results of checking network existence.
-     */
-    @Test
-    public void testHasNetworkWithValidNetwork() {
-        expect(mockAdminService.network(anyString())).andReturn(network);
-        replay(mockAdminService);
-
-        String location = PATH + "/exist/network";
-
-        final WebTarget wt = target();
-        String response = wt.path(location).request(
-                MediaType.APPLICATION_JSON_TYPE).get(String.class);
-
-        assertThat(response, is("{\"result\":true}"));
-
-        verify((mockAdminService));
-    }
-
-    /**
-     * Tests the results of checking network existence.
-     */
-    @Test
-    public void testHasNetworkWithNullNetwork() {
-        expect(mockAdminService.network(anyString())).andReturn(null);
-        replay(mockAdminService);
-
-        String location = PATH + "/exist/network";
-
-        final WebTarget wt = target();
-        String response = wt.path(location).request(
-                MediaType.APPLICATION_JSON_TYPE).get(String.class);
-
-        assertThat(response, is("{\"result\":false}"));
-
-        verify((mockAdminService));
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegisterTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegisterTest.java
deleted file mode 100644
index c3784ba..0000000
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegisterTest.java
+++ /dev/null
@@ -1,86 +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 com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import org.junit.Test;
-import org.onlab.junit.TestUtils;
-import org.onosproject.codec.CodecService;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
-import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
-import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
-import org.onosproject.kubevirtnetworking.codec.KubevirtHostRouteCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtIpPoolCodec;
-import org.onosproject.kubevirtnetworking.codec.KubevirtNetworkCodec;
-
-import java.util.Map;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Unit tests for kubevirt networking codec register.
- */
-public class KubevirtNetworkingCodecRegisterTest {
-
-    /**
-     * Tests codec register activation and deactivation.
-     */
-    @Test
-    public void testActivateDeactivate() {
-        KubevirtNetworkingCodecRegister register = new KubevirtNetworkingCodecRegister();
-        CodecService codecService = new TestCodecService();
-
-        TestUtils.setField(register, "codecService", codecService);
-        register.activate();
-
-        assertEquals(KubevirtNetworkCodec.class.getName(),
-                codecService.getCodec(KubevirtNetwork.class).getClass().getName());
-        assertEquals(KubevirtHostRouteCodec.class.getName(),
-                codecService.getCodec(KubevirtHostRoute.class).getClass().getName());
-        assertEquals(KubevirtIpPoolCodec.class.getName(),
-                codecService.getCodec(KubevirtIpPool.class).getClass().getName());
-
-        register.deactivate();
-    }
-
-    private static class TestCodecService implements CodecService {
-
-        private Map<String, JsonCodec> codecMap = Maps.newConcurrentMap();
-
-        @Override
-        public Set<Class<?>> getCodecs() {
-            return ImmutableSet.of();
-        }
-
-        @Override
-        public <T> JsonCodec<T> getCodec(Class<T> entityClass) {
-            return codecMap.get(entityClass.getName());
-        }
-
-        @Override
-        public <T> void registerCodec(Class<T> entityClass, JsonCodec<T> codec) {
-            codecMap.put(entityClass.getName(), codec);
-        }
-
-        @Override
-        public void unregisterCodec(Class<?> entityClass) {
-            codecMap.remove(entityClass.getName());
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json
deleted file mode 100644
index 93819ce..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "id": "fip-1",
-  "routerName": "router-1",
-  "networkName": "flat-1",
-  "floatingIp": "10.10.10.10",
-  "podName": "pod-1",
-  "vmName": "vm-1",
-  "fixedIp": "20.20.20.20"
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json
deleted file mode 100644
index 806fd73..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtLoadBalancer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "name": "lb-1",
-  "description": "Example Load Balancer",
-  "networkId": "net-1",
-  "vip": "10.10.10.10",
-  "members": [
-    "10.10.10.11",
-    "10.10.10.12"
-  ],
-  "rules": [
-    {
-      "protocol": "tcp",
-      "portRangeMax": 8000,
-      "portRangeMin": 7000
-    },
-    {
-      "protocol": "udp",
-      "portRangeMax": 9000,
-      "portRangeMin": 8000
-    },
-    {
-      "protocol" : "icmp"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json
deleted file mode 100644
index 293cfcb..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtNetwork.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "networkId": "network-1",
-  "name": "network-1",
-  "type": "FLAT",
-  "mtu": 1500,
-  "cidr": "10.10.0.0/24",
-  "gatewayIp": "10.10.0.1",
-  "defaultRoute": true,
-  "ipPool": {
-    "start": "10.10.10.100",
-    "end": "10.10.10.200"
-  },
-  "hostRoutes": [
-    {
-      "destination": "10.10.10.0/24",
-      "nexthop": "10.10.10.1"
-    }
-  ],
-  "dnses": [
-    "8.8.8.8"
-  ]
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json
deleted file mode 100644
index 5d9d53c..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtRouter.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "router-1",
-  "description": "Example Virtual Router",
-  "enableSnat": true,
-  "mac": "11:22:33:44:55:66",
-  "external": {
-    "ip": "192.168.10.5",
-    "network": "external-network"
-  },
-  "internal": [
-    "vxlan-network-1",
-    "vxlan-network-2"
-  ],
-  "peerRouter": {
-    "ip": "192.168.10.1"
-  },
-  "gateway": "gatewayNode"
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroup.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroup.json
deleted file mode 100644
index 365f5a3..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtSecurityGroup.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "id": "sg-1",
-  "name": "sg",
-  "description": "example-sg",
-  "rules": [
-    {
-      "id": "sgr-1",
-      "securityGroupId": "sg-1",
-      "direction": "ingress",
-      "etherType": "IPv4",
-      "portRangeMax": 80,
-      "portRangeMin": 0,
-      "protocol": "tcp",
-      "remoteIpPrefix": "0.0.0.0/0",
-      "remoteGroupId": "g-1"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json
deleted file mode 100644
index c65236c..0000000
--- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/web/kubevirt-network.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "networkId": "network",
-  "name": "network",
-  "type": "FLAT",
-  "mtu": 1500,
-  "cidr": "10.10.10.0/24",
-  "gatewayIp": "10.10.10.1",
-  "defaultRoute": true,
-  "ipPool": {
-    "start": "10.10.10.100",
-    "end": "10.10.10.200"
-  }
-}
\ No newline at end of file
