diff --git a/apps/openstacktelemetry/app/BUILD b/apps/openstacktelemetry/app/BUILD
index a0a9778..91fd5aa 100644
--- a/apps/openstacktelemetry/app/BUILD
+++ b/apps/openstacktelemetry/app/BUILD
@@ -1,4 +1,4 @@
-COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + REST + CLI + [
+COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + CLI + REST + [
     "@kafka_clients//jar",
     "@jersey_client//jar",
     "@influxdb_java//jar",
@@ -20,19 +20,13 @@
     "//apps/openstacktelemetry/api:onos-apps-openstacktelemetry-api",
 ]
 
-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",
 ]
 
 osgi_jar_with_tests(
-    api_description = "OpenStack Network Telemetry REST API",
-    api_package = "org.onosproject.openstacktelemetry.web",
-    api_title = "OpenStack Network Telemetry REST API",
-    api_version = "1.0",
     karaf_command_packages = ["org.onosproject.openstacktelemetry.cli"],
     test_deps = TEST_DEPS,
-    web_context = "/onos/openstacktelemetry",
     deps = COMPILE_DEPS,
 )
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java
deleted file mode 100644
index be51b15..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodec.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.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.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.DeviceId;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.packet.VlanId.NO_VID;
-
-/**
- * Openstack telemetry codec used for serializing and de-serializing JSON string.
- */
-public final class FlowInfoJsonCodec extends JsonCodec<FlowInfo> {
-
-    private static final String FLOW_TYPE = "flowType";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String INPUT_INTERFACE_ID = "inputInterfaceId";
-    private static final String OUTPUT_INTERFACE_ID = "outputInterfaceId";
-
-    private static final String VLAN_ID = "vlanId";
-    private static final String VXLAN_ID = "vxlanId";
-    private static final String SRC_IP = "srcIp";
-    private static final String SRC_IP_PREFIX_LEN = "srcIpPrefixLength";
-    private static final String DST_IP = "dstIp";
-    private static final String DST_IP_PREFIX_LEN = "dstIpPrefixLength";
-    private static final String SRC_PORT = "srcPort";
-    private static final String DST_PORT = "dstPort";
-    private static final String PROTOCOL = "protocol";
-    private static final String SRC_MAC = "srcMac";
-    private static final String DST_MAC = "dstMac";
-    private static final String STATS_INFO = "statsInfo";
-
-    @Override
-    public ObjectNode encode(FlowInfo info, CodecContext context) {
-        checkNotNull(info, "FlowInfo cannot be null");
-
-        ObjectNode result = context.mapper().createObjectNode()
-                .put(FLOW_TYPE, info.flowType())
-                .put(DEVICE_ID, info.deviceId().toString())
-                .put(INPUT_INTERFACE_ID, info.inputInterfaceId())
-                .put(OUTPUT_INTERFACE_ID, info.outputInterfaceId())
-                .put(SRC_IP, info.srcIp().address().toString())
-                .put(SRC_IP_PREFIX_LEN, info.srcIp().prefixLength())
-                .put(DST_IP, info.dstIp().address().toString())
-                .put(DST_IP_PREFIX_LEN, info.dstIp().prefixLength())
-                .put(SRC_PORT, info.srcPort().toString())
-                .put(DST_PORT, info.dstPort().toString())
-                .put(PROTOCOL, info.protocol())
-                .put(SRC_MAC, info.srcMac().toString())
-                .put(DST_MAC, info.dstMac().toString());
-
-        if (info.vlanId() != null) {
-            result.put(VLAN_ID, info.vlanId().toString());
-        } else {
-            result.put(VXLAN_ID, info.vxlanId());
-        }
-
-        ObjectNode statsInfoJson =
-                context.codec(StatsInfo.class).encode(info.statsInfo(), context);
-
-        result.put(STATS_INFO, statsInfoJson);
-
-        return result;
-    }
-
-    @Override
-    public FlowInfo decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        String flowType = json.get(FLOW_TYPE).asText();
-        String deviceId = json.get(DEVICE_ID).asText();
-        int inputInterfaceId = json.get(INPUT_INTERFACE_ID).asInt();
-        int outputInterfaceId = json.get(OUTPUT_INTERFACE_ID).asInt();
-        String srcIp = json.get(SRC_IP).asText();
-        int srcIpPrefixLength = json.get(SRC_IP_PREFIX_LEN).asInt();
-        String dstIp = json.get(DST_IP).asText();
-        int dstIpPrefixLength = json.get(DST_IP_PREFIX_LEN).asInt();
-        int srcPort = json.get(SRC_PORT).asInt();
-        int dstPort = json.get(DST_PORT).asInt();
-        String protocol = json.get(PROTOCOL).asText();
-        String srcMac = json.get(SRC_MAC).asText();
-        String dstMac = json.get(DST_MAC).asText();
-
-        VlanId vlanId;
-        short vxlanId = 0;
-        try {
-            if (json.get(VLAN_ID).isNull()) {
-                vlanId = VlanId.vlanId(NO_VID);
-                if (!(json.get(VXLAN_ID).isNull())) {
-                    vxlanId = (short) json.get(VXLAN_ID).asInt();
-                }
-            } else {
-                vlanId = VlanId.vlanId((short) json.get(VLAN_ID).asInt());
-            }
-        } catch (NullPointerException ex) {
-            vlanId = VlanId.vlanId();
-        }
-
-        JsonNode statsInfoJson = json.get(STATS_INFO);
-
-        JsonCodec<StatsInfo> statsInfoCodec = context.codec(StatsInfo.class);
-        StatsInfo statsInfo = statsInfoCodec.decode((ObjectNode) statsInfoJson.deepCopy(), context);
-
-        return new DefaultFlowInfo.DefaultBuilder()
-                .withFlowType(Byte.valueOf(flowType))
-                .withDeviceId(DeviceId.deviceId(deviceId))
-                .withInputInterfaceId(inputInterfaceId)
-                .withOutputInterfaceId(outputInterfaceId)
-                .withSrcIp(IpPrefix.valueOf(IpAddress.valueOf(srcIp), srcIpPrefixLength))
-                .withDstIp(IpPrefix.valueOf(IpAddress.valueOf(dstIp), dstIpPrefixLength))
-                .withSrcPort(TpPort.tpPort(srcPort))
-                .withDstPort(TpPort.tpPort(dstPort))
-                .withProtocol(Byte.valueOf(protocol))
-                .withSrcMac(MacAddress.valueOf(srcMac))
-                .withDstMac(MacAddress.valueOf(dstMac))
-                .withVlanId(vlanId)
-                .withVxlanId(vxlanId)
-                .withStatsInfo(statsInfo)
-                .build();
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
deleted file mode 100644
index 384987b..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.onlab.packet.TpPort;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsFlowRule;
-import org.slf4j.Logger;
-
-import org.onlab.packet.IpPrefix;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolTypeFromString;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * JSON codec for StatsFlowRule.
- */
-public class StatsFlowRuleJsonCodec extends JsonCodec<StatsFlowRule> {
-
-    private final Logger log = getLogger(getClass());
-
-    public static final String SRC_IP_PREFIX = "srcIpPrefix";
-    public static final String DST_IP_PREFIX = "dstIpPrefix";
-    public static final String IP_PROTOCOL   = "ipProtocol";
-    public static final String SRC_TP_PORT   = "srcTpPort";
-    public static final String DST_TP_PORT   = "dstTpPort";
-
-    public ObjectNode encode(StatsFlowRule flowRule, CodecContext context) {
-        checkNotNull(flowRule, "FlowInfo cannot be null");
-        ObjectNode result = context.mapper().createObjectNode()
-                            .put(SRC_IP_PREFIX, flowRule.srcIpPrefix().toString())
-                            .put(DST_IP_PREFIX, flowRule.dstIpPrefix().toString())
-                            .put(IP_PROTOCOL, flowRule.ipProtocol())
-                            .put(SRC_TP_PORT, flowRule.srcTpPort().toString())
-                            .put(DST_TP_PORT, flowRule.dstTpPort().toString());
-        return result;
-    }
-
-    @Override
-    public StatsFlowRule decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-        try {
-            String srcIpPrefix = json.get(SRC_IP_PREFIX).asText();
-            String dstIpPrefix = json.get(DST_IP_PREFIX).asText();
-
-            DefaultStatsFlowRule.Builder flowRuleBuilder;
-
-            if (json.get(IP_PROTOCOL) == null) {
-                log.info("ipProtocol: null");
-                flowRuleBuilder = DefaultStatsFlowRule.builder()
-                        .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
-                        .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix));
-            } else {
-                byte ipProtocol = getProtocolTypeFromString(json.get(IP_PROTOCOL).asText());
-                int srcTpPort = json.get(SRC_TP_PORT).asInt();
-                int dstTpPort = json.get(DST_TP_PORT).asInt();
-
-                flowRuleBuilder = DefaultStatsFlowRule.builder()
-                                    .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
-                                    .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix))
-                                    .ipProtocol(ipProtocol)
-                                    .srcTpPort(TpPort.tpPort(srcTpPort))
-                                    .dstTpPort(TpPort.tpPort(dstTpPort));
-            }
-            return flowRuleBuilder.build();
-        } catch (Exception ex) {
-            log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
-        }
-        return null;
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java
deleted file mode 100644
index 905b2ff..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonCodec.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Openstack telemetry codec used for serializing and de-serializing JSON string.
- */
-public final class StatsInfoJsonCodec extends JsonCodec<StatsInfo> {
-
-    private static final String STARTUP_TIME = "startupTime";
-    private static final String FST_PKT_ARR_TIME = "fstPktArrTime";
-    private static final String LST_PKT_OFFSET = "lstPktOffset";
-    private static final String PREV_ACC_BYTES = "prevAccBytes";
-    private static final String PREV_ACC_PKTS = "prevAccPkts";
-    private static final String CURR_ACC_BYTES = "currAccBytes";
-    private static final String CURR_ACC_PKTS = "currAccPkts";
-    private static final String ERROR_PKTS = "errorPkts";
-    private static final String DROP_PKTS = "dropPkts";
-
-    @Override
-    public ObjectNode encode(StatsInfo info, CodecContext context) {
-        checkNotNull(info, "StatsInfo cannot be null");
-
-        return context.mapper().createObjectNode()
-                .put(STARTUP_TIME, info.startupTime())
-                .put(FST_PKT_ARR_TIME, info.fstPktArrTime())
-                .put(LST_PKT_OFFSET, info.lstPktOffset())
-                .put(PREV_ACC_BYTES, info.prevAccBytes())
-                .put(PREV_ACC_PKTS, info.prevAccPkts())
-                .put(CURR_ACC_BYTES, info.prevAccBytes())
-                .put(CURR_ACC_PKTS, info.prevAccPkts())
-                .put(ERROR_PKTS, info.errorPkts())
-                .put(DROP_PKTS, info.dropPkts());
-    }
-
-    @Override
-    public StatsInfo decode(ObjectNode json, CodecContext context) {
-        if (json == null || !json.isObject()) {
-            return null;
-        }
-
-        return new DefaultStatsInfo.DefaultBuilder()
-                .withStartupTime(json.get(STARTUP_TIME).asLong())
-                .withFstPktArrTime(json.get(FST_PKT_ARR_TIME).asLong())
-                .withLstPktOffset(json.get(LST_PKT_OFFSET).asInt())
-                .withPrevAccBytes(json.get(PREV_ACC_BYTES).asLong())
-                .withPrevAccPkts(json.get(PREV_ACC_PKTS).asInt())
-                .withCurrAccBytes(json.get(CURR_ACC_BYTES).asLong())
-                .withCurrAccPkts(json.get(CURR_ACC_PKTS).asInt())
-                .withErrorPkts((short) json.get(ERROR_PKTS).asInt())
-                .withDropPkts((short) json.get(DROP_PKTS).asInt())
-                .build();
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
similarity index 97%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
index 2ee625f..759dd5a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpAddress.Version;
@@ -25,7 +25,7 @@
 import org.onosproject.openstacktelemetry.api.ByteBufferCodec;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.api.DefaultFlowInfo;
 
 import java.nio.ByteBuffer;
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
similarity index 97%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
index 2be5f3e..514bc23 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaMessageByteBufferCodec.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.TelemetryCodec;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
similarity index 95%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
index ce3faa8..456dc72 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodec.java
@@ -13,11 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import org.onosproject.openstacktelemetry.api.ByteBufferCodec;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 
 import java.nio.ByteBuffer;
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
similarity index 91%
rename from apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java
rename to apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
index f7f6401..b8ef80a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/package-info.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/bytebuffer/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Implementations of the codec broker and openstack telemetry entity codecs.
  */
-package org.onosproject.openstacktelemetry.codec;
\ No newline at end of file
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryViewMessageHandler.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryViewMessageHandler.java
index dcb7082..f6d9bdd 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryViewMessageHandler.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryViewMessageHandler.java
@@ -30,7 +30,7 @@
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
 import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsFlowRule;
+import org.onosproject.openstacktelemetry.api.DefaultStatsFlowRule;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
deleted file mode 100644
index b0d3aad..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolNameFromType;
-
-/**
- * Implementation class of FlowInfo.
- */
-public final class DefaultFlowInfo implements FlowInfo {
-    private static final String INGRESS_STATS = "Ingress Port :";
-    private static final String EGRESS_STATS = "Egress Port :";
-
-    private final byte flowType;
-    private final DeviceId deviceId;
-    private final int inputInterfaceId;
-    private final int outputInterfaceId;
-    private final VlanId vlanId;
-    private final short vxlanId;
-    private final IpPrefix srcIp;
-    private final IpPrefix dstIp;
-    private final TpPort srcPort;
-    private final TpPort dstPort;
-    private final byte protocol;
-    private final MacAddress srcMac;
-    private final MacAddress dstMac;
-    private final StatsInfo statsInfo;
-
-    private DefaultFlowInfo(byte flowType, DeviceId deviceId,
-                            int inputInterfaceId, int outputInterfaceId,
-                            VlanId vlanId, short vxlanId, IpPrefix srcIp,
-                            IpPrefix dstIp, TpPort srcPort, TpPort dstPort,
-                            byte protocol, MacAddress srcMac, MacAddress dstMac,
-                            StatsInfo statsInfo) {
-        this.flowType = flowType;
-        this.deviceId = deviceId;
-        this.inputInterfaceId = inputInterfaceId;
-        this.outputInterfaceId = outputInterfaceId;
-        this.vlanId = vlanId;
-        this.vxlanId = vxlanId;
-        this.srcIp = srcIp;
-        this.dstIp = dstIp;
-        this.srcPort = srcPort;
-        this.dstPort = dstPort;
-        this.protocol = protocol;
-        this.srcMac = srcMac;
-        this.dstMac = dstMac;
-        this.statsInfo = statsInfo;
-    }
-
-    @Override
-    public byte flowType() {
-        return flowType;
-    }
-
-    @Override
-    public DeviceId deviceId() {
-        return deviceId;
-    }
-
-    @Override
-    public int inputInterfaceId() {
-        return inputInterfaceId;
-    }
-
-    @Override
-    public int outputInterfaceId() {
-        return outputInterfaceId;
-    }
-
-    @Override
-    public VlanId vlanId() {
-        return vlanId;
-    }
-
-    @Override
-    public short vxlanId() {
-        return vxlanId;
-    }
-
-    @Override
-    public IpPrefix srcIp() {
-        return srcIp;
-    }
-
-    @Override
-    public IpPrefix dstIp() {
-        return dstIp;
-    }
-
-    @Override
-    public TpPort srcPort() {
-        return srcPort;
-    }
-
-    @Override
-    public TpPort dstPort() {
-        return dstPort;
-    }
-
-    @Override
-    public byte protocol() {
-        return protocol;
-    }
-
-    @Override
-    public MacAddress srcMac() {
-        return srcMac;
-    }
-
-    @Override
-    public MacAddress dstMac() {
-        return dstMac;
-    }
-
-    @Override
-    public StatsInfo statsInfo() {
-        return statsInfo;
-    }
-
-    @Override
-    public boolean roughEquals(FlowInfo flowInfo) {
-        final DefaultFlowInfo other = (DefaultFlowInfo) flowInfo;
-        return Objects.equals(this.deviceId, other.deviceId) &&
-                Objects.equals(this.srcIp, other.srcIp) &&
-                Objects.equals(this.dstIp, other.dstIp) &&
-                Objects.equals(this.srcPort, other.srcPort) &&
-                Objects.equals(this.dstPort, other.dstPort) &&
-                Objects.equals(this.protocol, other.protocol);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof DefaultFlowInfo) {
-            final DefaultFlowInfo other = (DefaultFlowInfo) obj;
-            return Objects.equals(this.flowType, other.flowType) &&
-                    Objects.equals(this.deviceId, other.deviceId) &&
-                    Objects.equals(this.inputInterfaceId, other.inputInterfaceId) &&
-                    Objects.equals(this.outputInterfaceId, other.outputInterfaceId) &&
-                    Objects.equals(this.vlanId, other.vlanId) &&
-                    Objects.equals(this.vxlanId, other.vxlanId) &&
-                    Objects.equals(this.srcIp, other.srcIp) &&
-                    Objects.equals(this.dstIp, other.dstIp) &&
-                    Objects.equals(this.srcPort, other.srcPort) &&
-                    Objects.equals(this.dstPort, other.dstPort) &&
-                    Objects.equals(this.protocol, other.protocol) &&
-                    Objects.equals(this.srcMac, other.srcMac) &&
-                    Objects.equals(this.dstMac, other.dstMac) &&
-                    Objects.equals(this.statsInfo, other.statsInfo);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(flowType, deviceId, inputInterfaceId,
-                outputInterfaceId, vlanId, vxlanId, srcIp, dstIp, srcPort, dstPort,
-                protocol, srcMac, dstMac, statsInfo);
-    }
-
-    @Override
-    public String uniqueFlowInfoKey() {
-        if (srcIp.address().isZero() || dstIp.address().isZero()) {
-            if (!srcIp.address().isZero()) {
-                return INGRESS_STATS + srcIp.toString();
-            }
-            if (!dstIp.address().isZero()) {
-                return EGRESS_STATS + dstIp.toString();
-            }
-        }
-        return srcIp.toString() + ":" +
-                ((srcPort == null) ? "any" : srcPort.toString()) +
-                " -> " +
-                dstIp.toString() + ":" +
-                ((dstPort == null) ? "any" : dstPort.toString()) +
-                " (" + getProtocolNameFromType(protocol) + ")";
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("flowType", flowType)
-                .add("deviceId", deviceId)
-                .add("inputInterfaceId", inputInterfaceId)
-                .add("outputInterfaceId", outputInterfaceId)
-                .add("vlanId", vlanId)
-                .add("vxlanId", vxlanId)
-                .add("srcIp", srcIp)
-                .add("dstIp", dstIp)
-                .add("srcPort", srcPort)
-                .add("dstPort", dstPort)
-                .add("protocol", protocol)
-                .add("srcMac", srcMac)
-                .add("dstMac", dstMac)
-                .add("statsInfo", statsInfo)
-                .toString();
-    }
-
-    /**
-     * Obtains a default flow info builder object.
-     *
-     * @return flow info builder object
-     */
-    public static Builder builder() {
-        return new DefaultBuilder();
-    }
-
-    /**
-     * Builder class of DefaultFlowInfo.
-     */
-    public static final class DefaultBuilder implements FlowInfo.Builder {
-
-        private byte flowType;
-        private DeviceId deviceId;
-        private int inputInterfaceId;
-        private int outputInterfaceId;
-        private VlanId vlanId;
-        private short vxlanId;
-        private IpPrefix srcIp;
-        private IpPrefix dstIp;
-        private TpPort srcPort;
-        private TpPort dstPort;
-        private byte protocol;
-        private MacAddress srcMac;
-        private MacAddress dstMac;
-        private StatsInfo statsInfo;
-
-        @Override
-        public Builder withFlowType(byte flowType) {
-            this.flowType = flowType;
-            return this;
-        }
-
-        @Override
-        public Builder withDeviceId(DeviceId deviceId) {
-            this.deviceId = deviceId;
-            return this;
-        }
-
-        @Override
-        public Builder withInputInterfaceId(int inputInterfaceId) {
-            this.inputInterfaceId = inputInterfaceId;
-            return this;
-        }
-
-        @Override
-        public Builder withOutputInterfaceId(int outputInterfaceId) {
-            this.outputInterfaceId = outputInterfaceId;
-            return this;
-        }
-
-        @Override
-        public Builder withVlanId(VlanId vlanId) {
-            this.vlanId = vlanId;
-            return this;
-        }
-
-        @Override
-        public Builder withVxlanId(short vxlanId) {
-            this.vxlanId = vxlanId;
-            return this;
-        }
-
-        @Override
-        public Builder withSrcIp(IpPrefix srcIp) {
-            this.srcIp = srcIp;
-            return this;
-        }
-
-        @Override
-        public Builder withDstIp(IpPrefix dstIp) {
-            this.dstIp = dstIp;
-            return this;
-        }
-
-        @Override
-        public Builder withSrcPort(TpPort srcPort) {
-            this.srcPort = srcPort;
-            return this;
-        }
-
-        @Override
-        public Builder withDstPort(TpPort dstPort) {
-            this.dstPort = dstPort;
-            return this;
-        }
-
-        @Override
-        public Builder withProtocol(byte protocol) {
-            this.protocol = protocol;
-            return this;
-        }
-
-        @Override
-        public Builder withSrcMac(MacAddress srcMac) {
-            this.srcMac = srcMac;
-            return this;
-        }
-
-        @Override
-        public Builder withDstMac(MacAddress dstMac) {
-            this.dstMac = dstMac;
-            return this;
-        }
-
-        @Override
-        public Builder withStatsInfo(StatsInfo statsInfo) {
-            this.statsInfo = statsInfo;
-            return this;
-        }
-
-        @Override
-        public FlowInfo build() {
-
-            // TODO: need to check the null value for more properties
-            checkNotNull(srcIp, "Source IP address cannot be null");
-            checkNotNull(dstIp, "Destination IP address cannot be null");
-            checkNotNull(statsInfo, "StatsInfo cannot be null");
-
-            return new DefaultFlowInfo(flowType, deviceId, inputInterfaceId,
-                    outputInterfaceId, vlanId, vxlanId, srcIp, dstIp, srcPort, dstPort,
-                    protocol, srcMac, dstMac, statsInfo);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
deleted file mode 100644
index 9ee84f8..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.TpPort;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Implementation of StatsFlowRule.
- */
-public final class DefaultStatsFlowRule implements StatsFlowRule {
-    private final IpPrefix srcIpPrefix;
-    private final IpPrefix dstIpPrefix;
-    private final byte     ipProtocol;
-    private final TpPort   srcTpPort;
-    private final TpPort   dstTpPort;
-
-    private static final String NOT_NULL_MSG = "Element % cannot be null";
-
-    protected DefaultStatsFlowRule(IpPrefix srcIpPrefix,
-                                   IpPrefix dstIpPrefix,
-                                   byte ipProtoco,
-                                   TpPort srcTpPort,
-                                   TpPort dstTpPort) {
-        this.srcIpPrefix = srcIpPrefix;
-        this.dstIpPrefix = dstIpPrefix;
-        this.ipProtocol  = ipProtoco;
-        this.srcTpPort   = srcTpPort;
-        this.dstTpPort   = dstTpPort;
-    }
-
-    @Override
-    public IpPrefix srcIpPrefix() {
-        return srcIpPrefix;
-    }
-
-    @Override
-    public IpPrefix dstIpPrefix() {
-        return dstIpPrefix;
-    }
-
-    @Override
-    public byte ipProtocol() {
-        return ipProtocol;
-    }
-
-    @Override
-    public TpPort srcTpPort() {
-        return srcTpPort;
-    }
-
-    @Override
-    public TpPort dstTpPort() {
-        return dstTpPort;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("srcIpPrefix", srcIpPrefix)
-                .add("dstIpPrefix", dstIpPrefix)
-                .add("ipProtocol", ipProtocol)
-                .add("srcTpPort", srcTpPort)
-                .add("dstTpPort", dstTpPort)
-                .toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof DefaultStatsFlowRule) {
-            final DefaultStatsFlowRule other = (DefaultStatsFlowRule) obj;
-            return Objects.equals(this.srcIpPrefix, other.srcIpPrefix) &&
-                    Objects.equals(this.dstIpPrefix, other.dstIpPrefix) &&
-                    Objects.equals(this.srcTpPort, other.srcTpPort) &&
-                    Objects.equals(this.dstTpPort, other.dstTpPort) &&
-                    Objects.equals(this.ipProtocol, other.ipProtocol);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(srcIpPrefix, dstIpPrefix, srcTpPort, dstTpPort, ipProtocol);
-    }
-
-    /**
-     * Obtains a default stats flow rule builder object.
-     *
-     * @return flow rule builder object
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Obtains the builder object existing flow rule.
-     *
-     * @param flowRule flow rule
-     * @return builder object
-     */
-    public static Builder from(StatsFlowRule flowRule) {
-        return new Builder()
-                .srcIpPrefix(flowRule.srcIpPrefix())
-                .dstIpPrefix(flowRule.dstIpPrefix())
-                .ipProtocol(flowRule.ipProtocol())
-                .srcTpPort(flowRule.srcTpPort())
-                .dstTpPort(flowRule.dstTpPort());
-    }
-
-    /**
-     * A builder class for openstack flow rule.
-     */
-    public static final class Builder implements StatsFlowRule.Builder {
-        private IpPrefix srcIpPrefix;
-        private IpPrefix dstIpPrefix;
-        private byte     ipProtocol;
-        private TpPort   srcTpPort;
-        private TpPort   dstTpPort;
-
-        // private constructor not intended to use from external
-        private Builder() {
-        }
-
-        @Override
-        public DefaultStatsFlowRule build() {
-            checkArgument(srcIpPrefix != null, NOT_NULL_MSG, "Source IP Prefix");
-            checkArgument(dstIpPrefix != null, NOT_NULL_MSG, "Destination IP Prefix");
-
-            return new DefaultStatsFlowRule(srcIpPrefix,
-                                                dstIpPrefix,
-                                                ipProtocol,
-                                                srcTpPort,
-                                                dstTpPort);
-        }
-
-        @Override
-        public Builder srcIpPrefix(IpPrefix srcIpPrefix) {
-            this.srcIpPrefix = srcIpPrefix;
-            return this;
-        }
-
-        @Override
-        public Builder dstIpPrefix(IpPrefix dstIpPrefix) {
-            this.dstIpPrefix = dstIpPrefix;
-            return this;
-        }
-
-        @Override
-        public Builder ipProtocol(byte ipProtocol) {
-            this.ipProtocol = ipProtocol;
-            return this;
-        }
-
-        @Override
-        public Builder srcTpPort(TpPort srcTpPort) {
-            this.srcTpPort = srcTpPort;
-            return this;
-        }
-
-        @Override
-        public Builder dstTpPort(TpPort dstTpPort) {
-            this.dstTpPort = dstTpPort;
-            return this;
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfo.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfo.java
deleted file mode 100644
index 6e085a2..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfo.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Implementation class of StatsInfo.
- */
-public final class DefaultStatsInfo implements StatsInfo {
-
-    private final long startupTime;
-    private final long fstPktArrTime;
-    private final int lstPktOffset;
-    private final long prevAccBytes;
-    private final int prevAccPkts;
-    private final long currAccBytes;
-    private final int currAccPkts;
-    private final short errorPkts;
-    private final short dropPkts;
-
-    private DefaultStatsInfo(long startupTime, long fstPktArrTime, int lstPktOffset,
-                             long prevAccBytes, int prevAccPkts, long currAccBytes,
-                             int currAccPkts, short errorPkts, short dropPkts) {
-        this.startupTime = startupTime;
-        this.fstPktArrTime = fstPktArrTime;
-        this.lstPktOffset = lstPktOffset;
-        this.prevAccBytes = prevAccBytes;
-        this.prevAccPkts = prevAccPkts;
-        this.currAccBytes = currAccBytes;
-        this.currAccPkts = currAccPkts;
-        this.errorPkts = errorPkts;
-        this.dropPkts = dropPkts;
-    }
-
-    @Override
-    public long startupTime() {
-        return startupTime;
-    }
-
-    @Override
-    public long fstPktArrTime() {
-        return fstPktArrTime;
-    }
-
-    @Override
-    public int lstPktOffset() {
-        return lstPktOffset;
-    }
-
-    @Override
-    public long prevAccBytes() {
-        return prevAccBytes;
-    }
-
-    @Override
-    public int prevAccPkts() {
-        return prevAccPkts;
-    }
-
-    @Override
-    public long currAccBytes() {
-        return currAccBytes;
-    }
-
-    @Override
-    public int currAccPkts() {
-        return currAccPkts;
-    }
-
-    @Override
-    public short errorPkts() {
-        return errorPkts;
-    }
-
-    @Override
-    public short dropPkts() {
-        return dropPkts;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof DefaultStatsInfo) {
-            final DefaultStatsInfo other = (DefaultStatsInfo) obj;
-            return Objects.equals(this.startupTime, other.startupTime) &&
-                    Objects.equals(this.fstPktArrTime, other.fstPktArrTime) &&
-                    Objects.equals(this.lstPktOffset, other.lstPktOffset) &&
-                    Objects.equals(this.prevAccBytes, other.prevAccBytes) &&
-                    Objects.equals(this.prevAccPkts, other.prevAccPkts) &&
-                    Objects.equals(this.currAccBytes, other.currAccBytes) &&
-                    Objects.equals(this.currAccPkts, other.currAccPkts) &&
-                    Objects.equals(this.errorPkts, other.errorPkts) &&
-                    Objects.equals(this.dropPkts, other.dropPkts);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(startupTime, fstPktArrTime, lstPktOffset,
-                prevAccBytes, prevAccPkts, currAccBytes, currAccPkts,
-                errorPkts, dropPkts);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("startupTime", startupTime)
-                .add("fstPktArrTime", fstPktArrTime)
-                .add("lstPktOffset", lstPktOffset)
-                .add("prevAccBytes", prevAccBytes)
-                .add("prevAccPkts", prevAccPkts)
-                .add("currAccBytes", currAccBytes)
-                .add("currAccPkts", currAccPkts)
-                .add("errorPkts", errorPkts)
-                .add("dropPkts", dropPkts)
-                .toString();
-    }
-
-    /**
-     * Builder class of DefaultStatsInfo.
-     */
-    public static final class DefaultBuilder implements StatsInfo.Builder {
-        private long startupTime;
-        private long fstPktArrTime;
-        private int lstPktOffset;
-        private long prevAccBytes;
-        private int prevAccPkts;
-        private long currAccBytes;
-        private int currAccPkts;
-        private short errorPkts;
-        private short dropPkts;
-
-        @Override
-        public Builder withStartupTime(long startupTime) {
-            this.startupTime = startupTime;
-            return this;
-        }
-
-        @Override
-        public Builder withFstPktArrTime(long fstPktArrTime) {
-            this.fstPktArrTime = fstPktArrTime;
-            return this;
-        }
-
-        @Override
-        public Builder withLstPktOffset(int lstPktOffset) {
-            this.lstPktOffset = lstPktOffset;
-            return this;
-        }
-
-        @Override
-        public Builder withPrevAccBytes(long prevAccBytes) {
-            this.prevAccBytes = prevAccBytes;
-            return this;
-        }
-
-        @Override
-        public Builder withPrevAccPkts(int prevAccPkts) {
-            this.prevAccPkts = prevAccPkts;
-            return this;
-        }
-
-        @Override
-        public Builder withCurrAccBytes(long currAccBytes) {
-            this.currAccBytes = currAccBytes;
-            return this;
-        }
-
-        @Override
-        public Builder withCurrAccPkts(int currAccPkts) {
-            this.currAccPkts = currAccPkts;
-            return this;
-        }
-
-        @Override
-        public Builder withErrorPkts(short errorPkts) {
-            this.errorPkts = errorPkts;
-            return this;
-        }
-
-        @Override
-        public Builder withDropPkts(short dropPkts) {
-            this.dropPkts = dropPkts;
-            return this;
-        }
-
-        @Override
-        public StatsInfo build() {
-
-            return new DefaultStatsInfo(startupTime, fstPktArrTime, lstPktOffset,
-                    prevAccBytes, prevAccPkts, currAccBytes, currAccPkts,
-                    errorPkts, dropPkts);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java
deleted file mode 100644
index d130446..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Queue;
-import java.util.Set;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.ImmutableMap.copyOf;
-
-/**
- * Implementation of TelemetryConfig.
- */
-public final class DefaultTelemetryConfig implements TelemetryConfig {
-    private final String name;
-    private final ConfigType type;
-    private final List<TelemetryConfig> parents;
-
-    private final String manufacturer;
-    private final String swVersion;
-    private final boolean enabled;
-
-    private final Map<String, String> properties;
-
-    /**
-     * Creates a configuration with the specified name.
-     *
-     * @param name          configuration name
-     * @param type          configuration type
-     * @param parents       optional parent configurations
-     * @param manufacturer  off-platform application manufacturer
-     * @param swVersion     off-platform application software version
-     * @param enabled       service enable flag
-     * @param properties    properties for telemetry configuration
-     */
-    public DefaultTelemetryConfig(String name, ConfigType type,
-                                  List<TelemetryConfig> parents,
-                                  String manufacturer, String swVersion,
-                                  boolean enabled, Map<String, String> properties) {
-        this.name = checkNotNull(name, "Name cannot be null");
-        this.type = checkNotNull(type, "type cannot be null");
-        this.parents = parents == null ? ImmutableList.of() : ImmutableList.copyOf(parents);
-        this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null");
-        this.swVersion = checkNotNull(swVersion, "SW version cannot be null");
-        this.properties = copyOf(checkNotNull(properties, "Properties cannot be null"));
-        this.enabled = enabled;
-    }
-
-    @Override
-    public String name() {
-        return name;
-    }
-
-    @Override
-    public ConfigType type() {
-        return type;
-    }
-
-    @Override
-    public List<TelemetryConfig> parents() {
-        if (parents == null) {
-            return ImmutableList.of();
-        } else {
-            return ImmutableList.copyOf(parents);
-        }
-    }
-
-    @Override
-    public String manufacturer() {
-        return manufacturer;
-    }
-
-    @Override
-    public String swVersion() {
-        return swVersion;
-    }
-
-    @Override
-    public boolean enabled() {
-        return enabled;
-    }
-
-    @Override
-    public Map<String, String> properties() {
-        if (properties == null) {
-            return ImmutableMap.of();
-        } else {
-            return ImmutableMap.copyOf(properties);
-        }
-    }
-
-    @Override
-    public String getProperty(String name) {
-        Queue<TelemetryConfig> queue = new LinkedList<>();
-        queue.add(this);
-        while (!queue.isEmpty()) {
-            TelemetryConfig config = queue.remove();
-            String property = config.properties().get(name);
-            if (property != null) {
-                return property;
-            } else if (config.parents() != null) {
-                queue.addAll(config.parents());
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public TelemetryConfig merge(TelemetryConfig other) {
-        // merge the properties
-        ImmutableMap.Builder<String, String> properties = ImmutableMap.builder();
-        properties.putAll(other.properties());
-
-        // remove duplicated properties from this configuration and merge
-        this.properties().entrySet().stream()
-                .filter(e -> !other.properties().containsKey(e.getKey()))
-                .forEach(properties::put);
-
-        List<TelemetryConfig> completeParents = new ArrayList<>();
-
-        if (parents != null) {
-            parents.forEach(parent -> other.parents().forEach(otherParent -> {
-                if (otherParent.name().equals(parent.name())) {
-                    completeParents.add(parent.merge(otherParent));
-                } else if (!completeParents.contains(otherParent)) {
-                    completeParents.add(otherParent);
-                } else if (!completeParents.contains(parent)) {
-                    completeParents.add(parent);
-                }
-            }));
-        }
-
-        return new DefaultTelemetryConfig(name, type,
-                !completeParents.isEmpty() ? completeParents : other.parents(),
-                manufacturer, swVersion, enabled, properties.build());
-    }
-
-    @Override
-    public TelemetryConfig updateProperties(Map<String, String> properties) {
-
-        return new DefaultTelemetryConfig(name, type, parents, manufacturer,
-                swVersion, enabled, properties);
-    }
-
-    @Override
-    public TelemetryConfig updateEnabled(boolean enabled) {
-        return new DefaultTelemetryConfig(name, type, parents, manufacturer,
-                swVersion, enabled, properties);
-    }
-
-    @Override
-    public Set<String> keys() {
-        return properties.keySet();
-    }
-
-    @Override
-    public String value(String key) {
-        return properties.get(key);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("type", type)
-                .add("parents", parents)
-                .add("manufacturer", manufacturer)
-                .add("swVersion", swVersion)
-                .add("enabled", enabled)
-                .add("properties", properties)
-                .toString();
-    }
-
-    @Override
-    public boolean equals(Object configToBeCompared) {
-        if (this == configToBeCompared) {
-            return true;
-        }
-
-        if (configToBeCompared == null || getClass() != configToBeCompared.getClass()) {
-            return false;
-        }
-
-        DefaultTelemetryConfig telemetryConfig =
-                                    (DefaultTelemetryConfig) configToBeCompared;
-        return name.equals(telemetryConfig.name());
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(name);
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
index 8fc31a6..d066d85 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
@@ -19,6 +19,7 @@
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigStore;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
index 962779a..38dd2b8 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
@@ -201,7 +201,7 @@
 
             InfluxDB producer = InfluxDBFactory.connect(influxDbServerBuilder.toString(),
                     influxDbConfig.username(), influxDbConfig.password());
-            producers.put(config.name(), producer);
+            producers.put(name, producer);
 
             createDB(producer, influxDbConfig.database());
         }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
index 152bfde..06936ca 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
@@ -54,8 +54,6 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String CODEC_PREFIX = "org.onosproject.openstacktelemetry.codec.";
-
     private static final String BOOTSTRAP_SERVERS = "bootstrap.servers";
     private static final String RETRIES = "retries";
     private static final String ACKS = "acks";
@@ -102,11 +100,10 @@
         Set<Future<RecordMetadata>> futureSet = Sets.newHashSet();
         producers.forEach((k, v) -> {
             TelemetryConfig config = telemetryConfigService.getConfig(k);
-            KafkaTelemetryConfig kafkaConfig =
-                    fromTelemetryConfig(config);
+            KafkaTelemetryConfig kafkaConfig = fromTelemetryConfig(config);
 
             try {
-                Class codecClazz = Class.forName(CODEC_PREFIX + kafkaConfig.codec());
+                Class codecClazz = Class.forName(kafkaConfig.codec());
                 TelemetryCodec codec = (TelemetryCodec) codecClazz.newInstance();
 
                 ByteBuffer buffer = codec.encode(flowInfos);
@@ -148,7 +145,7 @@
             prop.put(KEY_SERIALIZER, kafkaConfig.keySerializer());
             prop.put(VALUE_SERIALIZER, kafkaConfig.valueSerializer());
 
-            producers.put(config.name(), new KafkaProducer<>(prop));
+            producers.put(name, new KafkaProducer<>(prop));
         }
     }
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
index 3d9f577..30faac7 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
@@ -57,6 +57,9 @@
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
+import org.onosproject.openstacktelemetry.api.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.api.DefaultStatsFlowRule;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
index 3ae2504..9832ad3 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
@@ -23,6 +23,7 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.ListenerRegistry;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
 import org.onosproject.openstacktelemetry.api.TelemetryConfigListener;
@@ -74,6 +75,7 @@
 
     private static final String ERR_NULL_CONFIG = "Telemetry config cannot be null";
     private static final String NO_CONFIG = "Telemetry config not found";
+    private static final String ERR_NULL_CONFIG_NAME = "Telemetry config name cannot be null";
 
     private static final KryoNamespace SERIALIZER_TELEMETRY_CONFIG =
             KryoNamespace.newBuilder()
@@ -175,6 +177,14 @@
     }
 
     @Override
+    public void removeTelemetryConfig(String name) {
+        checkNotNull(name, ERR_NULL_CONFIG_NAME);
+
+        telemetryConfigStore.removeTelemetryConfig(name);
+        log.info(String.format(MSG_TELEMETRY_CONFIG, name, MSG_REMOVED));
+    }
+
+    @Override
     public TelemetryConfig getConfig(String name) {
         return nullIsNotFound(telemetryConfigStore.telemetryConfig(name), NO_CONFIG);
     }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
index 39a5df0..c9c6e9f 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
@@ -21,6 +21,7 @@
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
 import java.io.IOException;
@@ -45,8 +46,8 @@
  * </p>
  * <pre>
  *     &lt;configs&gt;
- *         &lt;config name=“...” [manufacturer="..." swVersion="..."]&gt;
- *            [&lt;property name=“key”&gt;value&lt;/key&gt;]
+ *         &lt;config name="..." [manufacturer="..." swVersion="..."]&gt;
+ *            [&lt;property name="key"&gt;value&lt;/key&gt;]
  *            ...
  *        &lt;/config&gt;
  *        ...
@@ -203,10 +204,16 @@
         ImmutableMap.Builder<String, String> properties = ImmutableMap.builder();
 
         // note that, we only allow the inheritance from single source
-        Map<String, String> parentConfigs = Maps.newHashMap();
+        final Map<String, String> parentConfigs = Maps.newHashMap();
         if (!parents.isEmpty()) {
             TelemetryConfig parent = parents.get(0);
-            parentConfigs = parent.properties();
+            parent.properties().forEach(parentConfigs::put);
+        }
+
+        for (HierarchicalConfiguration b : config.configurationsAt(PROPERTY)) {
+            if (parentConfigs.keySet().contains(b.getString(NAME))) {
+                parentConfigs.remove(b.getString(NAME));
+            }
         }
 
         properties.putAll(parentConfigs);
@@ -214,6 +221,7 @@
         for (HierarchicalConfiguration b : config.configurationsAt(PROPERTY)) {
             properties.put(b.getString(NAME), (String) b.getRootNode().getValue());
         }
+
         return properties.build();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java
deleted file mode 100644
index c8bfeb5..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.web;
-
-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.onosproject.codec.CodecService;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.codec.FlowInfoJsonCodec;
-import org.onosproject.openstacktelemetry.codec.StatsFlowRuleJsonCodec;
-import org.onosproject.openstacktelemetry.codec.StatsInfoJsonCodec;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Implementation of the JSON codec brokering service for OpenstackTelemetry.
- */
-@Component(immediate = true)
-public class OpenstackTelemetryCodecRegister {
-
-    private final org.slf4j.Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected CodecService codecService;
-
-    @Activate
-    protected void activate() {
-        codecService.registerCodec(StatsInfo.class, new StatsInfoJsonCodec());
-        codecService.registerCodec(FlowInfo.class, new FlowInfoJsonCodec());
-        codecService.registerCodec(StatsFlowRule.class, new StatsFlowRuleJsonCodec());
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        codecService.unregisterCodec(StatsInfo.class);
-        codecService.unregisterCodec(FlowInfo.class);
-        codecService.unregisterCodec(StatsFlowRule.class);
-
-        log.info("Stopped");
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebApplication.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebApplication.java
deleted file mode 100644
index 9dc4e18..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.web;
-
-import org.onlab.rest.AbstractWebApplication;
-
-import java.util.Set;
-
-/**
- * Openstack telemetry REST APIs web application.
- */
-public class OpenstackTelemetryWebApplication extends AbstractWebApplication {
-    @Override
-    public Set<Class<?>> getClasses() {
-        return getClasses(OpenstackTelemetryWebResource.class);
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebResource.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebResource.java
deleted file mode 100644
index 34f8366..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryWebResource.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.web;
-
-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.Sets;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
-import org.onosproject.openstacktelemetry.codec.FlowInfoJsonCodec;
-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.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.UriBuilder;
-import javax.ws.rs.core.UriInfo;
-import java.io.InputStream;
-import java.util.Set;
-
-import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
-import static javax.ws.rs.core.Response.created;
-import static org.onlab.util.Tools.readTreeFromStream;
-
-/**
- * Handles REST API call of openstack telemetry.
- */
-
-@Path("telemetry")
-public class OpenstackTelemetryWebResource extends AbstractWebResource {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final ObjectNode root = mapper().createObjectNode();
-
-    private static final String JSON_NODE_FLOW_RULE = "rules";
-    private static final String FLOW_RULE_ID = "STATS_FLOW_RULE_ID";
-
-    private final StatsFlowRuleAdminService
-                    statsFlowRuleService = get(StatsFlowRuleAdminService.class);
-
-    @Context
-    private UriInfo uriInfo;
-
-    /**
-     * Creates a flow rule for metric.
-     *
-     * @param input openstack flow rule JSON input stream
-     * @return 201 CREATED if the JSON is correct,
-     *         400 BAD_REQUEST if the JSON is malformed.
-     */
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createBulkFlowRule(InputStream input) {
-        log.info("CREATE BULK FLOW RULE: {}", input.toString());
-
-        readNodeConfiguration(input).forEach(flowRule -> {
-                log.debug("FlowRule: {}", flowRule.toString());
-                statsFlowRuleService.createStatFlowRule(flowRule);
-            });
-
-        UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
-                                            .path(JSON_NODE_FLOW_RULE)
-                                            .path(FLOW_RULE_ID);
-
-        return created(locationBuilder.build()).build();
-    }
-
-    /**
-     * Delete flow rules.
-     *
-     * @param input openstack flow rule JSON input stream
-     * @return 200 OK if processing is correct.
-     */
-    @DELETE
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteBulkFlowRule(InputStream input) {
-        log.info("DELETE BULK FLOW RULE: {}", input.toString());
-
-        readNodeConfiguration(input).forEach(flowRule -> {
-            log.debug("FlowRule: {}", flowRule.toString());
-            statsFlowRuleService.deleteStatFlowRule(flowRule);
-        });
-
-        return ok(root).build();
-    }
-
-    /**
-     * Get flow rules which is installed on ONOS.
-     *
-     * @return 200 OK
-     */
-    public Response readBulkFlowRule() {
-        log.info("READ BULK FLOW RULE");
-
-        return ok(root).build();
-    }
-
-    /**
-     * Get flow information list.
-     *
-     * @return Flow information list
-     */
-    @GET
-    @Path("list")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getFlowInfoBulk() {
-        log.info("GET BULK FLOW RULE");
-
-        Set<FlowInfo> flowInfoSet;
-        flowInfoSet = statsFlowRuleService.getOverlayFlowInfos();
-
-        log.info("\n\n======================================================\n" +
-                 "FlowInfo Set: \n{}" +
-                 "\n\n======================================================\n",
-                 flowInfoSet);
-
-        JsonCodec<FlowInfo> flowInfoCodec = new FlowInfoJsonCodec();
-
-        ObjectNode nodeJson;
-        int idx = 0;
-        for (FlowInfo flowInfo: flowInfoSet) {
-            nodeJson = flowInfoCodec.encode(flowInfo, this);
-            root.put("FlowInfo" + String.valueOf(idx++), nodeJson.toString());
-        }
-        return ok(root).build();
-    }
-
-    @GET
-    @Path("list/{srcIpPrefix}/{dstIpPrefix}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getFlowRule(@PathParam("srcIpPrefix") String srcIpPrefix,
-                                @PathParam("dstIpPrefix") String dstIpPrefix) {
-        return ok(root).build();
-    }
-
-    private Set<StatsFlowRule> readNodeConfiguration(InputStream input) {
-        log.info("Input JSON Data: \n\t\t{}", input.toString());
-        Set<StatsFlowRule> flowRuleSet = Sets.newHashSet();
-        try {
-            JsonNode jsonTree = readTreeFromStream(mapper().enable(INDENT_OUTPUT), input);
-            ArrayNode nodes = (ArrayNode) jsonTree.path(JSON_NODE_FLOW_RULE);
-            nodes.forEach(node -> {
-                try {
-                    ObjectNode objectNode = node.deepCopy();
-                    log.debug("ObjectNode: {}", objectNode.toString());
-                    StatsFlowRule statsFlowRule = codec(StatsFlowRule.class)
-                                                        .decode(objectNode, this);
-                    log.debug("StatsFlowRule: {}", statsFlowRule.toString());
-                    flowRuleSet.add(statsFlowRule);
-                } catch (Exception ex) {
-                    log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
-                    throw new IllegalArgumentException();
-                }
-            });
-        } catch (Exception ex) {
-            log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
-            throw new IllegalArgumentException(ex);
-        }
-
-        return flowRuleSet;
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/package-info.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/package-info.java
deleted file mode 100644
index 24c5ed66..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2018-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 GUI and REST API of openstack telemetry.
- */
-package org.onosproject.openstacktelemetry.web;
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/definitions/dummy.json b/apps/openstacktelemetry/app/src/main/resources/definitions/dummy.json
deleted file mode 100644
index 7a73a41..0000000
--- a/apps/openstacktelemetry/app/src/main/resources/definitions/dummy.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml
index 7429ac2..48623b6 100644
--- a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml
@@ -34,6 +34,8 @@
         </property>
         <property name="topic">sona.flow</property>
         <property name="key">flowdata</property>
-        <property name="codec">TinaMessageByteBufferCodec</property>
+        <property name="codec">
+            org.onosproject.openstacktelemetry.codec.bytebuffer.TinaMessageByteBufferCodec
+        </property>
     </config>
 </configs>
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/webapp/WEB-INF/web.xml b/apps/openstacktelemetry/app/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 1181c43..0000000
--- a/apps/openstacktelemetry/app/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-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>Openstack Telemetry 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.openstacktelemetry.web.OpenstackTelemetryWebApplication</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/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
deleted file mode 100644
index ee84e59..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.codec.impl.CodecManager;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
-
-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.net.NetTestTools.APP_ID;
-import static org.onosproject.openstacktelemetry.codec.FlowInfoJsonMatcher.matchesFlowInfo;
-
-/**
- * Unit tests for FlowInfo codec.
- */
-public class FlowInfoJsonCodecTest {
-    MockCodecContext context;
-    JsonCodec<FlowInfo> flowInfoCodec;
-    JsonCodec<StatsInfo> statsInfoCodec;
-    final CoreService mockCoreService = createMock(CoreService.class);
-    private static final String REST_APP_ID = "org.onosproject.rest";
-
-    private static final int INPUT_INTERFACE_ID = 1;
-    private static final int OUTPUT_INTERFACE_ID = 2;
-
-    private static final int VLAN_ID = 1;
-    private static final short VXLAN_ID = 10;
-    private static final int PROTOCOL = 1;
-    private static final int FLOW_TYPE = 1;
-    private static final String DEVICE_ID = "of:00000000000000a1";
-
-    private static final String SRC_IP_ADDRESS = "10.10.10.1";
-    private static final int SRC_IP_PREFIX = 24;
-    private static final String DST_IP_ADDRESS = "20.20.20.1";
-    private static final int DST_IP_PREFIX = 24;
-    private static final int SRC_PORT = 1000;
-    private static final int DST_PORT = 2000;
-    private static final String SRC_MAC_ADDRESS = "AA:BB:CC:DD:EE:FF";
-    private static final String DST_MAC_ADDRESS = "FF:EE:DD:CC:BB:AA";
-
-    private static final long LONG_VALUE = 1L;
-    private static final int INTEGER_VALUE = 1;
-    private static final short SHORT_VALUE = (short) 1;
-
-    /**
-     * Initial setup for this unit test.
-     */
-    @Before
-    public void setUp() {
-        context = new MockCodecContext();
-        flowInfoCodec = new FlowInfoJsonCodec();
-        statsInfoCodec = new StatsInfoJsonCodec();
-
-        assertThat(flowInfoCodec, notNullValue());
-        assertThat(statsInfoCodec, notNullValue());
-
-        expect(mockCoreService.registerApplication(REST_APP_ID))
-                .andReturn(APP_ID).anyTimes();
-        replay(mockCoreService);
-        context.registerService(CoreService.class, mockCoreService);
-    }
-
-    /**
-     * Tests the flow info encoding.
-     */
-    @Test
-    public void testEncode() {
-        StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder()
-                                    .withStartupTime(LONG_VALUE)
-                                    .withFstPktArrTime(LONG_VALUE)
-                                    .withLstPktOffset(INTEGER_VALUE)
-                                    .withPrevAccBytes(LONG_VALUE)
-                                    .withPrevAccPkts(INTEGER_VALUE)
-                                    .withCurrAccBytes(LONG_VALUE)
-                                    .withCurrAccPkts(INTEGER_VALUE)
-                                    .withErrorPkts(SHORT_VALUE)
-                                    .withDropPkts(SHORT_VALUE)
-                                    .build();
-        FlowInfo flowInfo = new DefaultFlowInfo.DefaultBuilder()
-                                    .withFlowType((byte) FLOW_TYPE)
-                                    .withDeviceId(DeviceId.deviceId(DEVICE_ID))
-                                    .withInputInterfaceId(INPUT_INTERFACE_ID)
-                                    .withOutputInterfaceId(OUTPUT_INTERFACE_ID)
-                                    .withVlanId(VlanId.vlanId((short) VLAN_ID))
-                                    .withSrcIp(IpPrefix.valueOf(
-                                            IpAddress.valueOf(SRC_IP_ADDRESS), SRC_IP_PREFIX))
-                                    .withDstIp(IpPrefix.valueOf(
-                                            IpAddress.valueOf(DST_IP_ADDRESS), DST_IP_PREFIX))
-                                    .withSrcPort(TpPort.tpPort(SRC_PORT))
-                                    .withDstPort(TpPort.tpPort(DST_PORT))
-                                    .withProtocol((byte) PROTOCOL)
-                                    .withSrcMac(MacAddress.valueOf(SRC_MAC_ADDRESS))
-                                    .withDstMac(MacAddress.valueOf(DST_MAC_ADDRESS))
-                                    .withStatsInfo(statsInfo)
-                                    .build();
-
-        ObjectNode nodeJson = flowInfoCodec.encode(flowInfo, context);
-        assertThat(nodeJson, matchesFlowInfo(flowInfo));
-
-        FlowInfo flowInfoDecoded = flowInfoCodec.decode(nodeJson, context);
-        new EqualsTester().addEqualityGroup(flowInfo, flowInfoDecoded).testEquals();
-    }
-
-    /**
-     * Mock codec context for use in codec unit tests.
-     */
-    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
-        @SuppressWarnings("unchecked")
-        public <T> JsonCodec<T> codec(Class<T> entityClass) {
-            if (entityClass == FlowInfo.class) {
-                return (JsonCodec<T>) flowInfoCodec;
-            }
-            if (entityClass == StatsInfo.class) {
-                return (JsonCodec<T>) statsInfoCodec;
-            }
-            return manager.getCodec(entityClass);
-        }
-
-        @SuppressWarnings("unchecked")
-        @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/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonMatcher.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonMatcher.java
deleted file mode 100644
index 7574054..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonMatcher.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-/**
- * Hamcrest matcher for flow info.
- */
-public final class FlowInfoJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final FlowInfo flowInfo;
-
-    private static final String FLOW_TYPE = "flowType";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String INPUT_INTERFACE_ID = "inputInterfaceId";
-    private static final String OUTPUT_INTERFACE_ID = "outputInterfaceId";
-
-    private static final String VLAN_ID = "vlanId";
-    private static final String VXLAN_ID = "vxlanId";
-    private static final String SRC_IP = "srcIp";
-    private static final String SRC_IP_PREFIX_LEN = "srcIpPrefixLength";
-    private static final String DST_IP = "dstIp";
-    private static final String DST_IP_PREFIX_LEN = "dstIpPrefixLength";
-    private static final String SRC_PORT = "srcPort";
-    private static final String DST_PORT = "dstPort";
-    private static final String PROTOCOL = "protocol";
-    private static final String SRC_MAC = "srcMac";
-    private static final String DST_MAC = "dstMac";
-    private static final String STATS_INFO = "statsInfo";
-
-    private FlowInfoJsonMatcher(FlowInfo flowInfo) {
-        this.flowInfo = flowInfo;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-
-        // check flow type
-        String jsonFlowType = jsonNode.get(FLOW_TYPE).asText();
-        String flowType = String.valueOf(flowInfo.flowType());
-        if (!jsonFlowType.equals(flowType)) {
-            description.appendText("flow type was " + jsonFlowType);
-            return false;
-        }
-
-        // check device id
-        String jsonDeviceId = jsonNode.get(DEVICE_ID).asText();
-        String deviceId = flowInfo.deviceId().toString();
-        if (!jsonDeviceId.equals(deviceId)) {
-            description.appendText("device id was " + jsonDeviceId);
-            return false;
-        }
-
-        // check input interface id
-        int jsonInputInterfaceId = jsonNode.get(INPUT_INTERFACE_ID).asInt();
-        int inputInterfaceId = flowInfo.inputInterfaceId();
-        if (jsonInputInterfaceId != inputInterfaceId) {
-            description.appendText("input interface id was " + jsonInputInterfaceId);
-            return false;
-        }
-
-        // check output interface id
-        int jsonOutputInterfaceId = jsonNode.get(OUTPUT_INTERFACE_ID).asInt();
-        int outputInterfaceId = flowInfo.outputInterfaceId();
-        if (jsonOutputInterfaceId != outputInterfaceId) {
-            description.appendText("output interface id was " + jsonInputInterfaceId);
-            return false;
-        }
-
-        // check vlan id
-        try {
-            if (!(jsonNode.get(VLAN_ID).isNull())) {
-                String jsonVlanId = jsonNode.get(VLAN_ID).asText();
-                String vlanId = flowInfo.vlanId().toString();
-                if (!jsonVlanId.equals(vlanId)) {
-                    description.appendText("VLAN id was " + jsonVlanId);
-                    return false;
-                }
-            }
-        } catch (NullPointerException ex) {
-            description.appendText("VLAN id was null");
-        }
-
-        // check source IP
-        String jsonSrcIp = jsonNode.get(SRC_IP).asText();
-        String srcIp = flowInfo.srcIp().address().toString();
-        if (!jsonSrcIp.equals(srcIp)) {
-            description.appendText("Source IP was " + jsonSrcIp);
-            return false;
-        }
-
-        // check destination IP
-        String jsonDstIp = jsonNode.get(DST_IP).asText();
-        String dstIp = flowInfo.dstIp().address().toString();
-        if (!jsonDstIp.equals(dstIp)) {
-            description.appendText("Destination IP was " + jsonDstIp);
-            return false;
-        }
-
-        // check source IP prefix length
-        int jsonSrcPrefixLength = jsonNode.get(SRC_IP_PREFIX_LEN).asInt();
-        int srcPrefixLength = flowInfo.srcIp().prefixLength();
-        if (jsonSrcPrefixLength != srcPrefixLength) {
-            description.appendText("Source IP prefix length was " + jsonSrcPrefixLength);
-            return false;
-        }
-
-        // check destination IP prefix length
-        int jsonDstPrefixLength = jsonNode.get(DST_IP_PREFIX_LEN).asInt();
-        int dstPrefixLength = flowInfo.dstIp().prefixLength();
-        if (jsonDstPrefixLength != dstPrefixLength) {
-            description.appendText("Destination IP prefix length was " + jsonDstPrefixLength);
-            return false;
-        }
-
-        // check source port
-        int jsonSrcPort = jsonNode.get(SRC_PORT).asInt();
-        int srcPort = flowInfo.srcPort().toInt();
-        if (jsonSrcPort != srcPort) {
-            description.appendText("Source port was " + jsonSrcPort);
-            return false;
-        }
-
-        // check destination port
-        int jsonDstPort = jsonNode.get(DST_PORT).asInt();
-        int dstPort = flowInfo.dstPort().toInt();
-        if (jsonDstPort != dstPort) {
-            description.appendText("Destination port was " + jsonDstPort);
-            return false;
-        }
-
-        // check protocol
-        String jsonProtocol = jsonNode.get(PROTOCOL).asText();
-        String protocol = String.valueOf(flowInfo.protocol());
-        if (!jsonProtocol.equals(protocol)) {
-            description.appendText("Protocol was " + jsonProtocol);
-            return false;
-        }
-
-        // check source mac
-        String jsonSrcMac = jsonNode.get(SRC_MAC).asText();
-        String srcMac = flowInfo.srcMac().toString();
-        if (!jsonSrcMac.equals(srcMac)) {
-            description.appendText("Source MAC was " + jsonSrcMac);
-            return false;
-        }
-
-        // check destination mac
-        String jsonDstMac = jsonNode.get(DST_MAC).asText();
-        String dstMac = flowInfo.dstMac().toString();
-        if (!jsonDstMac.equals(dstMac)) {
-            description.appendText("Destination MAC was " + jsonDstMac);
-            return false;
-        }
-
-        // check stats info
-        JsonNode jsonStatsInfo = jsonNode.get(STATS_INFO);
-        if (jsonStatsInfo != null) {
-            StatsInfo statsInfo = flowInfo.statsInfo();
-            StatsInfoJsonMatcher infoMatcher =
-                    StatsInfoJsonMatcher.matchStatsInfo(statsInfo);
-            return infoMatcher.matches(jsonStatsInfo);
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(flowInfo.toString());
-    }
-
-    /**
-     * Factory to allocate an flow info matcher.
-     *
-     * @param flowInfo flow info object we are looking for
-     * @return matcher
-     */
-    public static FlowInfoJsonMatcher matchesFlowInfo(FlowInfo flowInfo) {
-        return new FlowInfoJsonMatcher(flowInfo);
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonMatcher.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonMatcher.java
deleted file mode 100644
index ffebaf5..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/StatsInfoJsonMatcher.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.codec;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import org.hamcrest.Description;
-import org.hamcrest.TypeSafeDiagnosingMatcher;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-/**
- * Hamcrest matcher for StatsInfoJsonCodec.
- */
-public final class StatsInfoJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
-
-    private final StatsInfo statsInfo;
-
-    private static final String STARTUP_TIME = "startupTime";
-    private static final String FST_PKT_ARR_TIME = "fstPktArrTime";
-    private static final String LST_PKT_OFFSET = "lstPktOffset";
-    private static final String PREV_ACC_BYTES = "prevAccBytes";
-    private static final String PREV_ACC_PKTS = "prevAccPkts";
-    private static final String CURR_ACC_BYTES = "currAccBytes";
-    private static final String CURR_ACC_PKTS = "currAccPkts";
-    private static final String ERROR_PKTS = "errorPkts";
-    private static final String DROP_PKTS = "dropPkts";
-
-    private StatsInfoJsonMatcher(StatsInfo statsInfo) {
-        this.statsInfo = statsInfo;
-    }
-
-    @Override
-    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
-
-        // check startup time
-        long jsonStartupTime = jsonNode.get(STARTUP_TIME).asLong();
-        long startupTime = statsInfo.startupTime();
-        if (jsonStartupTime != startupTime) {
-            description.appendText("startup time was " + jsonStartupTime);
-            return false;
-        }
-
-        // check first packet arrival time
-        long jsonFstPktArrTime = jsonNode.get(FST_PKT_ARR_TIME).asLong();
-        long fstPktArrTime = statsInfo.fstPktArrTime();
-        if (jsonFstPktArrTime != fstPktArrTime) {
-            description.appendText("first packet arrival time was " + jsonFstPktArrTime);
-            return false;
-        }
-
-        // check last packet offset
-        int jsonLstPktOffset = jsonNode.get(LST_PKT_OFFSET).asInt();
-        int lstPktOffset = statsInfo.lstPktOffset();
-        if (jsonLstPktOffset != lstPktOffset) {
-            description.appendText("last packet offset was " + jsonLstPktOffset);
-            return false;
-        }
-
-        // check previous accumulated bytes
-        long jsonPrevAccBytes = jsonNode.get(PREV_ACC_BYTES).asLong();
-        long preAccBytes = statsInfo.prevAccBytes();
-        if (jsonPrevAccBytes != preAccBytes) {
-            description.appendText("previous accumulated bytes was " + jsonPrevAccBytes);
-            return false;
-        }
-
-        // check previous accumulated packets
-        int jsonPreAccPkts = jsonNode.get(PREV_ACC_PKTS).asInt();
-        int preAccPkts = statsInfo.prevAccPkts();
-        if (jsonPreAccPkts != preAccPkts) {
-            description.appendText("previous accumulated packets was " + jsonPreAccPkts);
-            return false;
-        }
-
-        // check current accumulated bytes
-        long jsonCurrAccBytes = jsonNode.get(CURR_ACC_BYTES).asLong();
-        long currAccBytes = statsInfo.currAccBytes();
-        if (jsonCurrAccBytes != currAccBytes) {
-            description.appendText("current accumulated bytes was " + jsonCurrAccBytes);
-            return false;
-        }
-
-        // check current accumulated packets
-        int jsonCurrAccPkts = jsonNode.get(CURR_ACC_PKTS).asInt();
-        int currAccPkts = statsInfo.currAccPkts();
-        if (jsonCurrAccPkts != currAccPkts) {
-            description.appendText("current accumulated packets was " + jsonCurrAccPkts);
-            return false;
-        }
-
-        // check error packets
-        short jsonErrorPkts = (short) jsonNode.get(ERROR_PKTS).asInt();
-        short errorPkts = statsInfo.errorPkts();
-        if (jsonErrorPkts != errorPkts) {
-            description.appendText("error packets was " + jsonErrorPkts);
-            return false;
-        }
-
-        // check drop packets
-        short jsonDropPkts = (short) jsonNode.get(DROP_PKTS).asInt();
-        short dropPkts = statsInfo.dropPkts();
-        if (jsonDropPkts != dropPkts) {
-            description.appendText("drop packets was " + jsonDropPkts);
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText(statsInfo.toString());
-    }
-
-    /**
-     * Factory to allocate a stats info matcher.
-     *
-     * @param statsInfo stats info object we are looking for
-     * @return matcher
-     */
-    public static StatsInfoJsonMatcher matchStatsInfo(StatsInfo statsInfo) {
-        return new StatsInfoJsonMatcher(statsInfo);
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodecTest.java
similarity index 92%
rename from apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
rename to apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodecTest.java
index 8f4af77..b1f48e4 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaFlowInfoByteBufferCodecTest.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import com.google.common.testing.EqualsTester;
 import org.junit.Before;
@@ -24,10 +24,10 @@
 import org.onlab.packet.TpPort;
 import org.onlab.packet.VlanId;
 import org.onosproject.net.DeviceId;
+import org.onosproject.openstacktelemetry.api.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultFlowInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
 
 import java.nio.ByteBuffer;
 
@@ -52,8 +52,7 @@
     private static final MacAddress DST_MAC_ADDRESS = MacAddress.valueOf("FF:EE:DD:CC:BB:AA");
 
     private FlowInfo info;
-    private final TinaFlowInfoByteBufferCodec codec =
-            new TinaFlowInfoByteBufferCodec();
+    private final TinaFlowInfoByteBufferCodec codec = new TinaFlowInfoByteBufferCodec();
 
     /**
      * Initial setup for this unit test.
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodecTest.java
similarity index 90%
rename from apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
rename to apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodecTest.java
index f32e5bb..d217aea 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/bytebuffer/TinaStatsInfoByteBufferCodecTest.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacktelemetry.codec;
+package org.onosproject.openstacktelemetry.codec.bytebuffer;
 
 import com.google.common.testing.EqualsTester;
 import org.junit.Before;
 import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
 
 import java.nio.ByteBuffer;
 
@@ -39,8 +39,7 @@
     private static final short DROP_PACKETS = 30000;
 
     private StatsInfo info;
-    private final TinaStatsInfoByteBufferCodec codec =
-                                            new TinaStatsInfoByteBufferCodec();
+    private final TinaStatsInfoByteBufferCodec codec = new TinaStatsInfoByteBufferCodec();
 
     /**
      * Initial setup for this unit test.
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
index c56247f..89fc1d0 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.impl.DefaultTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 
 import java.util.Map;
 
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
index cd4a973..9f84015 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 import org.onosproject.openstacktelemetry.api.config.InfluxDbTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.impl.DefaultTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 
 import java.util.Map;
 
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
index ba9b34b..999bcf1 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 import org.onosproject.openstacktelemetry.api.config.KafkaTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.impl.DefaultTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 
 import java.util.Map;
 
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
index de94f83..4a89b74 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 import org.onosproject.openstacktelemetry.api.config.PrometheusTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.impl.DefaultTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 
 import java.util.Map;
 
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
index c78bb63..28b8465 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.impl.DefaultTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 
 import java.util.Map;
 
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
deleted file mode 100644
index 1d03415..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * Unit tests for DefaultFlowInfo class.
- */
-public final class DefaultFlowInfoTest {
-
-    private static final String IP_ADDRESS_1 = "10.10.10.1";
-    private static final String IP_ADDRESS_2 = "20.20.20.1";
-
-    private static final String MAC_ADDRESS_1 = "AA:BB:CC:DD:EE:FF";
-    private static final String MAC_ADDRESS_2 = "FF:EE:DD:CC:BB:AA";
-
-    private static final int IP_PREFIX_LENGTH_1 = 10;
-    private static final int IP_PREFIX_LENGTH_2 = 20;
-
-    private static final int PORT_1 = 1000;
-    private static final int PORT_2 = 2000;
-
-    private static final int STATIC_INTEGER_1 = 1;
-    private static final int STATIC_INTEGER_2 = 2;
-
-    private static final String STATIC_STRING_1 = "1";
-    private static final String STATIC_STRING_2 = "2";
-
-
-    private FlowInfo info1;
-    private FlowInfo sameAsInfo1;
-    private FlowInfo info2;
-
-    /**
-     * Initial setup for this unit test.
-     */
-    @Before
-    public void setUp() {
-
-        FlowInfo.Builder builder1 = new DefaultFlowInfo.DefaultBuilder();
-        FlowInfo.Builder builder2 = new DefaultFlowInfo.DefaultBuilder();
-        FlowInfo.Builder builder3 = new DefaultFlowInfo.DefaultBuilder();
-
-        StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
-
-        info1 = builder1
-                .withFlowType((byte) STATIC_INTEGER_1)
-                .withInputInterfaceId(STATIC_INTEGER_1)
-                .withOutputInterfaceId(STATIC_INTEGER_1)
-                .withDeviceId(DeviceId.deviceId(STATIC_STRING_1))
-                .withSrcIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
-                .withDstIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
-                .withSrcPort(TpPort.tpPort(PORT_1))
-                .withDstPort(TpPort.tpPort(PORT_1))
-                .withProtocol((byte) STATIC_INTEGER_1)
-                .withVlanId(VlanId.vlanId(STATIC_STRING_1))
-                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_1))
-                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_1))
-                .withStatsInfo(statsInfo)
-                .build();
-
-        sameAsInfo1 = builder2
-                .withFlowType((byte) STATIC_INTEGER_1)
-                .withInputInterfaceId(STATIC_INTEGER_1)
-                .withOutputInterfaceId(STATIC_INTEGER_1)
-                .withDeviceId(DeviceId.deviceId(STATIC_STRING_1))
-                .withSrcIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
-                .withDstIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
-                .withSrcPort(TpPort.tpPort(PORT_1))
-                .withDstPort(TpPort.tpPort(PORT_1))
-                .withProtocol((byte) STATIC_INTEGER_1)
-                .withVlanId(VlanId.vlanId(STATIC_STRING_1))
-                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_1))
-                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_1))
-                .withStatsInfo(statsInfo)
-                .build();
-
-        info2 = builder3
-                .withFlowType((byte) STATIC_INTEGER_2)
-                .withInputInterfaceId(STATIC_INTEGER_2)
-                .withOutputInterfaceId(STATIC_INTEGER_2)
-                .withDeviceId(DeviceId.deviceId(STATIC_STRING_2))
-                .withSrcIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
-                .withDstIp(IpPrefix.valueOf(
-                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
-                .withSrcPort(TpPort.tpPort(PORT_2))
-                .withDstPort(TpPort.tpPort(PORT_2))
-                .withProtocol((byte) STATIC_INTEGER_2)
-                .withVlanId(VlanId.vlanId(STATIC_STRING_2))
-                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_2))
-                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_2))
-                .withStatsInfo(statsInfo)
-                .build();
-    }
-
-    /**
-     * Tests class immutability.
-     */
-    @Test
-    public void testImmutability() {
-        assertThatClassIsImmutable(DefaultFlowInfo.class);
-    }
-
-    /**
-     * Tests object equality.
-     */
-    @Test
-    public void testEquality() {
-        new EqualsTester()
-                .addEqualityGroup(info1, sameAsInfo1)
-                .addEqualityGroup(info2).testEquals();
-    }
-
-    /**
-     * Tests object construction.
-     */
-    @Test
-    public void testConstruction() {
-        FlowInfo info = info1;
-
-        assertThat(info.flowType(), is((byte) STATIC_INTEGER_1));
-        assertThat(info.inputInterfaceId(), is(STATIC_INTEGER_1));
-        assertThat(info.outputInterfaceId(), is(STATIC_INTEGER_1));
-        assertThat(info.deviceId(), is(DeviceId.deviceId(STATIC_STRING_1)));
-        assertThat(info.srcIp(), is(IpPrefix.valueOf(
-                IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1)));
-        assertThat(info.dstIp(), is(IpPrefix.valueOf(
-                IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1)));
-        assertThat(info.srcPort(), is(TpPort.tpPort(PORT_1)));
-        assertThat(info.dstPort(), is(TpPort.tpPort(PORT_1)));
-        assertThat(info.protocol(), is((byte) STATIC_INTEGER_1));
-        assertThat(info.vlanId(), is(VlanId.vlanId(STATIC_STRING_1)));
-        assertThat(info.srcMac(), is(MacAddress.valueOf(MAC_ADDRESS_1)));
-        assertThat(info.dstMac(), is(MacAddress.valueOf(MAC_ADDRESS_1)));
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
index 866e34d..da69380 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
@@ -25,6 +25,8 @@
 import org.onlab.packet.TpPort;
 import org.onlab.packet.VlanId;
 import org.onosproject.net.DeviceId;
+import org.onosproject.openstacktelemetry.api.DefaultFlowInfo;
+import org.onosproject.openstacktelemetry.api.DefaultStatsInfo;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.InfluxRecord;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
deleted file mode 100644
index 54140dc..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.TpPort;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-
-import static org.junit.Assert.assertEquals;
-import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * Unit tests for DefaultStatsFlowRule class.
- */
-public final class DefaultStatsFlowRuleTest {
-
-    private static final IpAddress IP_ADDRESS_1 = IpAddress.valueOf("10.10.10.1");
-    private static final IpAddress IP_ADDRESS_2 = IpAddress.valueOf("20.20.20.1");
-
-    private static final int IP_PREFIX_LENGTH_1 = 10;
-    private static final int IP_PREFIX_LENGTH_2 = 20;
-
-    private static final int PORT_1 = 1000;
-    private static final int PORT_2 = 2000;
-
-    private static final byte PROTOCOL_1 = 1;
-    private static final byte PROTOCOL_2 = 2;
-
-    private StatsFlowRule rule1;
-    private StatsFlowRule sameAsRule1;
-    private StatsFlowRule rule2;
-
-    /**
-     * Initial setup for this unit test.
-     */
-    @Before
-    public void setUp() {
-
-        rule1 = DefaultStatsFlowRule.builder()
-                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
-                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
-                .srcTpPort(TpPort.tpPort(PORT_1))
-                .dstTpPort(TpPort.tpPort(PORT_2))
-                .ipProtocol(PROTOCOL_1)
-                .build();
-
-        sameAsRule1 = DefaultStatsFlowRule.builder()
-                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
-                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
-                .srcTpPort(TpPort.tpPort(PORT_1))
-                .dstTpPort(TpPort.tpPort(PORT_2))
-                .ipProtocol(PROTOCOL_1)
-                .build();
-
-        rule2 = DefaultStatsFlowRule.builder()
-                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
-                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
-                .srcTpPort(TpPort.tpPort(PORT_2))
-                .dstTpPort(TpPort.tpPort(PORT_1))
-                .ipProtocol(PROTOCOL_2)
-                .build();
-    }
-
-    /**
-     * Tests class immutability.
-     */
-    @Test
-    public void testImmutability() {
-        assertThatClassIsImmutable(DefaultStatsFlowRule.class);
-    }
-
-    /**
-     * Tests object equality.
-     */
-    @Test
-    public void testEquality() {
-        new EqualsTester()
-                .addEqualityGroup(rule1, sameAsRule1)
-                .addEqualityGroup(rule2).testEquals();
-    }
-
-    /**
-     * Tests object construction.
-     */
-    @Test
-    public void testConstruction() {
-        StatsFlowRule rule = rule1;
-
-        assertEquals(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1), rule.srcIpPrefix());
-        assertEquals(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2), rule.dstIpPrefix());
-        assertEquals(TpPort.tpPort(PORT_1), rule.srcTpPort());
-        assertEquals(TpPort.tpPort(PORT_2), rule.dstTpPort());
-        assertEquals(PROTOCOL_1, rule.ipProtocol());
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
deleted file mode 100644
index bfe3745..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * Unit tests for DefaultStatsInfo class.
- */
-public final class DefaultStatsInfoTest {
-
-    private static final int STATIC_INTEGER_1 = 1;
-    private static final int STATIC_INTEGER_2 = 2;
-
-    private StatsInfo info1;
-    private StatsInfo sameAsInfo1;
-    private StatsInfo info2;
-
-    /**
-     * Initial setup for this unit test.
-     */
-    @Before
-    public void setup() {
-        StatsInfo.Builder builder1 = new DefaultStatsInfo.DefaultBuilder();
-        StatsInfo.Builder builder2 = new DefaultStatsInfo.DefaultBuilder();
-        StatsInfo.Builder builder3 = new DefaultStatsInfo.DefaultBuilder();
-
-        info1 = builder1
-                .withStartupTime(STATIC_INTEGER_1)
-                .withCurrAccPkts(STATIC_INTEGER_1)
-                .withCurrAccBytes(STATIC_INTEGER_1)
-                .withPrevAccPkts(STATIC_INTEGER_1)
-                .withPrevAccBytes(STATIC_INTEGER_1)
-                .withFstPktArrTime(STATIC_INTEGER_1)
-                .withLstPktOffset(STATIC_INTEGER_1)
-                .withErrorPkts((short) STATIC_INTEGER_1)
-                .withDropPkts((short) STATIC_INTEGER_1)
-                .build();
-
-        sameAsInfo1 = builder2
-                .withStartupTime(STATIC_INTEGER_1)
-                .withCurrAccPkts(STATIC_INTEGER_1)
-                .withCurrAccBytes(STATIC_INTEGER_1)
-                .withPrevAccPkts(STATIC_INTEGER_1)
-                .withPrevAccBytes(STATIC_INTEGER_1)
-                .withFstPktArrTime(STATIC_INTEGER_1)
-                .withLstPktOffset(STATIC_INTEGER_1)
-                .withErrorPkts((short) STATIC_INTEGER_1)
-                .withDropPkts((short) STATIC_INTEGER_1)
-                .build();
-
-        info2 = builder3
-                .withStartupTime(STATIC_INTEGER_2)
-                .withCurrAccPkts(STATIC_INTEGER_2)
-                .withCurrAccBytes(STATIC_INTEGER_2)
-                .withPrevAccPkts(STATIC_INTEGER_2)
-                .withPrevAccBytes(STATIC_INTEGER_2)
-                .withFstPktArrTime(STATIC_INTEGER_2)
-                .withLstPktOffset(STATIC_INTEGER_2)
-                .withErrorPkts((short) STATIC_INTEGER_2)
-                .withDropPkts((short) STATIC_INTEGER_2)
-                .build();
-    }
-
-    /**
-     * Tests class immutability.
-     */
-    @Test
-    public void testImmutability() {
-        assertThatClassIsImmutable(DefaultStatsInfo.class);
-    }
-
-    /**
-     * Tests object equality.
-     */
-    @Test
-    public void testEquality() {
-        new EqualsTester()
-                .addEqualityGroup(info1, sameAsInfo1)
-                .addEqualityGroup(info2).testEquals();
-    }
-
-    /**
-     * Tests object construction.
-     */
-    @Test
-    public void testConstruction() {
-        StatsInfo info = info1;
-
-        assertThat(info.startupTime(), is((long) STATIC_INTEGER_1));
-        assertThat(info.currAccPkts(), is(STATIC_INTEGER_1));
-        assertThat(info.currAccBytes(), is((long) STATIC_INTEGER_1));
-        assertThat(info.prevAccPkts(), is(STATIC_INTEGER_1));
-        assertThat(info.prevAccBytes(), is((long) STATIC_INTEGER_1));
-        assertThat(info.fstPktArrTime(), is((long) STATIC_INTEGER_1));
-        assertThat(info.lstPktOffset(), is(STATIC_INTEGER_1));
-        assertThat(info.errorPkts(), is((short) STATIC_INTEGER_1));
-        assertThat(info.dropPkts(), is((short) STATIC_INTEGER_1));
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigTest.java
deleted file mode 100644
index 637f9fc..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.impl;
-
-import com.google.common.collect.Maps;
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
-
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * Unit tests for DefaultTelemetryConfig class.
- */
-public final class DefaultTelemetryConfigTest {
-
-    private static final String NAME_1 = "grpc";
-    private static final String NAME_2 = "kafka";
-
-    private static final ConfigType TYPE_1 = ConfigType.GRPC;
-    private static final ConfigType TYPE_2 = ConfigType.KAFKA;
-
-    private static final String MANUFACTURER_1 = "grpc.io";
-    private static final String MANUFACTURER_2 = "kafka.apache.org";
-
-    private static final String SW_VERSION_1 = "1.0";
-    private static final String SW_VERSION_2 = "1.0";
-
-    private static final Map<String, String> PROP_1 = Maps.newConcurrentMap();
-    private static final Map<String, String> PROP_2 = Maps.newConcurrentMap();
-
-    private static final String PROP_1_KEY_1 = "key11";
-    private static final String PROP_1_KEY_2 = "key12";
-    private static final String PROP_1_VALUE_1 = "value11";
-    private static final String PROP_1_VALUE_2 = "value12";
-    private static final String PROP_2_KEY_1 = "key21";
-    private static final String PROP_2_KEY_2 = "key22";
-    private static final String PROP_2_VALUE_1 = "value21";
-    private static final String PROP_2_VALUE_2 = "value22";
-
-    private static final boolean ENABLED_1 = true;
-    private static final boolean ENABLED_2 = false;
-
-    private TelemetryConfig config1;
-    private TelemetryConfig sameAsConfig1;
-    private TelemetryConfig config2;
-
-    /**
-     * Initial setup for this unit test.
-     */
-    @Before
-    public void setup() {
-        PROP_1.put(PROP_1_KEY_1, PROP_1_VALUE_1);
-        PROP_1.put(PROP_1_KEY_2, PROP_1_VALUE_2);
-        PROP_2.put(PROP_2_KEY_1, PROP_2_VALUE_1);
-        PROP_2.put(PROP_2_KEY_2, PROP_2_VALUE_2);
-
-        config1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null,
-                MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1);
-        sameAsConfig1 = new DefaultTelemetryConfig(NAME_1, TYPE_1, null,
-                MANUFACTURER_1, SW_VERSION_1, ENABLED_1, PROP_1);
-        config2 = new DefaultTelemetryConfig(NAME_2, TYPE_2, null,
-                MANUFACTURER_2, SW_VERSION_2, ENABLED_2, PROP_2);
-    }
-
-    /**
-     * Tests class immutability.
-     */
-    @Test
-    public void testImmutability() {
-        assertThatClassIsImmutable(DefaultTelemetryConfig.class);
-    }
-
-    /**
-     * Tests object equality.
-     */
-    @Test
-    public void testEquality() {
-        new EqualsTester()
-                .addEqualityGroup(config1, sameAsConfig1)
-                .addEqualityGroup(config2).testEquals();
-    }
-
-    /**
-     * Tests object construction.
-     */
-    @Test
-    public void testConstruction() {
-        TelemetryConfig config = config1;
-
-        assertEquals(config.name(), NAME_1);
-        assertEquals(config.type(), TYPE_1);
-        assertEquals(config.manufacturer(), MANUFACTURER_1);
-        assertEquals(config.swVersion(), SW_VERSION_1);
-        assertEquals(config.properties(), PROP_1);
-        assertEquals(config.enabled(), ENABLED_1);
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java
index 511fa6d..85f6b41 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStoreTest.java
@@ -22,6 +22,7 @@
 import org.onosproject.TestApplicationId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreServiceAdapter;
+import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
 import org.onosproject.store.service.TestStorageService;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegisterTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegisterTest.java
deleted file mode 100644
index 683e9c1..0000000
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegisterTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2018-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.openstacktelemetry.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.openstacktelemetry.api.FlowInfo;
-import org.onosproject.openstacktelemetry.api.StatsFlowRule;
-import org.onosproject.openstacktelemetry.api.StatsInfo;
-import org.onosproject.openstacktelemetry.codec.FlowInfoJsonCodec;
-import org.onosproject.openstacktelemetry.codec.StatsFlowRuleJsonCodec;
-import org.onosproject.openstacktelemetry.codec.StatsInfoJsonCodec;
-
-import java.util.Map;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-/**
- * Unit test for openstack telemetry codec register.
- */
-public final class OpenstackTelemetryCodecRegisterTest {
-
-    private OpenstackTelemetryCodecRegister register;
-
-    /**
-     * Tests codec register activation and deactivation.
-     */
-    @Test
-    public void testActivateDeactivate() {
-        register = new OpenstackTelemetryCodecRegister();
-        CodecService codecService = new TestCodecService();
-
-        TestUtils.setField(register, "codecService", codecService);
-        register.activate();
-
-        assertEquals(StatsInfoJsonCodec.class.getName(),
-                codecService.getCodec(StatsInfo.class).getClass().getName());
-        assertEquals(FlowInfoJsonCodec.class.getName(),
-                codecService.getCodec(FlowInfo.class).getClass().getName());
-        assertEquals(StatsFlowRuleJsonCodec.class.getName(),
-                codecService.getCodec(StatsFlowRule.class).getClass().getName());
-
-        register.deactivate();
-
-        assertNull(codecService.getCodec(StatsInfo.class));
-        assertNull(codecService.getCodec(FlowInfo.class));
-        assertNull(codecService.getCodec(StatsFlowRule.class));
-    }
-
-    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());
-        }
-    }
-}
