diff --git a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiMessageHandler.java b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiMessageHandler.java
index 32964af..3b869b6 100644
--- a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiMessageHandler.java
+++ b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiMessageHandler.java
@@ -47,7 +47,6 @@
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.onosproject.openstacknode.api.OpenstackSshAuth;
-import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
 import org.onosproject.ui.JsonUtils;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
@@ -85,8 +84,6 @@
     private static final String OPENSTACK_NETWORKING_UI_UPDATE = "openstackNetworkingUiUpdate";
     private static final String OPENSTACK_NETWORKING_UI_STOP = "openstackNetworkingUiStop";
     private static final String ANNOTATION_NETWORK_ID = "networkId";
-    private static final String FLOW_STATS_ADD_REQUEST = "flowStatsAddRequest";
-    private static final String FLOW_STATS_REMOVE_REQUEST = "flowStatsRemoveRequest";
     private static final String FLOW_TRACE_REQUEST = "flowTraceRequest";
     private static final String SRC_IP = "srcIp";
     private static final String DST_IP = "dstIp";
@@ -98,9 +95,6 @@
     private static final String TRACE_RESULT = "traceResult";
     private static final String IS_SUCCESS = "isSuccess";
     private static final String TRACE_SUCCESS = "traceSuccess";
-    private static final String STATS_SUCCESS = "statsSuccess";
-    private static final String FLOW_STATS_ADD_RESULT = "flowStatsAddResult";
-    private static final String FLOW_STATS_REMOVE_RESULT = "flowStatsRemoveResult";
     private static final String FLOW_TRACE_RESULT = "flowTraceResult";
     private static final String SRC_DEVICE_ID = "srcDeviceId";
     private static final String DST_DEVICE_ID = "dstDeviceId";
@@ -133,7 +127,6 @@
     private OpenstackNodeService osNodeService;
     private InstancePortService instancePortService;
     private OpenstackNetworkService osNetService;
-    private StatsFlowRuleAdminService statsFlowRuleService;
     private Mode currentMode = Mode.IDLE;
     private Element elementOfNote;
 
@@ -149,7 +142,6 @@
         osNodeService = directory.get(OpenstackNodeService.class);
         instancePortService = directory.get(InstancePortService.class);
         osNetService = directory.get(OpenstackNetworkService.class);
-        statsFlowRuleService = directory.get(StatsFlowRuleAdminService.class);
     }
 
     @Override
@@ -158,8 +150,6 @@
                 new DisplayStartHandler(),
                 new DisplayUpdateHandler(),
                 new DisplayStopHandler(),
-                new FlowStatsAddRequestHandler(),
-                new FlowStatsRemoveRequestHandler(),
                 new FlowTraceRequestHandler()
         );
     }
@@ -192,36 +182,6 @@
         }
     }
 
-    private final class FlowStatsAddRequestHandler extends RequestHandler {
-        public FlowStatsAddRequestHandler() {
-            super(FLOW_STATS_ADD_REQUEST);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            String srcIp = string(payload, SRC_IP);
-            String dstIp = string(payload, DST_IP);
-            log.info("Flow statistics add request called with src IP: {}, dst IP: {}",
-                    srcIp, dstIp);
-            eventExecutor.execute(() -> processFlowStatsRequest(srcIp, dstIp, true));
-        }
-    }
-
-    private final class FlowStatsRemoveRequestHandler extends RequestHandler {
-        public FlowStatsRemoveRequestHandler() {
-            super(FLOW_STATS_REMOVE_REQUEST);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            String srcIp = string(payload, SRC_IP);
-            String dstIp = string(payload, DST_IP);
-            log.info("Flow statistics removal request called with src IP: {}, dst IP: {}",
-                    srcIp, dstIp);
-            eventExecutor.execute(() -> processFlowStatsRequest(srcIp, dstIp, false));
-        }
-    }
-
     private final class FlowTraceRequestHandler extends RequestHandler {
         public FlowTraceRequestHandler() {
             super(FLOW_TRACE_REQUEST);
@@ -439,16 +399,6 @@
         return NodeBadge.number(Status.INFO, n, "Openstack Node");
     }
 
-    private void processFlowStatsRequest(String srcIp, String dstIp, Boolean install) {
-        boolean statsSuccess = true;
-        ObjectMapper mapper = new ObjectMapper();
-        ObjectNode statsResult = mapper.createObjectNode();
-
-        statsFlowRuleService.setStatFlowL2Rule(srcIp, dstIp, install);
-        statsResult.put(STATS_SUCCESS, statsSuccess);
-        sendMessagetoUi(FLOW_STATS_ADD_RESULT, statsResult);
-    }
-
     private void processFlowTraceRequest(String srcIp, String dstIp, String srcDeviceId, String dstDeviceId,
                                          boolean uplink) {
         boolean traceSuccess = true;
diff --git a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiOverlay.java b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiOverlay.java
index 2788f1c..ec71db7 100644
--- a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiOverlay.java
+++ b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiOverlay.java
@@ -47,7 +47,6 @@
     private static final ButtonId RESET_BUTTON = new ButtonId("reset");
     private static final ButtonId TO_GATEWAY_BUTTON = new ButtonId("toGateway");
     private static final ButtonId TO_EXTERNAL_BUTTON = new ButtonId("toExternal");
-    private static final ButtonId VFLOW_STATS_BUTTON = new ButtonId("FlowStats");
 
     private final HostService hostService = DefaultServiceDirectory.getService(HostService.class);
 
@@ -79,7 +78,6 @@
                 .addButton(FLOW_TRACE_BUTTON)
                 .addButton(RESET_BUTTON)
                 .addButton(TO_GATEWAY_BUTTON)
-                .addButton(VFLOW_STATS_BUTTON)
                 .addButton(TO_EXTERNAL_BUTTON);
     }
 }
diff --git a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
index b2d7999..314fe47 100644
--- a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
+++ b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovOverlay.js
@@ -24,8 +24,6 @@
     var traceDst = null;
     var srcDeviceId = null;
     var dstDeviceId = null;
-    var flowStatsSrcIp = null;
-    var flowStatsDstIp = null;
 
     var traceInfoDialogId = 'traceInfoDialogId',
         traceInfoDialogOpt =   {
@@ -120,22 +118,6 @@
                     }
                }
             },
-            FlowStats: {
-                gid: 'meterTable',
-                tt: 'Flow Statistics',
-                cb: function (data) {
-                    if (flowStatsSrcIp == null && data.navPath == 'host') {
-                        flowStatsSrcIp = data.propValues.ip;
-                        flash.flash('Source ' + flowStatsSrcIp + ' is selected. Choose a destination IP address');
-                        $log.info('Source VM is selected for Flow Statistics: ', data);
-                    } else if (flowStatsDstIp == null && data.title != flowStatsSrcIp && data.navPath == 'host') {
-                        flowStatsDstIp = data.propValues.ip;
-                        flash.flash('Destination ' + flowStatsDstIp + ' is selected. Press [Request] button !');
-                        openFlowStatsInfoDialog();
-                        $log.info('Destination VM is selected for Flow Statistics: ', data);
-                    }
-                }
-            }
         },
 
         keyBindings: {
@@ -179,60 +161,6 @@
         }
     };
 
-    function openFlowStatsInfoDialog() {
-        ds.openDialog(traceInfoDialogId, traceInfoDialogOpt)
-            .setTitle('VM to VM Flow Statistics Rule Configuration')
-            .addContent(createFlowStatsInfoDiv(flowStatsSrcIp, flowStatsDstIp))
-            .addCancel(dStatsBoxClose, 'Close')
-            .addOk(flowStatsRemoveReqBtn, 'Remove Stats Rule')
-            .addOk(flowStatsAddReqBtn, 'Add Stats Rule')
-            .bindKeys();
-    }
-
-    function createFlowStatsInfoDiv(srcIp, dstIp) {
-        var texts = ds.createDiv('FlowStatsInfo');
-        texts.append('hr');
-        texts.append('table').append('tbody').append('tr');
-
-        var tBodySelection = texts.select('table').select('tbody').select('tr');
-
-        tBodySelection.append('td').text('Source IP: ').attr("class", "label");
-        tBodySelection.append('td').text(srcIp).attr("class", "value");
-
-        texts.select('table').select('tbody').append('tr');
-
-        tBodySelection = texts.select('table').select('tbody').select('tr:nth-child(2)');
-
-        tBodySelection.append('td').text('Destination IP: ').attr("class", "label");
-        tBodySelection.append('td').text(dstIp).attr("class", "value");
-
-        texts.append('hr');
-
-        return texts;
-    }
-
-    function dStatsBoxClose() {
-        $log.info('Dialog Close button clicked (or Esc pressed)');
-        flowStatsSrcIp = null;
-        flowStatsDstIp = null;
-    }
-
-    function flowStatsAddReqBtn() {
-        sts.sendFlowStatsAddRequest(flowStatsSrcIp, flowStatsDstIp);
-        ds.closeDialog();
-        flowStatsSrcIp = null;
-        flowStatsDstIp = null;
-        flash.flash('Send Flow Statistics Addition Request');
-    }
-
-    function flowStatsRemoveReqBtn() {
-        sts.sendFlowStatsRemoveRequest(flowStatsSrcIp, flowStatsDstIp);
-        ds.closeDialog();
-        flowStatsSrcIp = null;
-        flowStatsDstIp = null;
-        flash.flash('Send Flow Statistics Removal Request');
-    }
-
     function openTraceInfoDialog() {
         ds.openDialog(traceInfoDialogId, traceInfoDialogOpt)
             .setTitle('Flow Trace Information')
diff --git a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovService.js b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovService.js
index 21b495b..61c80fe 100644
--- a/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovService.js
+++ b/apps/openstacknetworkingui/src/main/resources/app/view/sonaTopov/sonaTopovService.js
@@ -38,8 +38,6 @@
     var displayStart = 'openstackNetworkingUiStart',
         displayUpdate = 'openstackNetworkingUiUpdate',
         displayStop = 'openstackNetworkingUiStop',
-        flowStatsAddRequest = 'flowStatsAddRequest',
-        flowStatsRemoveRequest = 'flowStatsRemoveRequest',
         flowTraceRequest = 'flowTraceRequest';
 
     // internal state
@@ -64,24 +62,6 @@
         wss.sendEvent(displayStop);
     }
 
-    function sendFlowStatsAddRequest(src, dst) {
-        wss.sendEvent(flowStatsAddRequest, {
-            srcIp: src,
-            dstIp: dst,
-        });
-        $log.info('FlowStatsAdd request message is sent.');
-        flash.flash('sendFlowStatsAddRequest called');
-    }
-
-     function sendFlowStatsRemoveRequest(src, dst) {
-        wss.sendEvent(flowStatsRemoveRequest, {
-            srcIp: src,
-            dstIp: dst,
-        });
-        $log.info('FlowStatsRemove request message is sent.');
-        flash.flash('sendFlowStatsRemoveRequest called');
-    }
-
     function sendFlowTraceRequest(src, dst, srcDeviceId, dstDeviceId, uplink) {
         wss.sendEvent(flowTraceRequest, {
             srcIp: src,
@@ -127,52 +107,6 @@
         ds.closeDialog();
     }
 
-    function openFlowStatsAddResultDialog(data) {
-        $log.info('Addition Result message: ', data);
-        var flowStatsAddResultDialogId = 'flowStatsAddResultDialogId',
-            flowStatsAddResultDialogOpt = {
-                width: 650,
-                edge: 'left',
-                margin: 20,
-                hideMargin: -20
-            }
-        var statsSuccess = data.statsSuccess == true ? "SUCCESS" : "FALSE";
-        ds.openDialog(flowStatsAddResultDialogId, flowStatsAddResultDialogOpt)
-                    .setTitle('Flow Stats Addition Result: ' + statsSuccess)
-                    .addContent(createStatsAddResultInfoDiv(data))
-                    .addOk(dOk, 'Close')
-                    .bindKeys();
-    }
-
-    function createStatsAddResultInfoDiv(data) {
-        var texts = ds.createDiv('flowStatsAddResult');
-        texts.append('p').text('Result of addition: ' + data.statsSuccess);
-        return texts;
-    }
-
-    function openFlowStatsRemoveResultDialog(data) {
-        $log.info('Removal Result message: ', data);
-        var flowStatsRemoveResultDialogId = 'flowStatsRemoveResultDialogId',
-            flowStatsRemoveResultDialogOpt = {
-                width: 650,
-                edge: 'left',
-                margin: 20,
-                hideMargin: -20
-            }
-        var statsSuccess = data.statsSuccess == true ? "SUCCESS" : "FALSE";
-        ds.openDialog(flowStatsRemoveResultDialogId, flowStatsRemoveResultDialogOpt)
-                    .setTitle('Flow Stats Removal Result: ' + statsSuccess)
-                    .addContent(createStatsRemoveResultInfoDiv(data))
-                    .addOk(dOk, 'Close')
-                    .bindKeys();
-    }
-
-    function createStatsRemoveResultInfoDiv(data) {
-        var texts = ds.createDiv('flowStatsRemoveResult');
-        texts.append('p').text('Result of removal: ' + data.statsSuccess);
-        return texts;
-    }
-
     function openFlowTraceResultDialog(data) {
         var flowTraceResultDialogId = 'flowTraceResultDialogId',
             flowTraceResultDialogOpt = {
@@ -262,21 +196,6 @@
 
     }
 
-    function flowStatsAddResult(data) {
-        flash.flash('flowStatsAddResult called');
-        $log.debug(data);
-
-        openFlowStatsAddResultDialog(data)
-    }
-
-    function flowStatsRemoveResult(data) {
-        flash.flash('flowStatsRemoveResult called');
-        $log.debug(data);
-
-        openFlowStatsRemoveResultDialog(data)
-    }
-
-
     function flowTraceResult(data) {
         flash.flash('flowTraceResult called');
         $log.debug(data);
@@ -302,10 +221,6 @@
                 startDisplay: startDisplay,
                 updateDisplay: updateDisplay,
                 stopDisplay: stopDisplay,
-                flowStatsAddResult: flowStatsAddResult,
-                flowStatsRemoveResult: flowStatsRemoveResult,
-                sendFlowStatsAddRequest: sendFlowStatsAddRequest,
-                sendFlowStatsRemoveRequest: sendFlowStatsRemoveRequest,
                 flowTraceResult: flowTraceResult,
                 sendFlowTraceRequest: sendFlowTraceRequest,
             };
diff --git a/apps/openstacktelemetry/BUILD b/apps/openstacktelemetry/BUILD
index 39aaf9ac..8cbb47d 100644
--- a/apps/openstacktelemetry/BUILD
+++ b/apps/openstacktelemetry/BUILD
@@ -3,6 +3,7 @@
 BUNDLES = [
     "@kafka_clients//jar",
     "@influxdb_java//jar",
+    "@commons_codec//jar",
     "@retrofit//jar",
     "@okhttp//jar",
     "@logging_interceptor//jar",
@@ -14,14 +15,6 @@
     "@simpleclient_common//jar",
     "@simpleclient_hotspot//jar",
     "@simpleclient_servlet//jar",
-    "@jetty_servlet//jar",
-    "@jetty_http//jar",
-    "@jetty_server//jar",
-    "@jetty_util//jar",
-    "@jetty_security//jar",
-    "@jetty_io//jar",
-    "@jetty_websocket//jar",
-    "@servlet_api//jar",
     # gRPC dependencies (with patched core)
     ":grpc-core-repkg",
     "@runtime_grpc_stub//jar",
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
index 44894db..bf0e013 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
@@ -25,8 +25,6 @@
 
     public static final String OPENSTACK_TELEMETRY_APP_ID = "org.onosproject.openstacktelemetry";
 
-    private static final String DEFAULT_SERVER_IP = "localhost";
-
     // default configuration variables for InfluxDB
     public static final String DEFAULT_INFLUXDB_MEASUREMENT = "sonaflow";
 
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/StatsFlowRuleAdminService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/StatsFlowRuleAdminService.java
index c2fb893..e8a4a38 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/StatsFlowRuleAdminService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/StatsFlowRuleAdminService.java
@@ -35,15 +35,6 @@
     void stop();
 
     /**
-     * Creates or delete a stat flow rule with network layer-2 information.
-     *
-     * @param srcIp source IP address
-     * @param dstIp destination IP address
-     * @param install installing flag
-     */
-    void setStatFlowL2Rule(String srcIp, String dstIp, Boolean install);
-
-    /**
      * Creates a stat flow rule.
      *
      * @param statFlowRule stat flow rule for a VM
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
index 536bd53..8a74929 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/config/PrometheusTelemetryConfig.java
@@ -62,8 +62,6 @@
          */
         Builder withPort(int port);
 
-        // TODO   add authentication.
-
         /**
          * Sets other prometheus configuration map.
          *
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
index 4244c7f..be51b15 100644
--- 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
@@ -21,24 +21,22 @@
 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 org.slf4j.Logger;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
+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 final Logger log = getLogger(getClass());
-
     private static final String FLOW_TYPE = "flowType";
     private static final String DEVICE_ID = "deviceId";
     private static final String INPUT_INTERFACE_ID = "inputInterfaceId";
@@ -76,7 +74,6 @@
                 .put(SRC_MAC, info.srcMac().toString())
                 .put(DST_MAC, info.dstMac().toString());
 
-
         if (info.vlanId() != null) {
             result.put(VLAN_ID, info.vlanId().toString());
         } else {
@@ -111,6 +108,21 @@
         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);
@@ -128,6 +140,8 @@
                 .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
index 8fc8143..2e84b79 100644
--- 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
@@ -17,7 +17,6 @@
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.onlab.packet.IPv4;
 import org.onlab.packet.TpPort;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
@@ -28,6 +27,7 @@
 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;
 
 public class StatsFlowRuleJsonCodec extends JsonCodec<StatsFlowRule> {
@@ -59,41 +59,26 @@
         try {
             String srcIpPrefix = json.get(SRC_IP_PREFIX).asText();
             String dstIpPrefix = json.get(DST_IP_PREFIX).asText();
-            String tmpIpProtocol = new String("");
-            int srcTpPort  = 0;
-            int dstTpPort  = 0;
 
             DefaultStatsFlowRule.Builder flowRuleBuilder;
 
-            byte ipProtocol = 0;
             if (json.get(IP_PROTOCOL) == null) {
                 log.info("ipProtocol: null");
                 flowRuleBuilder = DefaultStatsFlowRule.builder()
                         .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
                         .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix));
             } else {
-                tmpIpProtocol = json.get(IP_PROTOCOL).asText().toUpperCase();
-                srcTpPort     = json.get(SRC_TP_PORT).asInt();
-                dstTpPort     = json.get(DST_TP_PORT).asInt();
-                if (tmpIpProtocol.equals("TCP")) {
-                    ipProtocol = IPv4.PROTOCOL_TCP;
-                } else if (tmpIpProtocol.equals("UDP")) {
-                    ipProtocol = IPv4.PROTOCOL_UDP;
-                } else {
-                    ipProtocol = 0;
-                }
+                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));
+                                    .srcIpPrefix(IpPrefix.valueOf(srcIpPrefix))
+                                    .dstIpPrefix(IpPrefix.valueOf(dstIpPrefix))
+                                    .ipProtocol(ipProtocol)
+                                    .srcTpPort(TpPort.tpPort(srcTpPort))
+                                    .dstTpPort(TpPort.tpPort(dstTpPort));
             }
-
-            log.debug("StatsFlowRule after building from JSON:\n{}",
-                     flowRuleBuilder.build().toString());
-
             return flowRuleBuilder.build();
         } catch (Exception ex) {
             log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
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
index 53cf924..905b2ff 100644
--- 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
@@ -20,18 +20,14 @@
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
 import org.onosproject.openstacktelemetry.impl.DefaultStatsInfo;
-import org.slf4j.Logger;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Openstack telemetry codec used for serializing and de-serializing JSON string.
  */
 public final class StatsInfoJsonCodec extends JsonCodec<StatsInfo> {
 
-    private final Logger log = getLogger(getClass());
-
     private static final String STARTUP_TIME = "startupTime";
     private static final String FST_PKT_ARR_TIME = "fstPktArrTime";
     private static final String LST_PKT_OFFSET = "lstPktOffset";
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/TinaFlowInfoByteBufferCodec.java
index 73258ac..2ee625f 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/TinaFlowInfoByteBufferCodec.java
@@ -34,6 +34,7 @@
  */
 public class TinaFlowInfoByteBufferCodec extends ByteBufferCodec<FlowInfo> {
 
+    private static final int NUM_RADIX = 16;
     private static final int MESSAGE_SIZE = 88;
     private static final String OF_PREFIX = "of:";
 
@@ -46,7 +47,7 @@
 
         String  deviceId = flowInfo.deviceId().toString();
         short switchId = (short) Integer.parseInt(deviceId.substring(3,
-                                                  deviceId.length()), 16);
+                                      deviceId.length()), NUM_RADIX);
 
         if (flowInfo.srcPort() != null) {
             srcPort = flowInfo.srcPort().toInt();
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java
new file mode 100644
index 0000000..f1575bc
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java
@@ -0,0 +1,38 @@
+/*
+ * 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.gui;
+
+import org.onosproject.ui.UiTopoOverlay;
+
+public class OpenstackTelemetryUiTopovOverlay extends UiTopoOverlay {
+    private static final String OVERLAY_ID = "ostelemetry-overlay";
+
+    public OpenstackTelemetryUiTopovOverlay() {
+        super(OVERLAY_ID);
+    }
+
+    @Override
+    public void activate() {
+        super.activate();
+        log.info("OpenstackTelemetry Overlay View Activated");
+    }
+
+    @Override
+    public void deactivate() {
+        super.deactivate();
+        log.info("OpenstackTelemetry Overlay View Deactivated");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
index 3f09f6a..da987c9 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
@@ -19,6 +19,7 @@
 import org.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
+import org.onosproject.ui.UiTopoOverlayFactory;
 import org.onosproject.ui.UiView;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -56,11 +57,18 @@
             new UiView(NETWORK, OPENSTACKTELEMETRY_ID, OPENSTACKTELEMETRY_TEXT)
     );
 
+    // Factory for UI topology overlays
+    private final UiTopoOverlayFactory topoOverlayFactory =
+            () -> ImmutableList.of(
+                    new OpenstackTelemetryUiTopovOverlay()
+            );
+
     // Application UI extension
     private final UiExtension uiExtension =
             new UiExtension.Builder(CL, views)
                     .messageHandlerFactory(messageHandlerFactory)
                     .resourcePath(RESOURCE_PATH)
+                    .topoOverlayFactory(topoOverlayFactory)
                     .build();
 
     @Activate
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 8d1df10..dcb7082 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
@@ -21,9 +21,18 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostService;
 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.ui.RequestHandler;
+import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.chart.ChartModel;
 import org.onosproject.ui.chart.ChartRequestHandler;
@@ -33,8 +42,13 @@
 import java.text.SimpleDateFormat;
 import java.util.Collection;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Queue;
+import java.util.Set;
+
+import static org.onosproject.net.HostId.hostId;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolTypeFromString;
 
 /**
  * Message handler for Openstack Telemetry view related messages.
@@ -42,12 +56,40 @@
 public class OpensteckTelemetryViewMessageHandler extends UiMessageHandler {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    // Chart View
     private static final String OST_DATA_REQ = "openstacktelemetryDataRequest";
     private static final String OST_DATA_RESP = "openstacktelemetryDataResponse";
+
+    // Network Topology
+    private static final String OST_IS_ACTIVATED_REQ = "openstackFlowStatsIsActivatedRequest";
+    private static final String OST_IS_ACTIVATED_RESP = "openstackFlowStatsIsActivatedResponse";
+    private static final String OST_FLOW_STATS_CREATE_REQ = "openstackFlowStatsCreateRequest";
+    private static final String OST_FLOW_STATS_CREATE_RESP = "openstackFlowStatsCreateResponse";
+
     private static final String OSTS = "openstacktelemetrys";
     private static final String ANNOT_FLOW_IDS = "flowIds";
     private static final String ANNOT_PERIOD_OPTIONS = "periodOptions";
 
+    private static final String SOURCE = "src";
+    private static final String DESTINATION = "dst";
+    private static final String SOURCE_IP = "srcIp";
+    private static final String DESTINATION_IP = "dstIp";
+    private static final String SOURCE_TRANSPORT_PORT = "srcPort";
+    private static final String DESTINATION_TRANSPORT_PORT = "dstPort";
+    private static final String SOURCE_HOST_NAME = "srcName";
+    private static final String DESTINATION_HOST_NAME = "dstName";
+    private static final String IP_PROTOCOL = "ipProto";
+    private static final String IP_PROTOCOL_LIST = "ipProtoList";
+
+    private static final String RESULT = "result";
+    private static final String RESULT_OK = "OK";
+    private static final String VALUE = "value";
+    private static final String SUCCESS = "Success";
+    private static final String FAILED = "Failed";
+    private static final String FAILED_TO_CREATE_FLOW_STATS = "Failed to create a flow rule for statistics";
+
+    private static final String[] IP_PROTOCOL_ARRAY = {"TCP", "UDP", "ANY"};
+
     private static final String STAT_CURR_ACC_PACKET = "curr_acc_packet";
     private static final String STAT_PREV_ACC_PACKET = "prev_acc_packet";
     private static final String STAT_CURR_ACC_BYTE = "curr_acc_byte";
@@ -76,20 +118,33 @@
                             .put("24 HOUR", 17280)
                             .build();
 
+    private HostService hostService;
+    private StatsFlowRuleAdminService statsFlowRuleService;
+
+    @Override
+    public void init(UiConnection connection, ServiceDirectory directory) {
+        super.init(connection, directory);
+
+        hostService = directory.get(HostService.class);
+        statsFlowRuleService = directory.get(StatsFlowRuleAdminService.class);
+    }
+
     @Override
     protected Collection<RequestHandler> createRequestHandlers() {
         return ImmutableSet.of(
-                new ControlMessageRequest()
+                new ChartControlMessageRequest(),
+                new FlowStatsIsActivatedRequestHandler(),
+                new FlowStatsCreateRequestHandler()
         );
     }
 
-    private final class ControlMessageRequest extends ChartRequestHandler {
-        private StatsFlowRuleAdminService statsFlowRuleService = null;
+    /* Handler for Line-Chart View */
+    private final class ChartControlMessageRequest extends ChartRequestHandler {
         private Map<String, Queue<FlowInfo>> flowInfoMap = null;
         private String currentFlowKey = null;
         private String currentPeriod = DEFAULT_PERIOD_OPTION_1MIN;
 
-        private ControlMessageRequest() {
+        private ChartControlMessageRequest() {
             super(OST_DATA_REQ, OST_DATA_RESP, OSTS);
         }
 
@@ -204,4 +259,92 @@
             return flowInfos[flowInfos.length - 1];
         }
     }
+
+    /* Handler for Network Topology View */
+    private final class FlowStatsIsActivatedRequestHandler extends RequestHandler {
+
+        private FlowStatsIsActivatedRequestHandler() {
+            super(OST_IS_ACTIVATED_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            String srcId = string(payload, SOURCE, null);
+            String dstId = string(payload, DESTINATION, null);
+
+            log.debug("Input from GUI: {}", payload.toString());
+            if (srcId != null && dstId != null) {
+                Host srcHost = hostService.getHost(hostId(srcId));
+                Host dstHost = hostService.getHost(hostId(dstId));
+
+                if (srcHost != null && dstHost != null) {
+                    ArrayNode ipProtos = arrayNode();
+                    String srcHostName = ipForHost(srcHost);
+                    String dstHostName = ipForHost(dstHost);
+
+                    for (String proto : IP_PROTOCOL_ARRAY) {
+                        ipProtos.add(proto);
+                    }
+
+                    payload.put(SOURCE_HOST_NAME, srcHostName);
+                    payload.put(DESTINATION_HOST_NAME, dstHostName);
+                    payload.put(IP_PROTOCOL_LIST, ipProtos);
+
+                    log.debug("Output to GUI: {}", payload.toString());
+
+                    sendMessage(OST_IS_ACTIVATED_RESP, payload);
+                }
+            }
+        }
+
+        // Returns the first of the given host's set of IP addresses as a string.
+        private String ipForHost(Host host) {
+            Set<IpAddress> ipAddresses = host.ipAddresses();
+            Iterator<IpAddress> it = ipAddresses.iterator();
+            return it.hasNext() ? it.next().toString() + "/32" : "unknown";
+        }
+    }
+
+    private final class FlowStatsCreateRequestHandler extends RequestHandler {
+        private String srcIp;
+        private String dstIp;
+        private String ipProto;
+        private String srcTpPort;
+        private String dstTpPort;
+        private ObjectNode result = objectNode();
+
+        private FlowStatsCreateRequestHandler() {
+            super(OST_FLOW_STATS_CREATE_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            srcIp = string(payload, SOURCE_IP, null);
+            dstIp = string(payload, DESTINATION_IP, null);
+            ipProto = string(payload, IP_PROTOCOL, null);
+            srcTpPort = string(payload, SOURCE_TRANSPORT_PORT, null);
+            dstTpPort = string(payload, DESTINATION_TRANSPORT_PORT, null);
+
+            log.debug("[GUI input] srcIp:{} dstIp:{} ipPro:{} srcTpPort:{} dstTpPort:{}",
+                     srcIp, dstIp, ipProto, srcTpPort, dstTpPort);
+
+            try {
+                StatsFlowRule statsFlowRule = DefaultStatsFlowRule.builder()
+                        .srcIpPrefix(IpPrefix.valueOf(srcIp))
+                        .dstIpPrefix(IpPrefix.valueOf(dstIp))
+                        .srcTpPort(TpPort.tpPort(Integer.valueOf(srcTpPort)))
+                        .dstTpPort(TpPort.tpPort(Integer.valueOf(dstTpPort)))
+                        .ipProtocol(getProtocolTypeFromString(ipProto))
+                        .build();
+                statsFlowRuleService.createStatFlowRule(statsFlowRule);
+                result.put(RESULT, SUCCESS);
+                result.put(VALUE, RESULT_OK);
+            } catch (Exception ex) {
+                log.warn(FAILED_TO_CREATE_FLOW_STATS + " : " + ex.toString());
+                result.put(RESULT, FAILED);
+                result.put(VALUE, FAILED_TO_CREATE_FLOW_STATS);
+            }
+            sendMessage(OST_FLOW_STATS_CREATE_RESP, result);
+        }
+    }
 }
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
index 8560170..b0d3aad 100644
--- 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
@@ -27,6 +27,7 @@
 
 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.
@@ -200,7 +201,8 @@
                 ((srcPort == null) ? "any" : srcPort.toString()) +
                 " -> " +
                 dstIp.toString() + ":" +
-                ((dstPort == null) ? "any" : dstPort.toString());
+                ((dstPort == null) ? "any" : dstPort.toString()) +
+                " (" + getProtocolNameFromType(protocol) + ")";
     }
 
     @Override
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
index 7be6973..325bce2 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
@@ -141,11 +141,11 @@
 
     // Prometheus Telemetry config manager
     static final String PROP_PROMETHEUS_ENABLE_SERVICE = "enableService";
-    static final boolean PROMETHEUS_ENABLE_SERVICE_DEFAULT = false;
+    static final boolean PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT = true;
 
     static final String PROP_PROMETHEUS_EXPORTER_ADDRESS = "address";
-    public static final String PROMETHEUS_EXPORTER_ADDRESS_DEFAULT = "localhost";
+    public static final String PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT = "localhost";
 
     static final String PROP_PROMETHEUS_EXPORTER_PORT = "port";
-    public static final int PROMETHEUS_EXPORTER_PORT_DEFAULT = 50051;
+    public static final int PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT = 9555;
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
index 4405b97..dcc7023 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
@@ -33,9 +33,9 @@
 
 import java.util.Dictionary;
 
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
 import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_ENABLE_SERVICE;
 import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS;
 import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT;
@@ -49,9 +49,9 @@
     immediate = true,
     service = PrometheusTelemetryConfigService.class,
     property = {
-        PROP_PROMETHEUS_ENABLE_SERVICE + ":Boolean=" + PROMETHEUS_ENABLE_SERVICE_DEFAULT,
-        PROP_PROMETHEUS_EXPORTER_ADDRESS + "=" + PROMETHEUS_EXPORTER_ADDRESS_DEFAULT,
-        PROP_PROMETHEUS_EXPORTER_PORT + ":Integer=" + PROMETHEUS_EXPORTER_PORT_DEFAULT
+        PROP_PROMETHEUS_ENABLE_SERVICE + ":Boolean=" + PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT,
+        PROP_PROMETHEUS_EXPORTER_ADDRESS + "=" + PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT,
+        PROP_PROMETHEUS_EXPORTER_PORT + ":Integer=" + PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT
     }
 )
 public class PrometheusTelemetryConfigManager implements PrometheusTelemetryConfigService {
@@ -65,13 +65,13 @@
     protected PrometheusTelemetryAdminService prometheusTelemetryAdminService;
 
     /** Default IP address of prometheus exporter. */
-    protected String address = PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+    protected String address = PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
 
     /** Default port number of prometheus exporter. */
-    protected Integer port = PROMETHEUS_EXPORTER_PORT_DEFAULT;
+    protected Integer port = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
 
     /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = PROMETHEUS_ENABLE_SERVICE_DEFAULT;
+    protected Boolean enableService = PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -115,12 +115,12 @@
         Dictionary<?, ?> properties = context.getProperties();
 
         String addressStr = Tools.get(properties, PROP_PROMETHEUS_EXPORTER_ADDRESS);
-        address = addressStr != null ? addressStr : PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+        address = addressStr != null ? addressStr : PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
         log.info("Configured. Prometheus exporter address is {}", address);
 
         Integer portConfigured = Tools.getIntegerProperty(properties, PROP_PROMETHEUS_EXPORTER_PORT);
         if (portConfigured == null) {
-            port = PROMETHEUS_EXPORTER_PORT_DEFAULT;
+            port = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
             log.info("Prometheus exporter port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
@@ -129,7 +129,7 @@
 
         Boolean enableServiceConfigured = getBooleanProperty(properties, PROP_PROMETHEUS_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = PROMETHEUS_ENABLE_SERVICE_DEFAULT;
+            enableService = PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
             log.info("Prometheus service enable flag is NOT " +
                              "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
index f029fa4..69423ca 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
@@ -15,10 +15,11 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import io.prometheus.client.Gauge;
+import org.onlab.packet.TpPort;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.PrometheusTelemetryService;
 import org.onosproject.openstacktelemetry.api.config.PrometheusTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
@@ -34,76 +35,101 @@
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
+
+import java.util.Arrays;
 import java.util.Set;
 
 /**
  * Prometheus telemetry manager.
  */
-@Component(immediate = true, service = PrometheusTelemetryService.class)
+@Component(immediate = true, service = PrometheusTelemetryAdminService.class)
 public class PrometheusTelemetryManager implements PrometheusTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private Server prometheusExporter;
 
-    private static final String BYTE_VM2VM = "byte_vm2vm";
-    private static final String BYTE_DEVICE = "byte_device";
-    private static final String BYTE_SRC_IP = "byte_src_ip";
-    private static final String BYTE_DST_IP = "byte_dst_ip";
+    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 DST_IP = "dstIp";
+    private static final String SRC_PORT = "srcPort";
+    private static final String DST_PORT = "dstPort";
+    private static final String PROTOCOL = "protocol";
 
-    private static final String PKT_VM2VM = "pkt_vm2vm";
-    private static final String PKT_DEVICE = "pkt_device";
-    private static final String PKT_SRC_IP = "pkt_src_ip";
-    private static final String PKT_DST_IP = "pkt_dst_ip";
+    private static final String[] LABEL_TAGS = {
+            FLOW_TYPE, DEVICE_ID, INPUT_INTERFACE_ID, OUTPUT_INTERFACE_ID,
+            VLAN_ID, VXLAN_ID, SRC_IP, DST_IP, SRC_PORT, DST_PORT, PROTOCOL
+    };
 
-    private static final String PKT_ERROR = "pkt_error";
-    private static final String PKT_DROP = "pkt_drop";
+    private static final String STAT_NAME_VM2VM_BYTE = "vm2vm_byte";
+    private static final String STAT_NAME_VM2VM_BYTE_PREV = "vm2vm_byte_prev";
+    private static final String STAT_NAME_VM2VM_BYTE_CURR = "vm2vm_byte_curr";
+    private static final String STAT_NAME_VM2VM_PKT = "vm2vm_pkt";
+    private static final String STAT_NAME_VM2VM_PKT_PREV = "vm2vm_pkt_prev";
+    private static final String STAT_NAME_VM2VM_PKT_CURR = "vm2vm_pkt_curr";
+    private static final String STAT_NAME_ERROR_PKT = "error_pkt";
+    private static final String STAT_NAME_DROP_PKT = "drop_pkt";
 
-    private static final String LABEL_IP_5_TUPLE = "IP_5_TUPLE";
-    private static final String LABEL_DEV_ID = "DEVICE_ID";
-    private static final String LABEL_SRC_IP = "SOURCE_IP";
-    private static final String LABEL_DST_IP = "DESTINATION_IP";
+    private static final String HELP_MSG_VM2VM_BYTE =
+                                    "SONA flow bytes statistics for VM to VM";
+    private static final String HELP_MSG_VM2VM_BYTE_PREV =
+                                    HELP_MSG_VM2VM_BYTE + " [Accumulated previous byte]";
+    private static final String HELP_MSG_VM2VM_BYTE_CURR =
+                                    HELP_MSG_VM2VM_BYTE + " [Accumulated current byte]";
+    private static final String HELP_MSG_VM2VM_PKT =
+                                    "SONA flow packets statistics for VM to VM";
+    private static final String HELP_MSG_VM2VM_PKT_PREV =
+                                    HELP_MSG_VM2VM_PKT + " [Accumulated previous pkt]";
+    private static final String HELP_MSG_VM2VM_PKT_CURR =
+                                    HELP_MSG_VM2VM_PKT + " [Accumulated current pkt]";
+    private static final String HELP_MSG_ERROR = "SONA error statistics";
+    private static final String HELP_MSG_DROP = "SONA drop statistics";
 
-    private static final String HELP_MSG = "SONA Flow statistics";
-
-    private static Counter byteVM2VM = Counter.build().name(BYTE_VM2VM)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_IP_5_TUPLE).register();
-
-    private static Counter byteDevice = Counter.build().name(BYTE_DEVICE)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_DEV_ID).register();
-
-    private static Counter byteSrcIp = Counter.build().name(BYTE_SRC_IP)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_SRC_IP).register();
-
-    private static Counter byteDstIp = Counter.build().name(BYTE_DST_IP)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_DST_IP).register();
-
-    private static Counter pktVM2VM = Counter.build().name(PKT_VM2VM)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_IP_5_TUPLE).register();
-
-    private static Counter pktDevice = Counter.build().name(PKT_DEVICE)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_DEV_ID).register();
-
-    private static Counter pktSrcIp = Counter.build().name(PKT_SRC_IP)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_SRC_IP).register();
-
-    private static Counter pktDstIp = Counter.build().name(PKT_DST_IP)
-                                    .help(HELP_MSG)
-                                    .labelNames(LABEL_DST_IP).register();
-
-    private static Counter pktError = Counter.build().name(PKT_ERROR)
-                                    .help(HELP_MSG)
-                                    .register();
-    private static Counter pktDrop = Counter.build().name(PKT_DROP)
-                                    .help(HELP_MSG)
-                                    .register();
+    private static Gauge byteVM2VM = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_BYTE)
+                                            .help(HELP_MSG_VM2VM_BYTE)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Gauge byteVM2VMPrev = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_BYTE_PREV)
+                                            .help(HELP_MSG_VM2VM_BYTE_PREV)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Gauge byteVM2VMCurr = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_BYTE_CURR)
+                                            .help(HELP_MSG_VM2VM_BYTE_CURR)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Gauge pktVM2VM = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_PKT)
+                                            .help(HELP_MSG_VM2VM_PKT)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Gauge pktVM2VMPrev = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_PKT_PREV)
+                                            .help(HELP_MSG_VM2VM_PKT_PREV)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Gauge pktVM2VMCurr = Gauge.build()
+                                            .name(STAT_NAME_VM2VM_PKT_CURR)
+                                            .help(HELP_MSG_VM2VM_PKT_CURR)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Counter pktError = Counter.build()
+                                            .name(STAT_NAME_ERROR_PKT)
+                                            .help(HELP_MSG_ERROR)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
+    private static Counter pktDrop = Counter.build()
+                                            .name(STAT_NAME_DROP_PKT)
+                                            .help(HELP_MSG_DROP)
+                                            .labelNames(LABEL_TAGS)
+                                            .register();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
@@ -128,15 +154,12 @@
         PrometheusTelemetryConfig prometheusConfig = (PrometheusTelemetryConfig) config;
 
         try {
-            // TODO  Offer a 'Authentication'
             prometheusExporter = new Server(prometheusConfig.port());
             ServletContextHandler context = new ServletContextHandler();
             context.setContextPath("/");
             prometheusExporter.setHandler(context);
             context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
-
-            log.info("Prometeus server start");
-
+            log.info("Prometeus server start (Server port:{})", prometheusConfig.port());
             prometheusExporter.start();
         } catch (Exception ex) {
             log.warn("Exception: {}", ex.toString());
@@ -161,35 +184,69 @@
 
     @Override
     public void publish(Set<FlowInfo> flowInfos) {
-        if (flowInfos.size() == 0) {
-            log.debug("No record to publish");
+        if (flowInfos.isEmpty()) {
+            log.debug("No FlowInfo record to publish");
             return;
         }
 
         long flowByte;
         int flowPkt;
+        String[] labelValues;
+
         for (FlowInfo flowInfo: flowInfos) {
             flowByte = flowInfo.statsInfo().currAccBytes() - flowInfo.statsInfo().prevAccBytes();
             flowPkt = flowInfo.statsInfo().currAccPkts() - flowInfo.statsInfo().prevAccPkts();
-
-            byteVM2VM.labels(flowInfo.uniqueFlowInfoKey()).inc(flowByte);
-            byteDevice.labels(flowInfo.deviceId().toString()).inc(flowByte);
-            byteSrcIp.labels(flowInfo.srcIp().toString()).inc(flowByte);
-            byteDstIp.labels(flowInfo.dstIp().toString()).inc(flowByte);
-
-            pktVM2VM.labels(flowInfo.uniqueFlowInfoKey()).inc(flowPkt);
-            pktDevice.labels(flowInfo.deviceId().toString()).inc(flowPkt);
-            pktSrcIp.labels(flowInfo.srcIp().toString()).inc(flowPkt);
-            pktDstIp.labels(flowInfo.dstIp().toString()).inc(flowPkt);
-
-            pktError.inc(flowInfo.statsInfo().errorPkts());
-            pktDrop.inc(flowInfo.statsInfo().dropPkts());
+            labelValues = getLabelValues(flowInfo);
+            byteVM2VM.labels(labelValues).set(flowByte);
+            byteVM2VMPrev.labels(labelValues).set(flowInfo.statsInfo().prevAccBytes());
+            byteVM2VMCurr.labels(labelValues).set(flowInfo.statsInfo().currAccBytes());
+            pktVM2VM.labels(labelValues).set(flowPkt);
+            pktVM2VMPrev.labels(labelValues).set(flowInfo.statsInfo().prevAccPkts());
+            pktVM2VMCurr.labels(labelValues).set(flowInfo.statsInfo().currAccPkts());
+            pktError.labels(labelValues).inc(flowInfo.statsInfo().errorPkts());
+            pktDrop.labels(labelValues).inc(flowInfo.statsInfo().dropPkts());
         }
     }
 
+    private String[] getLabelValues(FlowInfo flowInfo) {
+        String[] labelValues = new String[LABEL_TAGS.length];
+
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(FLOW_TYPE)]
+                    = String.valueOf(flowInfo.flowType());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DEVICE_ID)]
+                    = flowInfo.deviceId().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(INPUT_INTERFACE_ID)]
+                    = String.valueOf(flowInfo.inputInterfaceId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(OUTPUT_INTERFACE_ID)]
+                    = String.valueOf(flowInfo.outputInterfaceId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(VXLAN_ID)]
+                    = String.valueOf(flowInfo.vxlanId());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_IP)]
+                    = flowInfo.srcIp().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_IP)]
+                    = flowInfo.dstIp().toString();
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(SRC_PORT)]
+                    = getTpPort(flowInfo.srcPort());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(DST_PORT)]
+                    = getTpPort(flowInfo.dstPort());
+        labelValues[Arrays.asList(LABEL_TAGS).indexOf(PROTOCOL)]
+                    = String.valueOf(flowInfo.protocol());
+        if (flowInfo.vlanId() != null) {
+            labelValues[Arrays.asList(LABEL_TAGS).indexOf(VLAN_ID)]
+                    = flowInfo.vlanId().toString();
+        }
+        return labelValues;
+    }
+
+    private String getTpPort(TpPort tpPort) {
+        if (tpPort == null) {
+            return "";
+        }
+        return tpPort.toString();
+    }
+
     @Override
     public boolean isRunning() {
-        log.info("Prometheus Exporter State: {}", prometheusExporter.isRunning());
         return prometheusExporter.isRunning();
     }
 }
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 4ddaf40..3d9f577 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
@@ -138,7 +138,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final byte FLOW_TYPE_SONA = 1; // VLAN
+    private static final byte FLOW_TYPE_SONA = 1;
 
     private static final long MILLISECONDS = 1000L;
     private static final long INITIAL_DELAY = 5L;
@@ -148,7 +148,6 @@
     private static final String OVS_DRIVER_NAME = "ovs";
 
     private static final String ARBITRARY_IP = "0.0.0.0/32";
-    private static final int ARBITRARY_PROTOCOL = 0x0;
     private static final int ARBITRARY_LENGTH = 32;
     private static final String ARBITRARY_MAC = "00:00:00:00:00:00";
     private static final IpAddress NO_HOST_IP = IpAddress.valueOf("255.255.255.255");
@@ -263,16 +262,6 @@
     }
 
     @Override
-    public void setStatFlowL2Rule(String srcIp, String dstIp, Boolean install) {
-        StatsFlowRule statsFlowRule = DefaultStatsFlowRule.builder()
-                .srcIpPrefix(IpPrefix.valueOf(IpAddress.valueOf(srcIp), ARBITRARY_LENGTH))
-                .dstIpPrefix(IpPrefix.valueOf(IpAddress.valueOf(dstIp), ARBITRARY_LENGTH))
-                .ipProtocol((byte) ARBITRARY_PROTOCOL)
-                .build();
-        setStatFlowRule(statsFlowRule, install);
-    }
-
-    @Override
     public void createStatFlowRule(StatsFlowRule statsFlowRule) {
         setStatFlowRule(statsFlowRule, true);
     }
@@ -438,8 +427,10 @@
 
             stats.forEach(s -> {
                 InstancePort instPort = getInstancePort(d, s.portNumber());
-                flowInfos.add(buildTxFlowInfoFromInstancePort(instPort, s));
-                flowInfos.add(buildRxFlowInfoFromInstancePort(instPort, s));
+                if (instPort != null) {
+                    flowInfos.add(buildTxFlowInfoFromInstancePort(instPort, s));
+                    flowInfos.add(buildRxFlowInfoFromInstancePort(instPort, s));
+                }
             });
         });
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
index a957369..860da11 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacktelemetry.util;
 
 import com.google.common.base.Strings;
+import org.onlab.packet.IPv4;
 import org.onosproject.cfg.ConfigProperty;
 import org.onosproject.openstacktelemetry.api.TelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
@@ -31,6 +32,11 @@
  */
 public final class OpenstackTelemetryUtil {
 
+    private static final String PROTOCOL_NAME_TCP = "tcp";
+    private static final String PROTOCOL_NAME_UDP = "udp";
+    private static final String PROTOCOL_NAME_ANY = "any";
+    private static final int ARBITRARY_PROTOCOL = 0x0;
+
     /**
      * Prevents object instantiation from external.
      */
@@ -72,6 +78,42 @@
     }
 
     /**
+     * Obtains transport protocol type from the given string.
+     *
+     * @param str transport protocol name
+     * @return transport protocol type
+     */
+    public static byte getProtocolTypeFromString(String str) {
+        switch (str.toLowerCase()) {
+            case PROTOCOL_NAME_TCP:
+                return IPv4.PROTOCOL_TCP;
+            case PROTOCOL_NAME_UDP:
+                return IPv4.PROTOCOL_UDP;
+            default:
+                return ARBITRARY_PROTOCOL;
+        }
+    }
+
+    /**
+     * Obtains protocol name from the protocol type.
+     *
+     * @param type transport protocol type
+     * @return transport protocol name
+     */
+    public static String getProtocolNameFromType(byte type) {
+        switch (type) {
+            case IPv4.PROTOCOL_TCP:
+                return PROTOCOL_NAME_TCP;
+            case IPv4.PROTOCOL_UDP:
+                return PROTOCOL_NAME_UDP;
+            case ARBITRARY_PROTOCOL:
+                return PROTOCOL_NAME_ANY;
+            default:
+                return PROTOCOL_NAME_ANY;
+        }
+    }
+
+    /**
      * Initializes the telemetry service due tue configuration changes.
      *
      *
diff --git a/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.css b/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.css
index 14a2529..cf9f25d 100644
--- a/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.css
+++ b/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.css
@@ -18,6 +18,40 @@
  ONOS GUI -- OpenstackTelemetry -- CSS file
  */
 
+
+/* --- Topo Telemetry Panel --- */
+#topo-p-telemetry {
+    padding: 16px;
+    top: 190px;
+    left: 20px;
+}
+
+.topo-p td input.number-input {
+    width: 50px;
+}
+
+.topo-p div.footer tbody {
+    float: right;
+}
+
+.topo-p div.footer tbody input.button-input {
+    background-color: #5b99d2;
+    border: 0;
+    border-radius: 3px;
+    color: #fff;
+    height: 25px;
+    width: 60px;
+    padding: 1px 0 0 0;
+}
+
+#telemetry-dialog {
+    padding: 16px;
+    top: 190px;
+    left: 20px;
+}
+
+
+/* --- Chart View --- */
 #ov-openstacktelemetry {
     padding: 20px;
     position: relative;
diff --git a/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.js b/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.js
index 129eaaf..a424249 100644
--- a/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.js
+++ b/apps/openstacktelemetry/app/src/main/resources/app/view/openstacktelemetry/openstacktelemetry.js
@@ -21,8 +21,292 @@
     'use strict';
 
     // injected references
-    var $log, $scope, $location, ks, fs, cbs, ns;
+    var $log, $scope, $location, ks, fs, cbs, ns, tov, ots, wss, tts, api, gs, ps, ds;
 
+    // constants
+    var pCls = 'topo-p',
+        idTelemetry = 'topo-p-telemetry',
+        idTelemetryDiag = 'telemetry-dialog',
+        telemetryPanelOpts = {
+            edge: 'left',
+            width: 330, // telemetry panel width
+        }
+
+    // panels
+    var telemetry;
+
+    // selected info (by mouse click event)
+    var selectedItem
+
+    // constants
+    var ostIsActReq = 'openstackFlowStatsIsActivatedRequest',
+        ostIsActResp =  'openstackFlowStatsIsActivatedResponse',
+        ostCreateReq = 'openstackFlowStatsCreateRequest',
+        ostCreateResp = 'openstackFlowStatsCreateResponse';
+
+    var topoLion = function (x) {
+        return '#ttrafov#' + x + '#';
+    };
+
+    var overlay = {
+        overlayId: 'ostelemetry-overlay',
+        glyphId: 'm_details',
+        tooltip: 'Openstack Telemetry Overlay',
+
+        activate: function () {
+            $log.debug("Openstack telemetry topology overlay is ACTIVATED");
+        },
+        deactivate: function () {
+            destroyTelemetryPanel();
+            $log.debug("Openstack telemetry topology overlay is DEACTIVATED");
+        },
+
+        // detail panel button definitions
+        buttons: {
+            createHostTelemetryBtn: {
+                gid: 'm_details',
+                tt: 'Create Host-to-Host Telemetry',
+                cb: displayTelemetry
+            },
+            showRelatedTraffic: {
+                gid: 'm_relatedIntents',
+                tt: function () { return topoLion('tr_btn_show_related_traffic'); },
+                cb: function (data) { tts.showRelatedIntents(); },
+            },
+        },
+
+        hooks: {
+            multi: function (selectOrder) {
+                var selectedHost = new Object();
+                $log.debug("Selected object: ", selectOrder);
+                for (var index in selectOrder) {
+                    if (index == 0) {
+                        selectedHost.src = selectOrder[index];
+                        $log.debug("Source host: ", selectedHost.src);
+                    } else if (index == 1) {
+                        selectedHost.dst = selectOrder[index];
+                        $log.debug("Destination host: ", selectedHost.dst);
+                    }
+                }
+
+                selectedItem = selectedHost;
+
+                tov.addDetailButton('showRelatedTraffic');
+                if(selectOrder.length == 2) {
+                    tov.addDetailButton('createHostTelemetryBtn');
+                }
+            }
+        }
+    };
+
+    // Panel API
+    function createTopoPanel(id, opts) {
+        var p = ps.createPanel(id, opts),
+            pid = id,
+            header, body, footer;
+        p.classed(pCls, true);
+
+        function panel() {
+            return p;
+        }
+
+        function hAppend(x) {
+            return header.append(x);
+        }
+
+        function bAppend(x) {
+            return body.append(x);
+        }
+
+        function fAppend(x) {
+            return footer.append(x);
+        }
+
+        function setup() {
+            p.empty();
+
+            p.append('div').classed('header', true);
+            p.append('div').classed('body', true);
+            p.append('div').classed('footer', true);
+
+            header = p.el().select('.header');
+            body = p.el().select('.body');
+            footer = p.el().select('.footer');
+        }
+
+        function destroy() {
+            ps.destroyPanel(pid);
+        }
+
+        return {
+            panel: panel,
+            setup: setup,
+            destroy: destroy,
+            appendHeader: hAppend,
+            appendBody: bAppend,
+            appendFooter: fAppend,
+        };
+    }
+
+    function hideTelemetryPanel() {
+        telemetry.panel().hide();
+    }
+
+    function destroyTelemetryPanel() {
+        if(telemetry != null) {
+            telemetry.destroy();
+        }
+        telemetry = null;
+    }
+
+    function addInput(tbody, type, id, label, value) {
+        var tr = tbody.append('tr'),
+            lab;
+        if (typeof label === 'string') {
+            lab = label.replace(/_/g, ' ');
+        } else {
+            lab = label;
+        }
+
+        tr.append('td').attr('class', 'label').text(lab + ' :');
+
+        if (type == 'radio') {
+            var td = tr.append('td');
+            for(var index in value) {
+                if(index == 0) {
+                    td.append('input').classed( type + '-input', true)
+                                          .attr('type', type)
+                                          .attr('value', value[index])
+                                          .attr('name', label)
+                                          .attr('id', id)
+                                          .attr('checked', 'true');
+                } else {
+                    td.append('input').classed( type + '-input', true)
+                                          .attr('type', type)
+                                          .attr('name', label)
+                                          .attr('id', id)
+                                          .attr('value', value[index]);
+                }
+                td.append('span').text(value[index]);
+            }
+        } else {
+            tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
+                .attr('id', id).attr('value', value);
+        }
+    }
+
+    function addButton(tr, callback, value) {
+        tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
+                        .attr('value', value).on('click', callback);
+    }
+
+    function makeButton(callback, text, keyName) {
+        var cb = fs.isF(callback),
+            key = fs.isS(keyName);
+
+        function invoke() {
+            cb && cb();
+        }
+
+        return createDiv('telemetry-button')
+            .text(text)
+            .on('click', invoke);
+    }
+
+    function createDiv(cls) {
+        var div = d3.select(document.createElement('div'));
+        if (cls) {
+            div.classed(cls, true);
+        }
+        return div;
+    }
+
+    function displayTelemetry() {
+        $log.debug("sendEvent openstackFlowStatsIsActivatedRequest: ", selectedItem);
+        wss.sendEvent(ostIsActReq, selectedItem);
+    }
+
+    function respIsActCb(selected) {
+        $log.debug("openstackFlowStatsIsActivatedResponse: ", selected);
+        if(telemetry == null) {
+            telemetry = createTopoPanel(idTelemetry, telemetryPanelOpts);
+        }
+        telemetry.setup();
+
+        var svg = telemetry.appendHeader('div')
+                     .classed('icon', true)
+                     .append('svg'),
+            title = telemetry.appendHeader('h2'),
+            table = telemetry.appendBody('table'),
+            tbody = table.append('tbody'),
+            glyphId = 'm_details';
+
+        gs.addGlyph(svg, glyphId, 30, 0, [1, 1]);
+
+        title.text('Create Openstack Telemetry');
+
+        addInput(tbody, 'text', 'srcIp', 'Source IP', selected.srcName);
+        addInput(tbody, 'text', 'dstIp', 'Destination IP', selected.dstName);
+        addInput(tbody, 'radio', 'ipProto', 'Protocol', selected.ipProtoList);
+        addInput(tbody, 'number', 'srcPort', 'Source Port', "");
+        addInput(tbody, 'number', 'dstPort', 'Destination Port', "");
+
+        telemetry.appendFooter('hr');
+        var footTr = telemetry.appendFooter('table').append('tbody').append('tr');
+
+        addButton(footTr, createTelemetry, 'Create');
+        addButton(footTr, hideTelemetryPanel, 'Cancel');
+
+        telemetry.panel().show();
+    }
+
+    function createTelemetry() {
+        var telemetryInfo = {};
+
+        telemetryInfo.srcIp = document.getElementById('srcIp').value;
+        telemetryInfo.dstIp = document.getElementById('dstIp').value;
+        telemetryInfo.ipProto = document.querySelector('input[name="Protocol"]:checked').value;
+        telemetryInfo.srcPort = document.getElementById('srcPort').value;
+        telemetryInfo.dstPort = document.getElementById('dstPort').value;
+
+        if(telemetryInfo.srcPort == ""){
+            telemetryInfo.srcPort = 0;
+        }
+        if(telemetryInfo.dstPort == ""){
+            telemetryInfo.dstPort = 0;
+        }
+
+        $log.debug("Creation request: ", telemetryInfo);
+        wss.sendEvent(ostCreateReq, telemetryInfo);
+        hideTelemetryPanel();
+    }
+
+    function respCreateCb(result) {
+        $log.debug("Creation response: ", result);
+
+        function dOK() {
+            if(result.result == "Failed"){
+                displayTelemetry(selectedItem);
+            } else {
+                destroyTelemetryPanel();
+            }
+        }
+
+        function createContent(value) {
+            var content = ds.createDiv();
+            content.append('p').text(value);
+            return content;
+        }
+
+        ds.openDialog(idTelemetryDiag, telemetryPanelOpts)
+            .setTitle("Create Telemetry " + result.result)
+            .addContent(createContent(result.value))
+            .addOk(dOK);
+    }
+
+    /*
+     Variable for Chart View
+     */
     var hasFlow;
 
     var gFlowId;
@@ -50,6 +334,9 @@
         return Math.max.apply(null, merged);
     }
 
+    /*
+     Chart View : Controller
+     */
     angular.module('ovOpenstacktelemetry', ["chart.js"])
         .controller('OvOpenstacktelemetryCtrl',
         ['$log', '$scope', '$location', 'FnService', 'ChartBuilderService', 'NavService',
@@ -151,6 +438,40 @@
             $scope.showLoader = true;
 
             $log.log('OvOpenstacktelemetryCtrl has been created');
-        }]);
+        }])
+        // Network Topology View : Factory
+        .factory('OpenstacktelemetryService',
+        ['$log', 'FnService', 'WebSocketService', 'GlyphService', 'PanelService', 'DialogService',
 
+        function (_$log_, _fs_, _wss_, _gs_, _ps_, _ds_) {
+            $log = _$log_;
+            fs = _fs_;
+            wss = _wss_;
+            gs = _gs_;
+            ps = _ps_;
+            ds = _ds_;
+
+            var handlers = {},
+                telemetryOverlay = 'ostelemetry-overlay',
+                defaultOverlay = 'traffic';
+
+            handlers[ostIsActResp] = respIsActCb;
+            handlers[ostCreateResp] = respCreateCb;
+
+            wss.bindHandlers(handlers);
+
+            return {
+                displayTelemetry: displayTelemetry
+            };
+        }])
+        .run(['$log', 'TopoOverlayService', 'OpenstacktelemetryService', 'TopoTrafficService',
+
+            function (_$log_, _tov_, _ots_, _tts_) {
+                $log = _$log_;
+                tov = _tov_;
+                ots = _ots_;
+                tts = _tts_;
+                tov.register(overlay);
+            }]
+        );
 }());
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
index ca97f8d..ee84e59 100644
--- 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
@@ -17,6 +17,7 @@
 
 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;
@@ -59,6 +60,7 @@
     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";
@@ -130,6 +132,9 @@
 
         ObjectNode nodeJson = flowInfoCodec.encode(flowInfo, context);
         assertThat(nodeJson, matchesFlowInfo(flowInfo));
+
+        FlowInfo flowInfoDecoded = flowInfoCodec.decode(nodeJson, context);
+        new EqualsTester().addEqualityGroup(flowInfo, flowInfoDecoded).testEquals();
     }
 
     /**
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
index d795aee..7574054 100644
--- 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
@@ -86,11 +86,17 @@
         }
 
         // check vlan id
-        String jsonVlanId = jsonNode.get(VLAN_ID).asText();
-        String vlanId = flowInfo.vlanId().toString();
-        if (!jsonVlanId.equals(vlanId)) {
-            description.appendText("VLAN id was " + jsonVlanId);
-            return false;
+        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
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 6a0c0b5..7012ee8 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
@@ -26,19 +26,19 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
 
 /**
  * Unit tests for DefaultPrometheusTelemetryConfig class.
  */
 public class DefaultPrometheusTelemetryConfigTest {
 
-    private static final String IP_ADDRESS_1 = PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+    private static final String IP_ADDRESS_1 = PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
     private static final String IP_ADDRESS_2 = "10.10.1.2";
 
-    private static final int PORT_1 = PROMETHEUS_EXPORTER_PORT_DEFAULT;
-    private static final int PORT_2 = PROMETHEUS_EXPORTER_PORT_DEFAULT + 1;
+    private static final int PORT_1 = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
+    private static final int PORT_2 = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT + 1;
 
     private static final Map<String, Object> CONFIG_MAP_1 =
             ImmutableMap.of("key1", "value1");
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
index 3a4aaed..47ef6d9 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
@@ -29,6 +29,9 @@
 
     private static final TelemetryService GRPC_SERVICE = new GrpcTelemetryManager();
     private static final TelemetryService INFLUXDB_SERVICE = new InfluxDbTelemetryManager();
+    private static final TelemetryService KAFKA_SERVICE = new KafkaTelemetryManager();
+    private static final TelemetryService PROMETHEUS_SERVICE = new PrometheusTelemetryManager();
+    private static final TelemetryService REST_SERVICE = new PrometheusTelemetryManager();
 
     private OpenstackTelemetryManager manager;
 
@@ -51,11 +54,11 @@
 
         TelemetryService kafkaService = new KafkaTelemetryManager();
 
-        assertEquals(2, manager.telemetryServices().size());
+        assertEquals(5, manager.telemetryServices().size());
 
         manager.addTelemetryService(kafkaService);
 
-        assertEquals(3, manager.telemetryServices().size());
+        assertEquals(6, manager.telemetryServices().size());
     }
 
     /**
@@ -65,11 +68,11 @@
     public void testRemoveTelemetryService() {
         addDefaultServices();
 
-        assertEquals(2, manager.telemetryServices().size());
+        assertEquals(5, manager.telemetryServices().size());
 
         manager.removeTelemetryService(GRPC_SERVICE);
 
-        assertEquals(1, manager.telemetryServices().size());
+        assertEquals(4, manager.telemetryServices().size());
     }
 
     /**
@@ -83,5 +86,8 @@
     private void addDefaultServices() {
         manager.addTelemetryService(GRPC_SERVICE);
         manager.addTelemetryService(INFLUXDB_SERVICE);
+        manager.addTelemetryService(KAFKA_SERVICE);
+        manager.addTelemetryService(PROMETHEUS_SERVICE);
+        manager.addTelemetryService(REST_SERVICE);
     }
 }
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtilTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtilTest.java
new file mode 100644
index 0000000..d6d147f
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtilTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.util;
+
+import org.junit.Test;
+import org.onlab.packet.IPv4;
+
+import static org.junit.Assert.assertEquals;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolNameFromType;
+import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolTypeFromString;
+
+public class OpenstackTelemetryUtilTest {
+
+    private static final String PROTOCOL_TCP_L = "TCP";
+    private static final String PROTOCOL_TCP_S = "tcp";
+    private static final String PROTOCOL_UDP_L = "UDP";
+    private static final String PROTOCOL_UDP_S = "udp";
+    private static final String PROTOCOL_ANY_L = "ANY";
+    private static final String PROTOCOL_ANY_S = "any";
+
+    /**
+     * Tests getting a protocol type from a protocol name.
+     */
+    @Test
+    public void testGetProtocolTypeFromString() {
+        assertEquals(IPv4.PROTOCOL_TCP, getProtocolTypeFromString(PROTOCOL_TCP_L));
+        assertEquals(IPv4.PROTOCOL_TCP, getProtocolTypeFromString(PROTOCOL_TCP_S));
+
+        assertEquals(IPv4.PROTOCOL_UDP, getProtocolTypeFromString(PROTOCOL_UDP_L));
+        assertEquals(IPv4.PROTOCOL_UDP, getProtocolTypeFromString(PROTOCOL_UDP_S));
+
+        assertEquals(0, getProtocolTypeFromString(PROTOCOL_ANY_L));
+        assertEquals(0, getProtocolTypeFromString(PROTOCOL_ANY_S));
+    }
+
+    /**
+     * Tests getting a protocol name from a protocol type.
+     */
+    @Test
+    public void testGetProtocolNameFromType() {
+        assertEquals(PROTOCOL_TCP_S, getProtocolNameFromType(IPv4.PROTOCOL_TCP));
+        assertEquals(PROTOCOL_UDP_S, getProtocolNameFromType(IPv4.PROTOCOL_UDP));
+        assertEquals(PROTOCOL_ANY_S, getProtocolNameFromType((byte) 0));
+    }
+}
