diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 07f44c8..a6bb8bf 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -27,22 +27,7 @@
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.dpi.DpiStatInfo;
-import org.onosproject.incubator.net.dpi.DpiStatInfoCodec;
-import org.onosproject.incubator.net.dpi.DpiStatistics;
-import org.onosproject.incubator.net.dpi.DpiStatisticsCodec;
-import org.onosproject.incubator.net.dpi.FlowStatInfo;
-import org.onosproject.incubator.net.dpi.FlowStatInfoCodec;
-import org.onosproject.incubator.net.dpi.ProtocolStatInfo;
-import org.onosproject.incubator.net.dpi.ProtocolStatInfoCodec;
-import org.onosproject.incubator.net.dpi.TrafficStatInfo;
-import org.onosproject.incubator.net.dpi.TrafficStatInfoCodec;
-import org.onosproject.incubator.net.virtual.TenantId;
-import org.onosproject.incubator.net.virtual.VirtualDevice;
-import org.onosproject.incubator.net.virtual.VirtualHost;
-import org.onosproject.incubator.net.virtual.VirtualLink;
-import org.onosproject.incubator.net.virtual.VirtualNetwork;
-import org.onosproject.incubator.net.virtual.VirtualPort;
+import org.onosproject.net.TenantId;
 import org.onosproject.mastership.MastershipTerm;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.ConnectPoint;
@@ -164,19 +149,9 @@
         registerCodec(DeviceKey.class, new DeviceKeyCodec());
         registerCodec(Region.class, new RegionCodec());
         registerCodec(TenantId.class, new TenantIdCodec());
-        registerCodec(VirtualNetwork.class, new VirtualNetworkCodec());
-        registerCodec(VirtualDevice.class, new VirtualDeviceCodec());
-        registerCodec(VirtualPort.class, new VirtualPortCodec());
-        registerCodec(VirtualLink.class, new VirtualLinkCodec());
-        registerCodec(VirtualHost.class, new VirtualHostCodec());
         registerCodec(MastershipTerm.class, new MastershipTermCodec());
         registerCodec(MastershipRole.class, new MastershipRoleCodec());
         registerCodec(RoleInfo.class, new RoleInfoCodec());
-        registerCodec(DpiStatistics.class, new DpiStatisticsCodec());
-        registerCodec(DpiStatInfo.class, new DpiStatInfoCodec());
-        registerCodec(TrafficStatInfo.class, new TrafficStatInfoCodec());
-        registerCodec(ProtocolStatInfo.class, new ProtocolStatInfoCodec());
-        registerCodec(FlowStatInfo.class, new FlowStatInfoCodec());
         registerCodec(FilteredConnectPoint.class, new FilteredConnectPointCodec());
         registerCodec(TransportEndpointDescription.class, new TransportEndpointDescriptionCodec());
         registerCodec(PacketRequest.class, new PacketRequestCodec());
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/TenantIdCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/TenantIdCodec.java
index a73daa2..3111c6b 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/TenantIdCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/TenantIdCodec.java
@@ -18,7 +18,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.TenantId;
+import org.onosproject.net.TenantId;
 
 
 import static com.google.common.base.Preconditions.checkNotNull;
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/VirtualDeviceCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/VirtualDeviceCodec.java
deleted file mode 100644
index 79053ec..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/VirtualDeviceCodec.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualDevice;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.VirtualDevice;
-import org.onosproject.net.DeviceId;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-
-/**
- * Codec for the VirtualDevice class.
- */
-public class VirtualDeviceCodec extends JsonCodec<VirtualDevice> {
-
-    // JSON field names
-    private static final String ID = "deviceId";
-    private static final String NETWORK_ID = "networkId";
-
-    private static final String NULL_OBJECT_MSG = "VirtualDevice cannot be null";
-    private static final String MISSING_MEMBER_MSG = " member is required in VirtualDevice";
-
-    @Override
-    public ObjectNode encode(VirtualDevice vDev, CodecContext context) {
-        checkNotNull(vDev, NULL_OBJECT_MSG);
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, vDev.networkId().toString())
-                .put(ID, vDev.id().toString());
-
-        return result;
-    }
-
-    @Override
-    public VirtualDevice decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        DeviceId dId = DeviceId.deviceId(extractMember(ID, json));
-        NetworkId nId = NetworkId.networkId(Long.parseLong(extractMember(NETWORK_ID, json)));
-        return new DefaultVirtualDevice(nId, dId);
-    }
-
-    /**
-     * Extract member from JSON ObjectNode.
-     *
-     * @param key key for which value is needed
-     * @param json JSON ObjectNode
-     * @return member value
-     */
-    private String extractMember(String key, ObjectNode json) {
-        return nullIsIllegal(json.get(key), key + MISSING_MEMBER_MSG).asText();
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/VirtualHostCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/VirtualHostCodec.java
deleted file mode 100644
index 0a6ee8c..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/VirtualHostCodec.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-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.onlab.packet.VlanId;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualHost;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.VirtualHost;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.PortNumber;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-
-/**
- * Codec for the VirtualHost class.
- */
-public class VirtualHostCodec extends JsonCodec<VirtualHost> {
-
-    // JSON field names
-    static final String NETWORK_ID = "networkId";
-    static final String HOST_ID = "id";
-    static final String MAC_ADDRESS = "mac";
-    static final String VLAN = "vlan";
-    static final String IP_ADDRESSES = "ipAddresses";
-    static final String HOST_LOCATION = "locations";
-
-    private static final String NULL_OBJECT_MSG = "VirtualHost cannot be null";
-    private static final String MISSING_MEMBER_MSG = " member is required in VirtualHost";
-
-    @Override
-    public ObjectNode encode(VirtualHost vHost, CodecContext context) {
-        checkNotNull(vHost, NULL_OBJECT_MSG);
-
-        final JsonCodec<HostLocation> locationCodec =
-                context.codec(HostLocation.class);
-        final ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, vHost.networkId().toString())
-                .put(HOST_ID, vHost.id().toString())
-                .put(MAC_ADDRESS, vHost.mac().toString())
-                .put(VLAN, vHost.vlan().toString());
-
-        final ArrayNode jsonIpAddresses = result.putArray(IP_ADDRESSES);
-        for (final IpAddress ipAddress : vHost.ipAddresses()) {
-            jsonIpAddresses.add(ipAddress.toString());
-        }
-        result.set(IP_ADDRESSES, jsonIpAddresses);
-
-        final ArrayNode jsonLocations = result.putArray("locations");
-        for (final HostLocation location : vHost.locations()) {
-            jsonLocations.add(locationCodec.encode(location, context));
-        }
-        result.set("locations", jsonLocations);
-
-        return result;
-    }
-
-    @Override
-    public VirtualHost decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        NetworkId nId = NetworkId.networkId(Long.parseLong(extractMember(NETWORK_ID, json)));
-        MacAddress mac = MacAddress.valueOf(json.get("mac").asText());
-        VlanId vlanId = VlanId.vlanId((short) json.get("vlan").asInt(VlanId.UNTAGGED));
-
-        Set<HostLocation> locations = new HashSet<>();
-        JsonNode locationNodes = json.get("locations");
-        locationNodes.forEach(locationNode -> {
-            PortNumber portNumber = PortNumber.portNumber(locationNode.get("port").asText());
-            DeviceId deviceId = DeviceId.deviceId(locationNode.get("elementId").asText());
-            locations.add(new HostLocation(deviceId, portNumber, 0));
-        });
-
-        HostId id = HostId.hostId(mac, vlanId);
-
-        Iterator<JsonNode> ipStrings = json.get("ipAddresses").elements();
-        Set<IpAddress> ips = new HashSet<>();
-        while (ipStrings.hasNext()) {
-            ips.add(IpAddress.valueOf(ipStrings.next().asText()));
-        }
-
-        return new DefaultVirtualHost(nId, id, mac, vlanId, locations, ips);
-    }
-
-    /**
-     * Extract member from JSON ObjectNode.
-     *
-     * @param key key for which value is needed
-     * @param json JSON ObjectNode
-     * @return member value
-     */
-    private String extractMember(String key, ObjectNode json) {
-        return nullIsIllegal(json.get(key), key + MISSING_MEMBER_MSG).asText();
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/VirtualLinkCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/VirtualLinkCodec.java
deleted file mode 100644
index 106a1b0..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/VirtualLinkCodec.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualLink;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.VirtualLink;
-import org.onosproject.net.Link;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-
-/**
- * Codec for the VirtualLink class.
- */
-public class VirtualLinkCodec extends JsonCodec<VirtualLink> {
-
-    // JSON field names
-    private static final String NETWORK_ID = "networkId";
-
-    private static final String NULL_OBJECT_MSG = "VirtualLink cannot be null";
-    private static final String MISSING_MEMBER_MSG = " member is required in VirtualLink";
-
-    @Override
-    public ObjectNode encode(VirtualLink vLink, CodecContext context) {
-        checkNotNull(vLink, NULL_OBJECT_MSG);
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, vLink.networkId().toString());
-        JsonCodec<Link> codec = context.codec(Link.class);
-        ObjectNode linkResult = codec.encode(vLink, context);
-        result.setAll(linkResult);
-        return result;
-    }
-
-    @Override
-    public VirtualLink decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-        JsonCodec<Link> codec = context.codec(Link.class);
-        Link link = codec.decode(json, context);
-        NetworkId nId = NetworkId.networkId(Long.parseLong(extractMember(NETWORK_ID, json)));
-        return DefaultVirtualLink.builder()
-                .networkId(nId)
-                .src(link.src())
-                .dst(link.dst())
-                .build();
-    }
-
-    /**
-     * Extract member from JSON ObjectNode.
-     *
-     * @param key  key for which value is needed
-     * @param json JSON ObjectNode
-     * @return member value
-     */
-    private String extractMember(String key, ObjectNode json) {
-        return nullIsIllegal(json.get(key), key + MISSING_MEMBER_MSG).asText();
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/VirtualNetworkCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/VirtualNetworkCodec.java
deleted file mode 100644
index 156649a..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/VirtualNetworkCodec.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.TenantId;
-import org.onosproject.incubator.net.virtual.VirtualNetwork;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-
-/**
- * Codec for the VirtualNetwork class.
- */
-public class VirtualNetworkCodec extends JsonCodec<VirtualNetwork> {
-
-    // JSON field names
-    private static final String NETWORK_ID = "networkId";
-    private static final String TENANT_ID = "tenantId";
-
-    private static final String NULL_OBJECT_MSG = "VirtualNetwork cannot be null";
-    private static final String MISSING_MEMBER_MSG = " member is required in VirtualNetwork";
-
-    @Override
-    public ObjectNode encode(VirtualNetwork vnet, CodecContext context) {
-        checkNotNull(vnet, NULL_OBJECT_MSG);
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, vnet.id().toString())
-                .put(TENANT_ID, vnet.tenantId().toString());
-
-        return result;
-    }
-
-    @Override
-    public VirtualNetwork decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        NetworkId nId = NetworkId.networkId(Long.parseLong(extractMember(NETWORK_ID, json)));
-        TenantId tId = TenantId.tenantId(extractMember(TENANT_ID, json));
-        return new DefaultVirtualNetwork(nId, tId);
-    }
-
-    private String extractMember(String key, ObjectNode json) {
-        return nullIsIllegal(json.get(key), key + MISSING_MEMBER_MSG).asText();
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/VirtualPortCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/VirtualPortCodec.java
deleted file mode 100644
index 24a5d08..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/VirtualPortCodec.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualPort;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.VirtualDevice;
-import org.onosproject.incubator.net.virtual.VirtualNetworkService;
-import org.onosproject.incubator.net.virtual.VirtualPort;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.nullIsIllegal;
-
-/**
- * Codec for the VirtualPort class.
- */
-public class VirtualPortCodec extends JsonCodec<VirtualPort> {
-
-    // JSON field names
-    private static final String NETWORK_ID = "networkId";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String PORT_NUM = "portNum";
-    private static final String PHYS_DEVICE_ID = "physDeviceId";
-    private static final String PHYS_PORT_NUM = "physPortNum";
-
-    private static final String NULL_OBJECT_MSG = "VirtualPort cannot be null";
-    private static final String MISSING_MEMBER_MSG = " member is required in VirtualPort";
-    private static final String INVALID_VIRTUAL_DEVICE = " is not a valid VirtualDevice";
-
-    @Override
-    public ObjectNode encode(VirtualPort vPort, CodecContext context) {
-        checkNotNull(vPort, NULL_OBJECT_MSG);
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(NETWORK_ID, vPort.networkId().toString())
-                .put(DEVICE_ID, vPort.element().id().toString())
-                .put(PORT_NUM, vPort.number().toString())
-                .put(PHYS_DEVICE_ID, vPort.realizedBy().deviceId().toString())
-                .put(PHYS_PORT_NUM, vPort.realizedBy().port().toString());
-
-        return result;
-    }
-
-    @Override
-    public VirtualPort decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        NetworkId nId = NetworkId.networkId(Long.parseLong(extractMember(NETWORK_ID, json)));
-        DeviceId dId = DeviceId.deviceId(extractMember(DEVICE_ID, json));
-
-        VirtualNetworkService vnetService = context.getService(VirtualNetworkService.class);
-        Set<VirtualDevice> vDevs = vnetService.getVirtualDevices(nId);
-        VirtualDevice vDev = vDevs.stream()
-                .filter(virtualDevice -> virtualDevice.id().equals(dId))
-                .findFirst().orElse(null);
-        nullIsIllegal(vDev, dId.toString() + INVALID_VIRTUAL_DEVICE);
-
-        PortNumber portNum = PortNumber.portNumber(extractMember(PORT_NUM, json));
-        DeviceId physDId = DeviceId.deviceId(extractMember(PHYS_DEVICE_ID, json));
-        PortNumber physPortNum = PortNumber.portNumber(extractMember(PHYS_PORT_NUM, json));
-
-        ConnectPoint realizedBy = new ConnectPoint(physDId, physPortNum);
-        return new DefaultVirtualPort(nId, vDev, portNum, realizedBy);
-    }
-
-    private String extractMember(String key, ObjectNode json) {
-        return nullIsIllegal(json.get(key), key + MISSING_MEMBER_MSG).asText();
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/utils/Comparators.java b/core/common/src/main/java/org/onosproject/utils/Comparators.java
index 20a4497..1610648 100644
--- a/core/common/src/main/java/org/onosproject/utils/Comparators.java
+++ b/core/common/src/main/java/org/onosproject/utils/Comparators.java
@@ -20,10 +20,7 @@
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.intf.Interface;
-import org.onosproject.incubator.net.virtual.TenantId;
-import org.onosproject.incubator.net.virtual.VirtualDevice;
-import org.onosproject.incubator.net.virtual.VirtualNetwork;
-import org.onosproject.incubator.net.virtual.VirtualPort;
+import org.onosproject.net.TenantId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Element;
 import org.onosproject.net.ElementId;
@@ -121,15 +118,4 @@
     public static final Comparator<TenantId> TENANT_ID_COMPARATOR =
             (t1, t2) -> t1.id().compareTo(t2.id());
 
-    public static final Comparator<VirtualNetwork> VIRTUAL_NETWORK_COMPARATOR =
-            (v1, v2) -> {
-                int compareId = v1.tenantId().toString().compareTo(v2.tenantId().toString());
-                return (compareId != 0) ? compareId : Long.signum(v1.id().id() - v2.id().id());
-            };
-
-    public static final Comparator<VirtualDevice> VIRTUAL_DEVICE_COMPARATOR =
-            (v1, v2) -> v1.id().toString().compareTo(v2.id().toString());
-
-    public static final Comparator<VirtualPort> VIRTUAL_PORT_COMPARATOR =
-            (v1, v2) -> v1.number().toString().compareTo(v2.number().toString());
 }
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/VirtualHostCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/VirtualHostCodecTest.java
deleted file mode 100644
index 9cc26d4..0000000
--- a/core/common/src/test/java/org/onosproject/codec/impl/VirtualHostCodecTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2016-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.codec.impl;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Set;
-import java.util.stream.IntStream;
-
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.incubator.net.virtual.DefaultVirtualHost;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.VirtualHost;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.NetTestTools;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.isOneOf;
-import static org.hamcrest.Matchers.notNullValue;
-
-/**
- * Tests VirtualHostCodec class.
- */
-
-public class VirtualHostCodecTest {
-
-    private static final String TEST_IP1 = "1.1.1.1";
-    private static final String TEST_IP2 = "2.2.2.2";
-    private static final String TEST_HOST_ID = "12:34:56:78:90:11/1";
-    private static final String TEST_MAC_ADDRESS = "11:11:22:22:33:33";
-    private static final long TEST_NETWORK_ID = 44L;
-    private static final short TEST_VLAN_ID = (short) 12;
-    private static final ConnectPoint CONNECT_POINT =
-            NetTestTools.connectPoint("d1", 1);
-
-    @Test
-    public void testEncode() {
-        MockCodecContext context = new MockCodecContext();
-        NetworkId networkId = NetworkId.networkId(TEST_NETWORK_ID);
-        HostId id = NetTestTools.hid(TEST_HOST_ID);
-        MacAddress mac = MacAddress.valueOf(TEST_MAC_ADDRESS);
-        VlanId vlan = VlanId.vlanId(TEST_VLAN_ID);
-        HostLocation location =
-                new HostLocation(CONNECT_POINT, 0L);
-        Set<IpAddress> ips = ImmutableSet.of(IpAddress.valueOf(TEST_IP1),
-                                             IpAddress.valueOf(TEST_IP2));
-        VirtualHost host =
-                new DefaultVirtualHost(networkId, id, mac, vlan, location, ips);
-        JsonCodec<VirtualHost> codec = context.codec(VirtualHost.class);
-        ObjectNode node = codec.encode(host, context);
-
-        assertThat(node.get(VirtualHostCodec.NETWORK_ID).asLong(),
-                   is(TEST_NETWORK_ID));
-        assertThat(node.get(VirtualHostCodec.HOST_ID).asText(),
-                   is(TEST_HOST_ID));
-        assertThat(node.get(VirtualHostCodec.MAC_ADDRESS).asText(),
-                   is(TEST_MAC_ADDRESS));
-        assertThat(node.get(VirtualHostCodec.VLAN).asInt(),
-                   is((int) TEST_VLAN_ID));
-        assertThat(node.get(VirtualHostCodec.HOST_LOCATION).get(0).get("elementId").asText(),
-                   is(location.deviceId().toString()));
-        assertThat(node.get(VirtualHostCodec.HOST_LOCATION).get(0).get("port").asLong(),
-                   is(location.port().toLong()));
-
-        JsonNode jsonIps = node.get(VirtualHostCodec.IP_ADDRESSES);
-        assertThat(jsonIps, notNullValue());
-        assertThat(jsonIps.isArray(), is(true));
-        assertThat(jsonIps.size(), is(ips.size()));
-
-        IntStream.of(0, 1).forEach(index ->
-            assertThat(jsonIps.get(index).asText(),
-                       isOneOf(TEST_IP1, TEST_IP2)));
-    }
-
-    @Test
-    public void testDecode() throws IOException {
-        MockCodecContext context = new MockCodecContext();
-        InputStream jsonStream =
-                VirtualHostCodecTest.class.getResourceAsStream("VirtualHost.json");
-        JsonNode json = context.mapper().readTree(jsonStream);
-        assertThat(json, notNullValue());
-        JsonCodec<VirtualHost> codec = context.codec(VirtualHost.class);
-        VirtualHost virtualHost = codec.decode((ObjectNode) json, context);
-        assertThat(virtualHost, notNullValue());
-
-        assertThat(virtualHost.networkId().id(),
-                   is(TEST_NETWORK_ID));
-        assertThat(virtualHost.id().toString(),
-                   is(NetTestTools.hid(TEST_MAC_ADDRESS + "/12").toString()));
-        assertThat(virtualHost.mac().toString(),
-                   is(TEST_MAC_ADDRESS));
-        assertThat(virtualHost.vlan().id(),
-                   is((short) TEST_VLAN_ID));
-        assertThat(virtualHost.location().deviceId(),
-                   is(CONNECT_POINT.deviceId()));
-        assertThat(virtualHost.location().port().toLong(),
-                   is(CONNECT_POINT.port().toLong()));
-
-
-        assertThat(virtualHost.ipAddresses().contains(IpAddress.valueOf(TEST_IP1)),
-                   is(true));
-        assertThat(virtualHost.ipAddresses().contains(IpAddress.valueOf(TEST_IP2)),
-                   is(true));
-    }
-}
diff --git a/core/common/src/test/java/org/onosproject/utils/ComparatorsTest.java b/core/common/src/test/java/org/onosproject/utils/ComparatorsTest.java
index d616e71..36d291e 100644
--- a/core/common/src/test/java/org/onosproject/utils/ComparatorsTest.java
+++ b/core/common/src/test/java/org/onosproject/utils/ComparatorsTest.java
@@ -52,9 +52,6 @@
 import static org.onosproject.utils.Comparators.PORT_COMPARATOR;
 import static org.onosproject.utils.Comparators.REGION_COMPARATOR;
 import static org.onosproject.utils.Comparators.TENANT_ID_COMPARATOR;
-import static org.onosproject.utils.Comparators.VIRTUAL_DEVICE_COMPARATOR;
-import static org.onosproject.utils.Comparators.VIRTUAL_NETWORK_COMPARATOR;
-import static org.onosproject.utils.Comparators.VIRTUAL_PORT_COMPARATOR;
 
 import java.util.Optional;
 
@@ -70,14 +67,7 @@
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.intf.Interface;
-import org.onosproject.incubator.net.virtual.DefaultVirtualDevice;
-import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
-import org.onosproject.incubator.net.virtual.DefaultVirtualPort;
-import org.onosproject.incubator.net.virtual.NetworkId;
-import org.onosproject.incubator.net.virtual.TenantId;
-import org.onosproject.incubator.net.virtual.VirtualDevice;
-import org.onosproject.incubator.net.virtual.VirtualNetwork;
-import org.onosproject.incubator.net.virtual.VirtualPort;
+import org.onosproject.net.TenantId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
@@ -117,12 +107,8 @@
 
 
 public class ComparatorsTest {
-    private static final ProviderId PID = new ProviderId("of", "foo");
-    private static final DeviceId DID = deviceId("of:foo");
     private static final String MFR = "whitebox";
-    private static final String HW = "1.1.x";
     private static final String HW1 = "2.2.x";
-    private static final String SW = "3.9.1";
     private static final String SW1 = "4.0.0";
     private static final String SN = "43311-12345";
     private static final ChassisId CID = new ChassisId();
@@ -346,41 +332,6 @@
         return TenantId.tenantId(id);
     }
 
-    @Test
-    public void testVirtualNetworkComparator() {
-        assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(10, "tenantID1")));
-        assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(10, "tenantID"), network(15, "tenantID1")));
-        assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID1"), network(10, "tenantID1")));
-        assertNotEquals(0, VIRTUAL_NETWORK_COMPARATOR.compare(network(15, "tenantID"), network(10, "tenantID1")));
-    }
-
-    private VirtualNetwork network(int networkID, String tenantID) {
-        return new DefaultVirtualNetwork(NetworkId.networkId(networkID), TenantId.tenantId(tenantID));
-    }
-
-    @Test
-    public void testVirtualDeviceComparator() {
-        assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:foo"), vd(0, "of:foo")));
-        assertEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:foo"), vd(0, "of:foo")));
-        assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(0, "of:bar"), vd(0, "of:foo")));
-        assertNotEquals(0, VIRTUAL_DEVICE_COMPARATOR.compare(vd(3, "of:bar"), vd(0, "of:foo")));
-    }
-
-    private VirtualDevice vd(int netID, String devID) {
-        return new DefaultVirtualDevice(NetworkId.networkId(netID), DeviceId.deviceId(devID));
-    }
-
-    @Test
-    public void testVirtualPortComparator() {
-        assertEquals(0, VIRTUAL_PORT_COMPARATOR.compare(vPort(2), vPort(2)));
-        assertEquals(4, VIRTUAL_PORT_COMPARATOR.compare(vPort(900), vPort(5)));
-        assertEquals(-8, VIRTUAL_PORT_COMPARATOR.compare(vPort(0), vPort(8)));
-    }
-
-    private VirtualPort vPort(int portNumber) {
-        return new DefaultVirtualPort(NetworkId.networkId(20), new DefaultDevice(PID, DID, null, MFR, HW, SW, SN, CID),
-                PortNumber.portNumber(portNumber), new ConnectPoint(DID, PortNumber.portNumber(900)));
-    }
 }
 
 
diff --git a/core/common/src/test/resources/org/onosproject/codec/impl/VirtualHost.json b/core/common/src/test/resources/org/onosproject/codec/impl/VirtualHost.json
deleted file mode 100644
index 818ce0b..0000000
--- a/core/common/src/test/resources/org/onosproject/codec/impl/VirtualHost.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "networkId": "44",
-  "mac": "11:11:22:22:33:33",
-  "vlan": "12",
-  "ipAddresses": [
-    "1.1.1.1",
-    "2.2.2.2"
-  ],
-  "locations": [
-    {
-      "elementId": "of:d1",
-      "port": "1"
-    }
-  ]
-}
