diff --git a/apps/packet-stats/app/BUCK b/apps/packet-stats/app/BUCK
new file mode 100644
index 0000000..31ef351
--- /dev/null
+++ b/apps/packet-stats/app/BUCK
@@ -0,0 +1,12 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:JACKSON',
+    '//lib:METRICS',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+]
+
+osgi_jar_with_tests (
+
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/packet-stats/app/pom.xml b/apps/packet-stats/app/pom.xml
new file mode 100644
index 0000000..cbc6574
--- /dev/null
+++ b/apps/packet-stats/app/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2017-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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>onos-apps-packet-stats</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.13.8-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.onosproject</groupId>
+    <artifactId>onos-apps-packet-stats-app</artifactId>
+    <version>1.13.8-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <description>ONOS OSGi bundle archetype</description>
+    <url>http://onosproject.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <onos.version>1.13.8-SNAPSHOT</onos.version>
+        <onos.app.name>org.onosproject.packetstats</onos.app.name>
+        <onos.app.title>onos-apps-packet-stats-app</onos.app.title>
+        <onos.app.origin>Raleigh, NC Comcast</onos.app.origin>
+        <onos.app.category>protocols</onos.app.category>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.readme>ONOS OSGi bundle archetype.</onos.app.readme>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>1.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-osgi</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-cli</artifactId>
+            <version>${onos.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-apps-route-service-app</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>5.0.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+            <version>3.0.8</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <version>3.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <version>1.9.12</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-core-serializers</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-apps-route-service-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>3.0.1</version>
+                <extensions>true</extensions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+                <version>1.21.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-scr-srcdescriptor</id>
+                        <goals>
+                            <goal>scr</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <supportedProjectTypes>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-maven-plugin</artifactId>
+                <version>1.10</version>
+                <executions>
+                    <execution>
+                        <id>cfg</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>cfg</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>swagger</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>swagger</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>app</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>app</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatistics.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatistics.java
new file mode 100644
index 0000000..abf0f0e
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatistics.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2014-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.packetstats;
+import com.codahale.metrics.Counter;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.IPv6;
+import org.onlab.packet.ICMP6;
+import org.onlab.packet.UDP;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.packet.InboundPacket;
+import org.onosproject.net.packet.PacketContext;
+import org.onosproject.net.packet.PacketProcessor;
+import org.onosproject.net.packet.PacketService;
+
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+import org.onlab.metrics.MetricsComponent;
+import org.onlab.metrics.MetricsFeature;
+import org.onlab.metrics.MetricsService;
+
+/**
+ * Application for Packet Statistics.
+ */
+@Component(immediate = true)
+public class  PacketStatistics {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected PacketService packetService;
+
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected FlowRuleService flowRuleService;
+
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService cfgService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MetricsService metricService;
+
+    private PacketCounter processor = new PacketCounter();
+    private final Logger log = getLogger(getClass());
+
+    private ApplicationId appId;
+
+
+    private MetricsComponent packetStatisticsComponent;
+    private MetricsFeature arpFeature;
+    private Counter arpCounter;
+    private MetricsFeature dhcpFeature;
+    private Counter dhcpCounter;
+    private MetricsFeature lldpFeature;
+    private Counter lldpCounter;
+    private MetricsFeature vlanFeature;
+    private Counter vlanCounter;
+    private MetricsFeature tcpFeature;
+    private Counter tcpCounter;
+    private MetricsFeature icmpFeature;
+    private Counter icmpCounter;
+    private MetricsFeature icmp6Feature;
+    private Counter icmp6Counter;
+    private MetricsFeature nbrSolicitFeature;
+    private Counter nbrSolicitCounter;
+    private MetricsFeature nbrAdvertFeature;
+    private Counter nbrAdvertCounter;
+    private MetricsFeature igmpFeature;
+    private Counter igmpCounter;
+    private MetricsFeature pimFeature;
+    private Counter pimCounter;
+    private MetricsFeature bsnFeature;
+    private Counter bsnCounter;
+    private MetricsFeature rarpFeature;
+    private Counter rarpCounter;
+    private MetricsFeature mplsFeature;
+    private Counter mplsCounter;
+    private MetricsFeature unknownFeature;
+    private Counter unknownCounter;
+
+    @Activate
+    public void activate(ComponentContext context) {
+        this.packetStatisticsComponent =
+                metricService.registerComponent("packetStatisticsComponent");
+        this.arpFeature =
+                packetStatisticsComponent.registerFeature("arpFeature");
+        this.dhcpFeature =
+                packetStatisticsComponent.registerFeature("dhcpFeature");
+        this.lldpFeature =
+                packetStatisticsComponent.registerFeature("lldpFeature");
+        this.vlanFeature =
+                packetStatisticsComponent.registerFeature("vlanFeature");
+        this.tcpFeature =
+                packetStatisticsComponent.registerFeature("tcpFeature");
+        this.icmpFeature =
+                packetStatisticsComponent.registerFeature("icmpFeature");
+        this.icmp6Feature =
+                packetStatisticsComponent.registerFeature("icmp6Feature");
+        this.nbrSolicitFeature =
+                packetStatisticsComponent.registerFeature("nbrSolicitFeature");
+        this.nbrAdvertFeature =
+                packetStatisticsComponent.registerFeature("nbrAdvertFeature");
+        this.igmpFeature =
+                packetStatisticsComponent.registerFeature("igmpFeature");
+        this.pimFeature =
+                packetStatisticsComponent.registerFeature("pimFeature");
+        this.bsnFeature =
+                packetStatisticsComponent.registerFeature("bsnFeature");
+        this.rarpFeature =
+                packetStatisticsComponent.registerFeature("rarpFeature");
+        this.mplsFeature =
+                packetStatisticsComponent.registerFeature("mplsFeature");
+        this.unknownFeature =
+                packetStatisticsComponent.registerFeature("unknownFeature");
+        this.arpCounter =
+                metricService.createCounter(packetStatisticsComponent, arpFeature, "arpPC");
+        this.dhcpCounter =
+                metricService.createCounter(packetStatisticsComponent, dhcpFeature, "dhcpPC");
+        this.lldpCounter =
+                metricService.createCounter(packetStatisticsComponent, lldpFeature, "lldpPC");
+        this.vlanCounter =
+                metricService.createCounter(packetStatisticsComponent, vlanFeature, "vlanPC");
+        this.icmpCounter =
+                metricService.createCounter(packetStatisticsComponent, icmpFeature, "icmpPC");
+        this.icmp6Counter =
+                metricService.createCounter(packetStatisticsComponent, icmp6Feature, "icmp6PC");
+        this.nbrSolicitCounter =
+                metricService.createCounter(packetStatisticsComponent, nbrSolicitFeature, "nbrSolicitPC");
+        this.nbrAdvertCounter =
+                metricService.createCounter(packetStatisticsComponent, nbrAdvertFeature, "nbrAdvertPC");
+        this.igmpCounter =
+                metricService.createCounter(packetStatisticsComponent, igmpFeature, "igmpPC");
+        this.pimCounter =
+                metricService.createCounter(packetStatisticsComponent, pimFeature, "pimPC");
+        this.bsnCounter =
+                metricService.createCounter(packetStatisticsComponent, bsnFeature, "bsnPC");
+        this.mplsCounter =
+                metricService.createCounter(packetStatisticsComponent, mplsFeature, "mplsPC");
+        this.unknownCounter =
+                metricService.createCounter(packetStatisticsComponent, unknownFeature, "unknownPC");
+
+        appId = coreService.registerApplication("org.onosproject.packet-stats");
+
+        packetService.addProcessor(processor, PacketProcessor.director(0));
+        log.info("Started", appId.id());
+    }
+
+    @Deactivate
+    public void deactivate() {
+        cfgService.unregisterProperties(getClass(), false);
+        flowRuleService.removeFlowRulesById(appId);
+        packetService.removeProcessor(processor);
+        processor = null;
+        log.info("Stopped");
+    }
+
+
+    /**
+     * Packet processor responsible for counting various types of packets.
+     */
+    private class PacketCounter implements PacketProcessor {
+        @Override
+        public void process(PacketContext context) {
+            InboundPacket pkt = context.inPacket();
+            Ethernet ethPkt = pkt.parsed();
+
+            //Indicates whether this is an ARP Packet
+            if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) {
+                arpCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_LLDP) {
+                lldpCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_VLAN) {
+                vlanCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_BSN) {
+                bsnCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_RARP) {
+                rarpCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.MPLS_UNICAST
+                    || ethPkt.getEtherType() == Ethernet.MPLS_MULTICAST) {
+                mplsCounter.inc();
+
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) {
+                IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
+                //Indicates whether this is a TCP Packet
+                if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_TCP) {
+                    tcpCounter.inc();
+
+                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_ICMP) {
+                    icmpCounter.inc();
+
+                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_IGMP) {
+                    igmpCounter.inc();
+
+                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_PIM) {
+                    pimCounter.inc();
+
+                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
+                    UDP udpPacket = (UDP) ipv4Packet.getPayload();
+                        //Indicates whether this packet is a DHCP Packet
+                        if (udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT
+                                || udpPacket.getSourcePort() == UDP.DHCP_SERVER_PORT) {
+                            dhcpCounter.inc();
+                        }
+                    }
+            } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV6) {
+                IPv6 ipv6Pkt = (IPv6) ethPkt.getPayload();
+                if (ipv6Pkt.getNextHeader() == IPv6.PROTOCOL_ICMP6) {
+                    icmp6Counter.inc();
+                    ICMP6 icmpv6 = (ICMP6) ipv6Pkt.getPayload();
+                    if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_SOLICITATION) {
+                        nbrSolicitCounter.inc();
+                    } else if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_ADVERTISEMENT) {
+                        nbrAdvertCounter.inc();
+                    }
+                }
+            } else {
+                log.debug("Packet is unknown.");
+                unknownCounter.inc();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java
new file mode 100644
index 0000000..7846756
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.packetstats;
+
+
+import com.google.common.collect.ImmutableList;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.ui.UiExtension;
+import org.onosproject.ui.UiExtensionService;
+import org.onosproject.ui.UiMessageHandlerFactory;
+import org.onosproject.ui.UiView;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ *  ONOS UI Custom-View application component for the Packet Statistics Application.
+ */
+@Component(immediate = true)
+public class PacketStatsUiComponent {
+    private static final String VIEW_ID = "sampleCustom";
+    private static final String VIEW_TEXT = "Packet Statistics Application";
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected UiExtensionService uiExtensionService;
+
+    // List of application views
+    private final List<UiView> uiViews = ImmutableList.of(
+            new UiView(UiView.Category.OTHER, VIEW_ID, VIEW_TEXT)
+    );
+
+
+    // Factory for UI message handlers
+    private final UiMessageHandlerFactory messageHandlerFactory =
+            () -> ImmutableList.of(new PacketStatsUiMessageHandler());
+
+
+    // Application UI extension
+    protected UiExtension extension =
+            new UiExtension.Builder(getClass().getClassLoader(), uiViews)
+                    .resourcePath(VIEW_ID)
+                    .messageHandlerFactory(messageHandlerFactory)
+                    .build();
+
+    @Activate
+    protected void activate() {
+        uiExtensionService.register(extension);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        uiExtensionService.unregister(extension);
+        log.info("Stopped");
+    }
+
+}
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiMessageHandler.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiMessageHandler.java
new file mode 100644
index 0000000..a13c543
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/PacketStatsUiMessageHandler.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.packetstats;
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.MetricFilter;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.ConnectPoint;
+import org.onlab.metrics.MetricsService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ONOS UI Custom-View message handler.
+ * <p>
+ * This class contains the request handlers that handle the response
+ * to each event. In this particular implementation the second message
+ * handler creates the patch and the first message handler loads the data.
+ */
+
+public class PacketStatsUiMessageHandler extends UiMessageHandler {
+
+    private static final String ARP_REQ = "arpRequest";
+    private static final String ARP_RESP = "arpResponse";
+    private static final String DHCP_REQ = "dhcpRequest";
+    private static final String DHCP_RESP = "dhcpResponse";
+    private static final String ICMP_REQ = "icmpRequest";
+    private static final String ICMP_RESP = "icmpResponse";
+    private static final String LLDP_REQ = "lldpRequest";
+    private static final String LLDP_RESP = "lldpResponse";
+    private static final String VLAN_REQ = "vlanRequest";
+    private static final String VLAN_RESP = "vlanResponse";
+    private static final String IGMP_REQ = "igmpRequest";
+    private static final String IGMP_RESP = "igmpResponse";
+    private static final String PIM_REQ = "pimRequest";
+    private static final String PIM_RESP = "pimResponse";
+    private static final String BSN_REQ = "bsnRequest";
+    private static final String BSN_RESP = "bsnResponse";
+    private static final String UNKNOWN_REQ = "unknownRequest";
+    private static final String UNKNOWN_RESP = "unknownResponse";
+    private static final String MPLS_REQ = "mplsRequest";
+    private static final String MPLS_RESP = "mplsResponse";
+
+
+
+
+    private static final String METRIC_NAME = null;
+    private static String total = "";
+
+    private List<ConnectPoint> previous = new ArrayList<>();
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    MetricFilter filter = METRIC_NAME != null ? (name, metric) -> name.equals(METRIC_NAME) : MetricFilter.ALL;
+
+    @Override
+    protected Collection<RequestHandler> createRequestHandlers() {
+        return ImmutableSet.of(
+                new ArpRequestHandler(),
+                new DhcpRequestHandler(),
+                new IcmpRequestHandler(),
+                new LldpRequestHandler(),
+                new VlanRequestHandler(),
+                new IgmpRequestHandler(),
+                new PimRequestHandler(),
+                new BsnRequestHandler(),
+                new UnknownRequestHandler(),
+                new MplsRequestHandler()
+
+        );
+
+    }
+
+    //Looking for ARP Packets
+    private final class ArpRequestHandler extends RequestHandler {
+        private ArpRequestHandler() {
+            super(ARP_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter arpCounter = counters.get("packetStatisticsComponent.arpFeature.arpPC");
+            long arpCount = arpCounter.getCount();
+            ObjectNode arpJson = objectNode();
+            arpJson.put("ArpCounter", arpCount);
+            sendMessage(ARP_RESP, arpJson);
+        }
+    }
+
+    //Looking for DHCP Packets
+    private final class DhcpRequestHandler extends RequestHandler {
+        private DhcpRequestHandler() {
+            super(DHCP_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter dhcpCounter = counters.get("packetStatisticsComponent.dhcpFeature.dhcpPC");
+            long dhcpCount = dhcpCounter.getCount();
+            ObjectNode dhcpJson = objectNode();
+            dhcpJson.put("DhcpCounter", dhcpCount);
+            log.info("Received DHCP Request");
+            sendMessage(DHCP_RESP, dhcpJson);
+        }
+    }
+    //Looking for ICMP Packets
+    private final class IcmpRequestHandler extends RequestHandler {
+        private IcmpRequestHandler() {
+            super(ICMP_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter icmpCounter = counters.get("packetStatisticsComponent.icmpFeature.icmpPC");
+            long icmpCount = icmpCounter.getCount();
+            ObjectNode icmpJson = objectNode();
+            icmpJson.put("IcmpCounter", icmpCount);
+            log.info("Received ICMP Request");
+            sendMessage(ICMP_RESP, icmpJson);
+        }
+    }
+    //Looking for LLDP Packets
+    private final class LldpRequestHandler extends RequestHandler {
+        private LldpRequestHandler() {
+            super(LLDP_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter lldpCounter = counters.get("packetStatisticsComponent.lldpFeature.lldpPC");
+            long lldpCount = lldpCounter.getCount();
+            ObjectNode lldpJson = objectNode();
+            lldpJson.put("LldpCounter", lldpCount);
+            log.info("Received LLDP Request");
+            sendMessage(LLDP_RESP, lldpJson);
+        }
+    }
+    //Looking for VLAN Packets
+    private final class VlanRequestHandler extends RequestHandler {
+        private VlanRequestHandler() {
+            super(VLAN_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter vlanCounter = counters.get("packetStatisticsComponent.vlanFeature.vlanPC");
+            long vlanCount = vlanCounter.getCount();
+            ObjectNode vlanJson = objectNode();
+            vlanJson.put("VlanCounter", vlanCount);
+            log.info("Received VLAN Request");
+            sendMessage(VLAN_RESP, vlanJson);
+        }
+    }
+    //Looking for IGMP Packets
+    private final class IgmpRequestHandler extends RequestHandler {
+        private IgmpRequestHandler() {
+            super(IGMP_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter igmpCounter =  counters.get("packetStatisticsComponent.igmpFeature.igmpPC");
+            long igmpCount = igmpCounter.getCount();
+            ObjectNode igmpJson = objectNode();
+            igmpJson.put("IgmpCounter", igmpCount);
+            log.info("Received IGMP Request");
+            sendMessage(IGMP_RESP, igmpJson);
+        }
+    }
+    //Looking for PIM Packets
+    private final class PimRequestHandler extends RequestHandler {
+        private PimRequestHandler() {
+            super(PIM_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter pimCounter =  counters.get("packetStatisticsComponent.pimFeature.pimPC");
+            long pimCount = pimCounter.getCount();
+            ObjectNode pimJson = objectNode();
+            pimJson.put("PimCounter", pimCount);
+            log.info("Received PIM Request");
+            sendMessage(PIM_RESP, pimJson);
+        }
+    }
+    //Looking for PIM Packets
+    private final class BsnRequestHandler extends RequestHandler {
+        private BsnRequestHandler() {
+            super(BSN_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter bsnCounter =  counters.get("packetStatisticsComponent.bsnFeature.bsnPC");
+            long bsnCount = bsnCounter.getCount();
+            ObjectNode bsnJson = objectNode();
+            bsnJson.put("BsnCounter", bsnCount);
+            log.info("Received BSN Request");
+            sendMessage(BSN_RESP, bsnJson);
+        }
+    }
+    //Looking for PIM Packets
+    private final class UnknownRequestHandler extends RequestHandler {
+        private UnknownRequestHandler() {
+            super(UNKNOWN_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter unknownCounter =  counters.get("packetStatisticsComponent.unknownFeature.unknownPC");
+            long unknownCount = unknownCounter.getCount();
+            ObjectNode unknownJson = objectNode();
+            unknownJson.put("UnknownCounter", unknownCount);
+            log.info("Received UNKNOWN Request");
+            sendMessage(UNKNOWN_RESP, unknownJson);
+        }
+    }
+    //Looking for PIM Packets
+    private final class MplsRequestHandler extends RequestHandler {
+        private MplsRequestHandler() {
+            super(MPLS_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+            Counter mplsCounter =  counters.get("packetStatisticsComponent.mplsFeature.mplsPC");
+            long mplsCount = mplsCounter.getCount();
+            ObjectNode mplsJson = objectNode();
+            mplsJson.put("MplsCounter", mplsCount);
+            log.info("Received MPLS Request");
+            sendMessage(MPLS_RESP, mplsJson);
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/PacketStatisticsShowCommand.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/PacketStatisticsShowCommand.java
new file mode 100644
index 0000000..932d37c
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/PacketStatisticsShowCommand.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.packetstats.cli;
+
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.MetricFilter;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onlab.metrics.MetricsService;
+import java.util.Map;
+/**
+ * Displays the entries.
+ */
+@Command(scope = "onos", name = "pkt-stats-show", description = "Displays the packet statistics values")
+public class PacketStatisticsShowCommand extends AbstractShellCommand {
+
+    private static final String METRIC_NAME = null;
+    private static final String FORMAT = "PacketType = %s, Count = %s";
+    private static final String FORMAT_LLDP = "Device = %s, Count = %s";
+    MetricFilter filter = METRIC_NAME != null ? (name, metric) -> name.equals(METRIC_NAME) : MetricFilter.ALL;
+
+
+    @Override
+    protected void execute() {
+            MetricsService service = get(MetricsService.class);
+            Map<String, Counter> counters = service.getCounters(filter);
+
+            Counter arpCounter = counters.get("packetStatisticsComponent.arpFeature.arpPC");
+            Counter lldpCounter = counters.get("packetStatisticsComponent.lldpFeature.lldpPC");
+            Counter nsCounter = counters.get("packetStatisticsComponent.nbrSolicitFeature.nbrSolicitPC");
+            Counter naCounter = counters.get("packetStatisticsComponent.nbrAdvertFeature.nbrAdvertPC");
+
+            print(FORMAT, "ARP ", arpCounter.getCount());
+            print(FORMAT, "LLDP ", lldpCounter.getCount());
+            print(FORMAT, "Neighbor Solicitation ", nsCounter.getCount());
+            print(FORMAT, "Neighbor Advertisement ", naCounter.getCount());
+
+    }
+
+}
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/package-info.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/package-info.java
new file mode 100644
index 0000000..5b37086
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/cli/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2014-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.
+ */
+
+/**
+ * Sample application that provides simple packet statistics.
+ */
+package org.onosproject.packetstats.cli;
diff --git a/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/package-info.java b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/package-info.java
new file mode 100644
index 0000000..54a806c
--- /dev/null
+++ b/apps/packet-stats/app/src/main/java/org/onosproject/packetstats/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2014-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.
+ */
+
+/**
+ * Sample application that provides simple packet statistics.
+ */
+package org.onosproject.packetstats;
diff --git a/apps/packet-stats/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/packet-stats/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
new file mode 100644
index 0000000..af51080
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -0,0 +1,23 @@
+<!--
+  ~ Copyright 2014-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.
+  -->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+        <command>
+            <action class="org.onosproject.packetstats.cli.PacketStatisticsShowCommand"/>
+        </command>
+    </command-bundle>
+</blueprint>
diff --git a/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.css b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.css
new file mode 100644
index 0000000..84f9685
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.css
@@ -0,0 +1,116 @@
+/* css for sample app custom view */
+
+#ov-sample-custom {
+    padding: 20px;
+}
+.light #ov-sample-custom {
+    color: navy;
+}
+.dark #ov-sample-custom {
+    color: #88f;
+}
+
+#ov-sample-custom .button-panel {
+    margin: 10px;
+    width: 200px;
+}
+
+.light #ov-sample-custom .button-panel {
+    background-color: #ccf;
+}
+.dark #ov-sample-custom .button-panel {
+    background-color: #444;
+}
+
+#ov-sample-custom .my-button {
+    cursor: pointer;
+    padding: 4px;
+    text-align: center;
+}
+
+.light #ov-sample-custom .my-button {
+    color: white;
+    background-color: #8b8386;
+}
+.dark #ov-sample-custom .my-button {
+    color: black;
+    background-color: #aaa;
+}
+
+#ov-sample-custom .number {
+    font-size: 140%;
+    text-align: right;
+}
+
+#ov-sample-custom .quote {
+    margin: 10px 20px;
+    font-style: italic;
+}
+
+.bar rect {
+  fill: steelblue;
+}
+
+.bar text {;
+  font: 15px sans-serif;
+}
+
+
+.chart div {
+  font: 10px sans-serif;
+  background-color: steelblue;
+  text-align: right;
+  padding: 3px;
+  margin: 1px;
+  color: white;
+}
+     body {
+        width: 1450px;
+        height: 500px;
+        position: relative;
+        background-color:#DFE5EA;
+    }
+
+    svg {
+        width: 100%;
+        height: 100%;
+        position: center;
+    }
+
+    .toolTip {
+        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+        position: absolute;
+        display: none;
+        width: auto;
+        height: auto;
+        background: none repeat scroll 0 0 white;
+        border: 0 none;
+        border-radius: 8px 8px 8px 8px;
+        box-shadow: -3px 3px 15px #888888;
+        color: black;
+        font: 12px sans-serif;
+        padding: 5px;
+        text-align: center;
+    }
+
+    text {
+        font: 17px sans-serif;
+    }
+    text.value {
+        font-size: 150%;
+        fill: white;
+    }
+
+    .axisHorizontal path{
+        fill: none;
+    }
+
+    .axisHorizontal .tick line {
+        stroke-width: 1;
+        stroke: rgba(0, 0, 0, 0.2);
+    }
+
+    .bar {
+        fill: steelblue;
+        fill-opacity: .9;
+    }
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.html b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.html
new file mode 100644
index 0000000..ef8d1aa
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.html
@@ -0,0 +1,18 @@
+<!-- partial HTML of patch panel app -->
+<meta charset="utf-8">
+<head>
+</head>
+
+<body style="background-color:powderblue;">
+
+<h2><center>Packet Statistics</center></h2>
+
+<div id="ov-sample-custom" ng-controller="OvSampleCustomCtrl">
+    <center><div class="button-panel">
+        <div class="my-button" ng-click="dthreestuff()">
+            Generate Graph
+        </div>
+    </div>
+    </center>
+
+</div>
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.js b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.js
new file mode 100644
index 0000000..5122047
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/app/view/sampleCustom/sampleCustom.js
@@ -0,0 +1,295 @@
+// js for patch panel app custom view
+/**
+IMPORTANT CHANGES THAT MUST BE MADE BEFORE SUBMITTING
+
+-Graph is not being updated with packet counters. The counters is only set to 0.
+ This is a New bug, after individual buttons were removed.
+-HTML Page is not being resized depending on the the size of the screen.
+-Must Enable Scrolling
+-Can Remove Redundant Code and create one json file, instead of multiple.
+-Add comments and work on the code formatting.
+
+Due to a paucity of time, I couldn't work on some of these important changes.
+The first bug is very important to correct and the code should not be in the ONOS
+codebase without the change.
+
+Feel free to contact me for any issues.
+**/
+var strdhcpval = "h";
+ (function () {
+     'use strict';
+     // injected refs
+     var $log, $scope, wss, d3Elem;
+
+     // constants remember to change this stuff!!s
+     var arpReq = 'arpRequest',
+         arpResp = 'arpResponse';
+     var dhcpReq = 'dhcpRequest',
+         dhcpResp = 'dhcpResponse';
+     var icmpReq = 'icmpRequest',
+         icmpResp = 'icmpResponse';
+     var lldpReq = 'lldpRequest',
+         lldpResp = 'lldpResponse';
+     var vlanReq = 'vlanRequest',
+         vlanResp = 'vlanResponse';
+     var igmpReq = 'igmpRequest',
+         igmpResp = 'igmpResponse';
+     var pimReq = 'pimRequest',
+         pimResp = 'pimResponse';
+     var bsnReq = 'bsnRequest',
+         bsnResp = 'bsnResponse';
+     var unknownReq = 'unknownRequest',
+         unknownResp = 'unknownResponse';
+     var mplsReq = 'mplsRequest',
+         mplsResp = 'mplsResponse';
+     var arpval = 0;
+     var dhcpval = 0;
+     var icmpval = 0;
+     var lldpval = 0;
+     var vlanval = 0;
+     var igmpval = 0;
+     var pimval = 0;
+     var bsnval =0;
+     var unknownval =0;
+     var mplsval = 0;
+
+     var arpMsg  = "";
+     var dhcpMsg = "";
+     var icmpMsg = "";
+     var lldpMsg = "";
+     var vlanMsg = "";
+     var igmpMsg = "";;
+     var pimMsg = "";
+     var bsnMsg = "";
+     var unknownMsg = "";
+     var mplsMsg = "";
+
+     function arpGetter() {
+        wss.sendEvent(arpReq);
+     }
+     function icmpGetter() {
+         wss.sendEvent(icmpReq);
+     }
+     function lldpGetter() {
+         wss.sendEvent(lldpReq);
+     }
+     function dhcpGetter() {
+         wss.sendEvent(dhcpReq);
+     }
+     function vlanGetter() {
+         wss.sendEvent(vlanReq);
+     }
+
+     function igmpGetter() {
+         wss.sendEvent(igmpReq);
+     }
+     function pimGetter() {
+         wss.sendEvent(pimReq);
+     }
+     function bsnGetter() {
+         wss.sendEvent(bsnReq);
+     }
+     function unknownGetter() {
+         wss.sendEvent(unknownReq);
+     }
+     function mplsGetter() {
+         wss.sendEvent(mplsReq);
+     }
+
+
+     function dthreestuff() {
+     wss.sendEvent(dhcpReq);
+     wss.sendEvent(unknownReq);
+     wss.sendEvent(mplsReq);
+    var data = [
+        {label:"ARP", value:arpval},
+        {label:"ICMP", value:icmpval},
+        {label:"DHCP", value:dhcpval},
+        {label:"PIM", value:pimval},
+        {label:"BSN", value:bsnval},
+        {label:"IGMP", value:igmpval},
+        {label:"LLDP", value:lldpval},
+        {label:"VLAN", value:vlanval},
+        {label:"MPLS", value:mplsval},
+        {label:"Unknown", value:unknownval}
+    ];
+
+
+    var div = d3.select("body").append("div").attr("class", "toolTip");
+
+    var axisMargin = 20,
+            margin = 40,
+            valueMargin = 4,
+            width = parseInt(d3.select('body').style('width'), 10),
+            height = parseInt(d3.select('body').style('height'), 10),
+            barHeight = (height-axisMargin-margin*2)* 0.4/data.length,
+            barPadding = (height-axisMargin-margin*2)*0.6/data.length,
+            data, bar, svg, scale, xAxis, labelWidth = 0;
+
+    var max = d3.max(data, function(d) { return d.value; });
+
+    var svg = d3.select('body')
+            .append("svg")
+            .attr("width", width)
+            .attr("height", height);
+
+
+    var bar = svg.selectAll("g")
+            .data(data)
+            .enter()
+            .append("g");
+
+    bar.attr("class", "bar")
+            .attr("cx",0)
+            .attr("transform", function(d, i) {
+                return "translate(" + margin + "," + (i * (barHeight + barPadding) + barPadding) + ")";
+            });
+
+    bar.append("text")
+            .attr("class", "label")
+            .attr("y", barHeight / 2)
+            .attr("dy", ".35em") //vertical align middle
+            .text(function(d){
+                return d.label;
+            }).each(function() {
+        labelWidth = Math.ceil(Math.max(labelWidth, this.getBBox().width));
+    });
+
+    var scale = d3.scale.linear()
+            .domain([0, max])
+            .range([0, width - margin*2 - labelWidth]);
+
+    var xAxis = d3.svg.axis()
+            .scale(scale)
+            .tickSize(-height + 2*margin + axisMargin)
+            .orient("bottom");
+
+    bar.append("rect")
+            .attr("transform", "translate("+labelWidth+", 0)")
+            .attr("height", barHeight)
+            .attr("width", function(d){
+                return scale(d.value);
+            });
+
+    bar.append("text")
+            .attr("class", "value")
+            .attr("y", barHeight / 2)
+            .attr("dx", -valueMargin + labelWidth) //margin right
+            .attr("dy", ".35em") //vertical align middle
+            .attr("text-anchor", "end")
+            .text(function(d){
+                return (d.value+" Packets");
+            })
+            .attr("x", function(d){
+                var width = this.getBBox().width;
+                return Math.max(width + valueMargin, scale(d.value));
+            });
+
+    bar
+            .on("mousemove", function(d){
+                div.style("left", d3.event.pageX+10+"px");
+                div.style("top", d3.event.pageY-25+"px");
+                div.style("display", "inline-block");
+                div.html((d.label)+"<br>"+(d.value)+" Packets");
+            });
+    bar
+            .on("mouseout", function(d){
+                div.style("display", "none");
+            });
+
+    svg.insert("g",":first-child")
+            .attr("class", "axisHorizontal")
+            .attr("transform", "translate(" + (margin + labelWidth) + ","+ (height - axisMargin - margin)+")")
+            .call(xAxis);
+
+     }
+
+     function responseArp(data) {
+        arpval = data.DhcpCounter;
+     }
+
+
+     function responseDhcp(data) {
+        dhcpval = data.DhcpCounter;
+     }
+
+     function responseIcmp(data) {
+        icmpval = data.IcmpCounter;
+     }
+     function responseLldp(data) {
+        lldpval = data.LldpCounter;
+     }
+     function responseVlan(data) {
+        vlanval = data.VlanCounter;
+     }
+     function responseIgmp(data) {
+        igmpval = data.IgmpCounter;
+     }
+     function responsePim(data) {
+        pimval = data.PimCounter;
+     }
+     function responseBsn(data) {
+        bsnval = data.BsnCounter;
+     }
+     function responseUnknown(data) {
+        unknownval = data.UnknownCounter;
+     }
+
+      function responseMPLS(data) {
+        mplsval = data.MplsCounter;
+      }
+
+     var app = angular.module('ovSampleCustom', [])
+         .controller('OvSampleCustomCtrl',
+         ['$log', '$scope', 'WebSocketService',
+
+         function (_$log_, _$scope_, _wss_, ) {
+             $log = _$log_;
+             $scope = _$scope_;
+             wss = _wss_;
+
+
+             var handlers = {};
+             $scope.data = {};
+
+             // data response handler
+             handlers[arpResp] = responseArp;
+             handlers[dhcpResp] = responseDhcp;
+             handlers[icmpResp] = responseIcmp;
+             handlers[lldpResp] = responseLldp;
+             handlers[vlanResp] = responseVlan;
+             handlers[igmpResp] = responseIgmp;
+             handlers[pimResp] = responsePim;
+             handlers[bsnResp] = responseBsn;
+             handlers[unknownResp] = responseUnknown;
+             handlers[mplsResp] = responseMPLS;
+             wss.bindHandlers(handlers);
+
+
+             // custom click handler
+             $scope.arpGetter = arpGetter;
+             $scope.icmpGetter = icmpGetter;
+             $scope.dhcpGetter = dhcpGetter;
+             $scope.lldpGetter = lldpGetter;
+             $scope.vlanGetter = vlanGetter;
+             $scope.igmpGetter = igmpGetter;
+             $scope.pimGetter = pimGetter;
+             $scope.bsnGetter = bsnGetter;
+             $scope.unknownGetter = unknownGetter;
+             $scope.mplsGetter = mplsGetter;
+             $scope.dthreestuff = dthreestuff;
+
+
+
+             // cleanup
+             $scope.$on('$destroy', function () {
+                 wss.unbindHandlers(handlers);
+                 $log.log('OvSampleCustomCtrl has been destroyed');
+             });
+
+             $log.log('OvSampleCustomCtrl has been created');
+         }]);
+
+
+
+ }());
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/resources/sampleCustom/css.html b/apps/packet-stats/app/src/main/resources/sampleCustom/css.html
new file mode 100644
index 0000000..4e7b709
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/sampleCustom/css.html
@@ -0,0 +1 @@
+<link rel="stylesheet" href="app/view/sampleCustom/sampleCustom.css">
\ No newline at end of file
diff --git a/apps/packet-stats/app/src/main/resources/sampleCustom/js.html b/apps/packet-stats/app/src/main/resources/sampleCustom/js.html
new file mode 100644
index 0000000..6550b85
--- /dev/null
+++ b/apps/packet-stats/app/src/main/resources/sampleCustom/js.html
@@ -0,0 +1 @@
+<script src="app/view/sampleCustom/sampleCustom.js"></script>
\ No newline at end of file
