diff --git a/main.go b/main.go
index 106421f..0eba8ba 100644
--- a/main.go
+++ b/main.go
@@ -15,21 +15,22 @@
 package main
 
 import (
-	"encoding/json"
 	"flag"
 	"fmt"
-	"log"
 	"net/http"
-	"os"
-	"os/signal"
+	"sync"
 
 	"github.com/Shopify/sarama"
 	"github.com/prometheus/client_golang/prometheus"
 )
 
 var (
-	broker = flag.String("broker", "voltha-kafka.default.svc.cluster.local:9092", "The Kafka broker")
-	topic  = flag.String("topic", "voltha.kpis", "The Kafka topic")
+	broker      = flag.String("broker", "voltha-kafka.default.svc.cluster.local:9092", "The Kafka broker")
+	volthaTopic = "voltha.kpis"
+	onosTopic   = "onos.kpis"
+
+	volthaTopicPointer = &volthaTopic
+	onosTopicPointer   = &onosTopic
 )
 
 var brokers []string
@@ -37,48 +38,25 @@
 func kafkaInit(brokers []string) {
 	config := sarama.NewConfig()
 	config.Consumer.Return.Errors = true
+	var wg sync.WaitGroup
+
+	wg.Add(2) // we are spinning up two thread and we need to wait for them to exit before stopping the kafka connection
 
 	master, err := sarama.NewConsumer(brokers, config)
 	if err != nil {
+		fmt.Println("kafkaInit panic")
 		panic(err)
 	}
 	defer func() {
+		fmt.Println("kafkaInit close connection")
 		if err := master.Close(); err != nil {
 			panic(err)
 		}
 	}()
-	consumer, err := master.ConsumePartition(*topic, 0, sarama.OffsetOldest)
-	if err != nil {
-		panic(err)
-	}
-	signals := make(chan os.Signal, 1)
-	signal.Notify(signals, os.Interrupt)
-	doneCh := make(chan struct{})
-	go func() {
-		for {
-			select {
-			case err := <-consumer.Errors():
-				fmt.Println(err)
-			case msg := <-consumer.Messages():
-				// fmt.Println(string(msg.Value))
+	go VOLTHAListener(volthaTopicPointer, master, wg)
+	go ONOSListener(onosTopicPointer, master, wg)
 
-				kpi := KPI{}
-
-				err := json.Unmarshal(msg.Value, &kpi)
-
-				if err != nil {
-					log.Fatal(err)
-				}
-
-				export(kpi)
-
-			case <-signals:
-				fmt.Println("Interrupt is detected")
-				doneCh <- struct{}{}
-			}
-		}
-	}()
-	<-doneCh
+	wg.Wait()
 }
 
 func runServer() {
@@ -94,13 +72,23 @@
 	brokers = make([]string, 0)
 	brokers = []string{*broker}
 	fmt.Println("Connecting to broker: ", brokers)
-	fmt.Println("Listening to topic: ", *topic)
+	fmt.Println("Listening to voltha on topic: ", *volthaTopicPointer)
+	fmt.Println("Listening to onos on topic: ", *onosTopicPointer)
 
 	// register metrics within Prometheus
-	prometheus.MustRegister(txBytesTotal)
-	prometheus.MustRegister(rxBytesTotal)
-	prometheus.MustRegister(txPacketsTotal)
-	prometheus.MustRegister(rxPacketsTotal)
+	prometheus.MustRegister(volthaTxBytesTotal)
+	prometheus.MustRegister(volthaRxBytesTotal)
+	prometheus.MustRegister(volthaTxPacketsTotal)
+	prometheus.MustRegister(volthaRxPacketsTotal)
+	prometheus.MustRegister(volthaTxErrorPacketsTotal)
+	prometheus.MustRegister(volthaRxErrorPacketsTotal)
+
+	prometheus.MustRegister(onosTxBytesTotal)
+	prometheus.MustRegister(onosRxBytesTotal)
+	prometheus.MustRegister(onosTxPacketsTotal)
+	prometheus.MustRegister(onosRxPacketsTotal)
+	prometheus.MustRegister(onosTxDropPacketsTotal)
+	prometheus.MustRegister(onosRxDropPacketsTotal)
 }
 
 func main() {
diff --git a/onos-kpi.go b/onos-kpi.go
new file mode 100644
index 0000000..da7b120
--- /dev/null
+++ b/onos-kpi.go
@@ -0,0 +1,63 @@
+// Copyright 2018 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 main
+
+import (
+	"encoding/json"
+	"fmt"
+	"log"
+	"os"
+	"os/signal"
+	"sync"
+
+	"github.com/Shopify/sarama"
+)
+
+func ONOSListener(topic *string, master sarama.Consumer, wg sync.WaitGroup) {
+	fmt.Println("Starting ONOSListener")
+	defer wg.Done()
+	consumer, err := master.ConsumePartition(*topic, 0, sarama.OffsetOldest)
+	if err != nil {
+		fmt.Println("ONOSListener panic")
+		panic(err)
+	}
+	signals := make(chan os.Signal, 1)
+	signal.Notify(signals, os.Interrupt)
+	doneCh := make(chan struct{})
+	go func() {
+		for {
+			select {
+			case err := <-consumer.Errors():
+				fmt.Println(err)
+			case msg := <-consumer.Messages():
+
+				kpi := OnosKPI{}
+
+				err := json.Unmarshal(msg.Value, &kpi)
+
+				if err != nil {
+					log.Fatal(err)
+				}
+
+				exportOnosKPI(kpi)
+
+			case <-signals:
+				fmt.Println("Interrupt is detected")
+				doneCh <- struct{}{}
+			}
+		}
+	}()
+	<-doneCh
+}
diff --git a/onos-prometheus.go b/onos-prometheus.go
new file mode 100644
index 0000000..b383b55
--- /dev/null
+++ b/onos-prometheus.go
@@ -0,0 +1,103 @@
+// Copyright 2018 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 main
+
+import (
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+var (
+	onosTxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_tx_bytes_total",
+			Help: "Number of total bytes transmitted",
+		},
+		[]string{"device_id", "port_id"},
+	)
+	onosRxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_rx_bytes_total",
+			Help: "Number of total bytes received",
+		},
+		[]string{"device_id", "port_id"},
+	)
+	onosTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_tx_packets_total",
+			Help: "Number of total packets transmitted",
+		},
+		[]string{"device_id", "port_id"},
+	)
+	onosRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_rx_packets_total",
+			Help: "Number of total packets received",
+		},
+		[]string{"device_id", "port_id"},
+	)
+
+	onosTxDropPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_tx_drop_packets_total",
+			Help: "Number of total transmitted packets dropped",
+		},
+		[]string{"device_id", "port_id"},
+	)
+
+	onosRxDropPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "onos_rx_drop_packets_total",
+			Help: "Number of total received packets dropped",
+		},
+		[]string{"device_id", "port_id"},
+	)
+)
+
+func exportOnosKPI(kpi OnosKPI) {
+
+	for _, data := range kpi.Ports {
+
+		onosTxBytesTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.TxBytes)
+
+		onosRxBytesTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.RxBytes)
+
+		onosTxPacketsTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.TxPackets)
+
+		onosRxPacketsTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.RxPackets)
+
+		onosTxDropPacketsTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.TxPacketsDrop)
+
+		onosRxDropPacketsTotal.WithLabelValues(
+			kpi.DeviceID,
+			data.PortID,
+		).Set(data.RxPacketsDrop)
+
+	}
+}
diff --git a/prometheus.go b/prometheus.go
deleted file mode 100644
index a1bc327..0000000
--- a/prometheus.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2018 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 main
-
-import (
-       "github.com/prometheus/client_golang/prometheus"
-)
-
-var (
-	txBytesTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "tx_bytes_total",
-			Help: "Number of total bytes transmitted",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-	rxBytesTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "rx_bytes_total",
-			Help: "Number of total bytes received",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-	txPacketsTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "tx_packets_total",
-			Help: "Number of total packets transmitted",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-	rxPacketsTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "rx_packets_total",
-			Help: "Number of total packets received",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-
-	txErrorPacketsTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "tx_error_packets_total",
-			Help: "Number of total transmitted packets error",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-
-	rxErrorPacketsTotal = prometheus.NewGaugeVec(
-		prometheus.GaugeOpts{
-			Name: "rx_error_packets_total",
-			Help: "Number of total received packets error",
-		},
-		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
-	)
-)
-
-func export(kpi KPI) {
-
-	for _, data := range kpi.SliceDatas {
-	        switch title := data.Metadata.Title; title {
-                        case "Ethernet", "PON":
-                                txBytesTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.TxBytes)
-
-                                rxBytesTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.RxBytes)
-
-                                txPacketsTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.TxPackets)
-
-                                rxPacketsTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.RxPackets)
-
-                                txErrorPacketsTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.TxErrorPackets)
-
-                                rxErrorPacketsTotal.WithLabelValues(
-                                        data.Metadata.LogicalDeviceID,
-                                        data.Metadata.SerialNumber,
-                                        data.Metadata.DeviceID,
-                                        data.Metadata.Context.InterfaceID,
-                                        data.Metadata.Context.PonID,
-                                        data.Metadata.Context.PortNumber,
-                                        data.Metadata.Title,
-                                ).Set(data.Metrics.RxErrorPackets)
-
-                                // TODO add metrics for:
-                                // TxBcastPackets
-                                // TxUnicastPackets
-                                // TxMulticastPackets
-                                // RxBcastPackets
-                                // RxMulticastPackets
-
-                        case "Ethernet_Bridge_Port_History":
-                                if data.Metadata.Context.Upstream == "True" {
-                                        // ONU. Extended Ethernet statistics.
-                                        txPacketsTotal.WithLabelValues(
-                                                data.Metadata.LogicalDeviceID,
-                                                data.Metadata.SerialNumber,
-                                                data.Metadata.DeviceID,
-                                                "NA", // InterfaceID
-                                                "NA", // PonID
-                                                "NA", // PortNumber
-                                                data.Metadata.Title,
-                                        ).Add(data.Metrics.Packets)
-
-                                        txBytesTotal.WithLabelValues(
-                                                data.Metadata.LogicalDeviceID,
-                                                data.Metadata.SerialNumber,
-                                                data.Metadata.DeviceID,
-                                                "NA", // InterfaceID
-                                                "NA", // PonID
-                                                "NA", // PortNumber
-                                                data.Metadata.Title,
-                                        ).Add(data.Metrics.Octets)
-                                } else {
-                                         // ONU. Extended Ethernet statistics.
-                                        rxPacketsTotal.WithLabelValues(
-                                                data.Metadata.LogicalDeviceID,
-                                                data.Metadata.SerialNumber,
-                                                data.Metadata.DeviceID,
-                                                "NA", // InterfaceID
-                                                "NA", // PonID
-                                                "NA", // PortNumber
-                                                data.Metadata.Title,
-                                        ).Add(data.Metrics.Packets)
-
-                                        rxBytesTotal.WithLabelValues(
-                                                data.Metadata.LogicalDeviceID,
-                                                data.Metadata.SerialNumber,
-                                                data.Metadata.DeviceID,
-                                                "NA", // InterfaceID
-                                                "NA", // PonID
-                                                "NA", // PortNumber
-                                                data.Metadata.Title,
-                                        ).Add(data.Metrics.Octets)
-                                }
-
-                        case "Ethernet_UNI_History":
-                                // ONU. Do nothing.
-
-                        case "FEC_History":
-                                // ONU. Do Nothing.
-
-                        case "voltha.internal":
-                                // Voltha Internal. Do nothing.
-                }
-	}
-}
diff --git a/types.go b/types.go
index 1e29fbe..b3ecd59 100644
--- a/types.go
+++ b/types.go
@@ -59,8 +59,23 @@
 	Metadata *Metadata `json:"metadata"`
 }
 
-type KPI struct {
+type VolthaKPI struct {
 	Type       string       `json:"type"`
 	Timestamp  float64      `json:"ts"`
 	SliceDatas []*SliceData `json:"slice_data"`
 }
+
+type OnosPort struct {
+	PortID        string  `json:"portId"`
+	RxPackets     float64 `json:"pktRx"`
+	TxPackets     float64 `json:"pktTx"`
+	RxBytes       float64 `json:"bytesRx"`
+	TxBytes       float64 `json:"bytesTx"`
+	RxPacketsDrop float64 `json:"pktRxDrp"`
+	TxPacketsDrop float64 `json:"pktTxDrp"`
+}
+
+type OnosKPI struct {
+	DeviceID string      `json:"deviceId"`
+	Ports    []*OnosPort `json:"ports"`
+}
diff --git a/voltha-kpi.go b/voltha-kpi.go
new file mode 100644
index 0000000..122f3f0
--- /dev/null
+++ b/voltha-kpi.go
@@ -0,0 +1,64 @@
+// Copyright 2018 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 main
+
+import (
+	"encoding/json"
+	"fmt"
+	"log"
+	"os"
+	"os/signal"
+	"sync"
+
+	"github.com/Shopify/sarama"
+)
+
+func VOLTHAListener(topic *string, master sarama.Consumer, wg sync.WaitGroup) {
+	fmt.Println("Starting VOLTHAListener")
+	defer wg.Done()
+	consumer, err := master.ConsumePartition(*topic, 0, sarama.OffsetOldest)
+	if err != nil {
+		fmt.Println("VOLTHAListener panic")
+		panic(err)
+	}
+	signals := make(chan os.Signal, 1)
+	signal.Notify(signals, os.Interrupt)
+	doneCh := make(chan struct{})
+	go func() {
+		for {
+			select {
+			case err := <-consumer.Errors():
+				fmt.Println(err)
+			case msg := <-consumer.Messages():
+				// fmt.Println(string(msg.Value))
+
+				kpi := VolthaKPI{}
+
+				err := json.Unmarshal(msg.Value, &kpi)
+
+				if err != nil {
+					log.Fatal(err)
+				}
+
+				exportVolthaKPI(kpi)
+
+			case <-signals:
+				fmt.Println("Interrupt is detected")
+				doneCh <- struct{}{}
+			}
+		}
+	}()
+	<-doneCh
+}
diff --git a/voltha-prometheus.go b/voltha-prometheus.go
new file mode 100644
index 0000000..526010b
--- /dev/null
+++ b/voltha-prometheus.go
@@ -0,0 +1,262 @@
+// Copyright 2018 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 main
+
+import (
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+var (
+	volthaTxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_tx_bytes_total",
+			Help: "Number of total bytes transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+	volthaRxBytesTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_rx_bytes_total",
+			Help: "Number of total bytes received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+	volthaTxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_tx_packets_total",
+			Help: "Number of total packets transmitted",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+	volthaRxPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_rx_packets_total",
+			Help: "Number of total packets received",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaTxErrorPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_tx_error_packets_total",
+			Help: "Number of total transmitted packets error",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+
+	volthaRxErrorPacketsTotal = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "voltha_rx_error_packets_total",
+			Help: "Number of total received packets error",
+		},
+		[]string{"logical_device_id", "serial_number", "device_id", "interface_id", "pon_id", "port_number", "title"},
+	)
+)
+
+func exportVolthaKPI(kpi VolthaKPI) {
+
+	for _, data := range kpi.SliceDatas {
+		switch title := data.Metadata.Title; title {
+		case "Ethernet", "PON":
+			volthaTxBytesTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxBytes)
+
+			volthaRxBytesTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxBytes)
+
+			volthaTxPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxPackets)
+
+			volthaRxPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxPackets)
+
+			volthaTxErrorPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxErrorPackets)
+
+			volthaRxErrorPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxErrorPackets)
+
+			// TODO add metrics for:
+			// TxBcastPackets
+			// TxUnicastPackets
+			// TxMulticastPackets
+			// RxBcastPackets
+			// RxMulticastPackets
+
+		case "Ethernet_Bridge_Port_History":
+			if data.Metadata.Context.Upstream == "True" {
+				// ONU. Extended Ethernet statistics.
+				volthaTxPacketsTotal.WithLabelValues(
+					data.Metadata.LogicalDeviceID,
+					data.Metadata.SerialNumber,
+					data.Metadata.DeviceID,
+					"NA", // InterfaceID
+					"NA", // PonID
+					"NA", // PortNumber
+					data.Metadata.Title,
+				).Add(data.Metrics.Packets)
+
+				volthaTxBytesTotal.WithLabelValues(
+					data.Metadata.LogicalDeviceID,
+					data.Metadata.SerialNumber,
+					data.Metadata.DeviceID,
+					"NA", // InterfaceID
+					"NA", // PonID
+					"NA", // PortNumber
+					data.Metadata.Title,
+				).Add(data.Metrics.Octets)
+			} else {
+				// ONU. Extended Ethernet statistics.
+				volthaRxPacketsTotal.WithLabelValues(
+					data.Metadata.LogicalDeviceID,
+					data.Metadata.SerialNumber,
+					data.Metadata.DeviceID,
+					"NA", // InterfaceID
+					"NA", // PonID
+					"NA", // PortNumber
+					data.Metadata.Title,
+				).Add(data.Metrics.Packets)
+
+				volthaRxBytesTotal.WithLabelValues(
+					data.Metadata.LogicalDeviceID,
+					data.Metadata.SerialNumber,
+					data.Metadata.DeviceID,
+					"NA", // InterfaceID
+					"NA", // PonID
+					"NA", // PortNumber
+					data.Metadata.Title,
+				).Add(data.Metrics.Octets)
+			}
+
+		case "Ethernet_UNI_History":
+			// ONU. Do nothing.
+
+		case "FEC_History":
+			// ONU. Do Nothing.
+
+			volthaTxBytesTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxBytes)
+
+			volthaRxBytesTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxBytes)
+
+			volthaTxPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxPackets)
+
+			volthaRxPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxPackets)
+
+			volthaTxErrorPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.TxErrorPackets)
+
+			volthaRxErrorPacketsTotal.WithLabelValues(
+				data.Metadata.LogicalDeviceID,
+				data.Metadata.SerialNumber,
+				data.Metadata.DeviceID,
+				data.Metadata.Context.InterfaceID,
+				data.Metadata.Context.PonID,
+				data.Metadata.Context.PortNumber,
+				data.Metadata.Title,
+			).Set(data.Metrics.RxErrorPackets)
+
+			// TODO add metrics for:
+			// TxBcastPackets
+			// TxUnicastPackets
+			// TxMulticastPackets
+			// RxBcastPackets
+			// RxMulticastPackets
+
+		case "voltha.internal":
+			// Voltha Internal. Do nothing.
+		}
+	}
+}
