diff --git a/agent/src/core_api_handler.cc b/agent/src/core_api_handler.cc
index 65ce38a..5553c9a 100644
--- a/agent/src/core_api_handler.cc
+++ b/agent/src/core_api_handler.cc
@@ -3449,6 +3449,54 @@
     return Status::OK;
 }
 
+Status GetPonPortStatistics_(uint32_t intf_id, common::PortStatistics* pon_stats) {
+    bcmos_errno err;
+    bcmolt_intf_ref intf_ref;
+    intf_ref.intf_type = BCMOLT_INTERFACE_TYPE_PON;
+    intf_ref.intf_id = intf_id;
+
+    err = get_port_statistics(intf_ref, pon_stats);
+
+    if (err != BCM_ERR_OK) {
+        OPENOLT_LOG(ERROR, openolt_log_id, "retrieval of Pon port statistics failed - Intf ID = %u, err = %d - %s", intf_id, err, bcmos_strerror(err));
+        return grpc::Status(grpc::StatusCode::INTERNAL, "retrieval of Pon port statistics failed");
+    }
+
+    OPENOLT_LOG(INFO, openolt_log_id, "retrieved Pon port statistics for Intf ID = %d\n", (int)intf_id);
+    return Status::OK;
+}
+
+Status GetNniPortStatistics_(uint32_t intf_id, common::PortStatistics* nni_stats) {
+    bcmos_errno err;
+    bcmolt_intf_ref intf_ref;
+    intf_ref.intf_type = BCMOLT_INTERFACE_TYPE_NNI;
+    intf_ref.intf_id = intf_id;
+
+    err = get_port_statistics(intf_ref, nni_stats);
+
+    if (err != BCM_ERR_OK) {
+        OPENOLT_LOG(ERROR, openolt_log_id, "retrieval of Nni port statistics failed - Nni Port ID = %u, err = %d - %s", intf_id, err, bcmos_strerror(err));
+        return grpc::Status(grpc::StatusCode::INTERNAL, "retrieval of Nni port statistics failed");
+    }
+
+    OPENOLT_LOG(INFO, openolt_log_id, "retrieved Nni port statistics for Nni Port ID = %d\n", (int)intf_id);
+    return Status::OK;
+}
+
+Status GetAllocIdStatistics_(uint32_t intf_id, uint32_t alloc_id, openolt::OnuAllocIdStatistics* alloc_stats) {
+    bcmos_errno err;
+
+    err = get_alloc_statistics((bcmolt_interface_id)intf_id, (bcmolt_alloc_id)alloc_id, alloc_stats);
+
+    if (err != BCM_ERR_OK) {
+        OPENOLT_LOG(ERROR, openolt_log_id, "retrieval of ALLOC_ID statistics failed - PON ID = %u, ALLOC ID = %u, err = %d - %s", intf_id, alloc_id, err, bcmos_strerror(err));
+        return grpc::Status(grpc::StatusCode::INTERNAL, "retrieval of ALLOC_ID statistics failed");
+    }
+
+    OPENOLT_LOG(INFO, openolt_log_id, "retrieved ALLOC_ID statistics for PON ID = %d, ALLOC_ID ID = %d\n", (int)intf_id, (int)alloc_id);
+    return Status::OK;
+}
+
 Status GetPonRxPower_(uint32_t intf_id, uint32_t onu_id, openolt::PonRxPowerData* response) {
     bcmos_errno err = BCM_ERR_OK;
 
diff --git a/agent/src/stats_collection.cc b/agent/src/stats_collection.cc
index 5065f6b..20e512a 100644
--- a/agent/src/stats_collection.cc
+++ b/agent/src/stats_collection.cc
@@ -32,6 +32,7 @@
 
 //FIXME
 #define FLOWS_COUNT 100
+#define ALLOC_STATS_GET_INTERVAL 10
 
 bcmolt_flow_key* flows_keys = new bcmolt_flow_key[FLOWS_COUNT];
 bcmolt_odid device_id = 0;
@@ -40,8 +41,8 @@
     memset(flows_keys, 0, FLOWS_COUNT * sizeof(bcmolt_flow_key));
 }
 
-openolt::PortStatistics* get_default_port_statistics() {
-    openolt::PortStatistics* port_stats = new openolt::PortStatistics;
+common::PortStatistics* get_default_port_statistics() {
+    common::PortStatistics* port_stats = new common::PortStatistics;
     port_stats->set_intf_id(-1);
     port_stats->set_rx_bytes(-1);
     port_stats->set_rx_packets(-1);
@@ -79,6 +80,30 @@
     port_stats->set_tx_frames_4096_9216(-1);
     port_stats->set_tx_frames_9217_16383(-1);
     port_stats->set_bip_errors(-1);
+    port_stats->set_bip_units(-1);
+    port_stats->set_rxgem(-1);
+    port_stats->set_rxgemdropped(-1);
+    port_stats->set_rxgemidle(-1);
+    port_stats->set_rxgemcorrected(-1);
+    port_stats->set_rxfragmenterror(-1);
+    port_stats->set_rxpacketsdropped(-1);
+    port_stats->set_rxcpuomcipacketsdropped(-1);
+    port_stats->set_rxcpu(-1);
+    port_stats->set_rxomci(-1);
+    port_stats->set_rxomcipacketscrcerror(-1);
+    port_stats->set_rxgemillegal(-1);
+    port_stats->set_txgem(-1);
+    port_stats->set_txcpu(-1);
+    port_stats->set_txomci(-1);
+    port_stats->set_txdroppedillegallength(-1);
+    port_stats->set_txdroppedtpidmiss(-1);
+    port_stats->set_txdroppedvidmiss(-1);
+    port_stats->set_txdroppedtotal(-1);
+    port_stats->set_rxfcserrorpackets(-1);
+    port_stats->set_rxundersizepackets(-1);
+    port_stats->set_rxoversizepackets(-1);
+    port_stats->set_txundersizepackets(-1);
+    port_stats->set_txoversizepackets(-1);
 
     return port_stats;
 }
@@ -126,6 +151,16 @@
     return gemport_stats;
 }
 
+openolt::OnuAllocIdStatistics get_default_alloc_statistics() {
+    openolt::OnuAllocIdStatistics alloc_stats;
+
+    alloc_stats.set_intfid(-1);
+    alloc_stats.set_allocid(-1);
+    alloc_stats.set_rxbytes(-1);
+
+    return alloc_stats;
+}
+
 #if 0
 openolt::FlowStatistics* get_default_flow_statistics() {
     openolt::FlowStatistics* flow_stats = new openolt::FlowStatistics;
@@ -139,9 +174,9 @@
 }
 #endif
 
-openolt::PortStatistics* collectPortStatistics(bcmolt_intf_ref intf_ref) {
+common::PortStatistics* collectPortStatistics(bcmolt_intf_ref intf_ref) {
 
-    openolt::PortStatistics* port_stats = get_default_port_statistics();
+    common::PortStatistics* port_stats = get_default_port_statistics();
 #ifndef TEST_MODE
     bcmos_errno err;
     bcmolt_stat_flags clear_on_read = BCMOLT_STAT_FLAGS_NONE;
@@ -334,6 +369,164 @@
 
 }
 
+bcmos_errno get_port_statistics(bcmolt_intf_ref intf_ref, common::PortStatistics* port_stats) {
+    bcmos_errno err = BCM_ERR_OK;
+    common::PortStatistics* port_stats_temp = get_default_port_statistics();
+    memcpy(port_stats, port_stats_temp, sizeof(common::PortStatistics));
+    delete port_stats_temp;
+    
+#ifndef TEST_MODE
+    bcmolt_stat_flags clear_on_read = BCMOLT_STAT_FLAGS_NONE;
+    bcmolt_nni_interface_stats nni_stats;
+    bcmolt_pon_interface_itu_pon_stats itu_pon_stats;
+
+    switch (intf_ref.intf_type) {
+        case BCMOLT_INTERFACE_TYPE_NNI:
+        {
+            bcmolt_nni_interface_key nni_intf_key;
+            nni_intf_key.id = intf_ref.intf_id;
+            /* init the API struct */
+            BCMOLT_STAT_INIT(&nni_stats, nni_interface, stats, nni_intf_key);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_bytes);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_ucast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_mcast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_bcast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_error_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_fcs_error_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_undersize_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_oversize_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_64);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_65_127);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_128_255);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_256_511);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_512_1023);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_1024_1518);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_1519_2047);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_2048_4095);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_4096_9216);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, rx_frames_9217_16383);
+
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_bytes);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_ucast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_mcast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_bcast_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_error_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_undersize_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_oversize_packets);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_64);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_65_127);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_128_255);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_256_511);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_512_1023);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_1024_1518);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_1519_2047);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_2048_4095);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_4096_9216);
+            BCMOLT_MSG_FIELD_GET(&nni_stats, tx_frames_9217_16383);
+
+            /* call API */
+            err = bcmolt_stat_get((bcmolt_oltid)device_id, &nni_stats.hdr, clear_on_read);
+            if (err == BCM_ERR_OK)
+            {
+                port_stats->set_rx_bytes(nni_stats.data.rx_bytes);
+                port_stats->set_rx_packets(nni_stats.data.rx_packets);
+                port_stats->set_rx_ucast_packets(nni_stats.data.rx_ucast_packets);
+                port_stats->set_rx_mcast_packets(nni_stats.data.rx_mcast_packets);
+                port_stats->set_rx_bcast_packets(nni_stats.data.rx_bcast_packets);
+                port_stats->set_rx_error_packets(nni_stats.data.rx_error_packets);
+                port_stats->set_rxfcserrorpackets(nni_stats.data.rx_fcs_error_packets);
+                port_stats->set_rxundersizepackets(nni_stats.data.rx_undersize_packets);
+                port_stats->set_rxoversizepackets(nni_stats.data.rx_oversize_packets);
+                port_stats->set_tx_bytes(nni_stats.data.tx_bytes);
+                port_stats->set_tx_packets(nni_stats.data.tx_packets);
+                port_stats->set_tx_ucast_packets(nni_stats.data.tx_ucast_packets);
+                port_stats->set_tx_mcast_packets(nni_stats.data.tx_mcast_packets);
+                port_stats->set_tx_bcast_packets(nni_stats.data.tx_bcast_packets);
+                port_stats->set_tx_error_packets(nni_stats.data.tx_error_packets);
+                port_stats->set_txundersizepackets(nni_stats.data.tx_undersize_packets);
+                port_stats->set_txoversizepackets(nni_stats.data.tx_oversize_packets);
+
+            } else {
+                OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to retrieve port statistics, intf_id %d, intf_type %d, err = %s\n",
+                    (int)intf_ref.intf_id, (int)intf_ref.intf_type, bcmos_strerror(err));
+                return err;
+            }
+            break;
+        }
+        case BCMOLT_INTERFACE_TYPE_PON:
+        {
+            bcmolt_pon_interface_key key;
+            key.pon_ni = (bcmolt_interface)intf_ref.intf_id;
+            BCMOLT_STAT_INIT(&itu_pon_stats, pon_interface, itu_pon_stats, key);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, bip_units);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, bip_errors);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_packets);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_gem);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_gem_dropped);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_gem_idle);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_gem_corrected);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_crc_error);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_fragment_error);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_packets_dropped);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_cpu_omci_packets_dropped);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_cpu);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_omci);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_omci_packets_crc_error);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, rx_gem_illegal);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_packets);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_gem);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_cpu);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_omci);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_dropped_illegal_length);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_dropped_tpid_miss);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_dropped_vid_miss);
+            BCMOLT_MSG_FIELD_GET(&itu_pon_stats, tx_dropped_total);
+            
+            /* call API */
+            err = bcmolt_stat_get((bcmolt_oltid)device_id, &itu_pon_stats.hdr, clear_on_read);
+            if (err == BCM_ERR_OK) {
+                port_stats->set_bip_units(itu_pon_stats.data.bip_units);
+                port_stats->set_bip_errors(itu_pon_stats.data.bip_errors);
+                port_stats->set_rx_packets(itu_pon_stats.data.rx_packets);
+                port_stats->set_rxgem(itu_pon_stats.data.rx_gem);
+                port_stats->set_rxgemdropped(itu_pon_stats.data.rx_gem_dropped);
+                port_stats->set_rxgemidle(itu_pon_stats.data.rx_gem_idle);
+                port_stats->set_rxgemcorrected(itu_pon_stats.data.rx_gem_corrected);
+                port_stats->set_rx_crc_errors(itu_pon_stats.data.rx_crc_error);
+                port_stats->set_rxfragmenterror(itu_pon_stats.data.rx_fragment_error);
+                port_stats->set_rxpacketsdropped(itu_pon_stats.data.rx_packets_dropped);
+                port_stats->set_rxcpuomcipacketsdropped(itu_pon_stats.data.rx_cpu_omci_packets_dropped);
+                port_stats->set_rxcpu(itu_pon_stats.data.rx_cpu);
+                port_stats->set_rxomci(itu_pon_stats.data.rx_omci);
+                port_stats->set_rxomcipacketscrcerror(itu_pon_stats.data.rx_omci_packets_crc_error);
+                port_stats->set_rxgemillegal(itu_pon_stats.data.rx_gem_illegal);
+                port_stats->set_tx_packets(itu_pon_stats.data.tx_packets);
+                port_stats->set_txgem(itu_pon_stats.data.tx_gem);
+                port_stats->set_txcpu(itu_pon_stats.data.tx_cpu);
+                port_stats->set_txomci(itu_pon_stats.data.tx_omci);
+                port_stats->set_txdroppedillegallength(itu_pon_stats.data.tx_dropped_illegal_length);
+                port_stats->set_txdroppedtpidmiss(itu_pon_stats.data.tx_dropped_tpid_miss);
+                port_stats->set_txdroppedvidmiss(itu_pon_stats.data.tx_dropped_vid_miss);
+                port_stats->set_txdroppedtotal(itu_pon_stats.data.tx_dropped_total);
+            } else {
+                OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to retrieve port statistics, intf_id %d, intf_type %d, err = %s\n",
+                    (int)intf_ref.intf_id, (int)intf_ref.intf_type, bcmos_strerror(err));
+                return err;
+            }
+            break;
+        }
+    }
+
+    port_stats->set_intf_id(interface_key_to_port_no((bcmolt_interface_id)intf_ref.intf_id, (bcmolt_interface_type)intf_ref.intf_type));
+    time_t now;
+    time(&now);
+    port_stats->set_timestamp((int)now);
+#endif
+    return err;
+}
+
 bcmos_errno get_onu_statistics(bcmolt_interface_id intf_id, bcmolt_onu_id onu_id, openolt::OnuStatistics* onu_stats) {
     bcmos_errno err = BCM_ERR_OK;
 
@@ -457,6 +650,74 @@
     return err;
 }
 
+bcmos_errno set_collect_alloc_stats(bcmolt_interface_id intf_id, bcmolt_alloc_id alloc_id, bcmos_bool collect_stats) {
+    bcmos_errno err = BCM_ERR_OK;
+    bcmolt_itupon_alloc_cfg cfg;
+    bcmolt_itupon_alloc_key key;
+    key.pon_ni = intf_id;
+    key.alloc_id = alloc_id;
+
+    BCMOLT_CFG_INIT(&cfg, itupon_alloc, key);
+    BCMOLT_FIELD_SET(&cfg.data, itupon_alloc_cfg_data, collect_stats, collect_stats);
+    err = bcmolt_cfg_set((bcmolt_oltid)device_id, &cfg.hdr);
+    return err;
+}
+
+bcmos_errno get_alloc_statistics(bcmolt_interface_id intf_id, bcmolt_alloc_id alloc_id, openolt::OnuAllocIdStatistics* allocid_stats) {
+    bcmos_errno err = BCM_ERR_OK;
+
+#ifndef TEST_MODE
+
+    bcmos_errno err1 = BCM_ERR_OK;
+    err1 = set_collect_alloc_stats(intf_id, alloc_id, BCMOS_TRUE);
+    if (err1 == BCM_ERR_OK) {
+        *allocid_stats = get_default_alloc_statistics();
+        bcmolt_stat_flags clear_on_read = BCMOLT_STAT_FLAGS_NONE;
+        bcmolt_itupon_alloc_stats alloc_stats;
+        bcmolt_itupon_alloc_key key;
+        key.pon_ni = intf_id;
+        key.alloc_id = alloc_id;
+
+        // Wait to collect alloc stats after enabling it
+        sleep(ALLOC_STATS_GET_INTERVAL);
+
+        BCMOLT_STAT_INIT(&alloc_stats, itupon_alloc, stats, key);
+        BCMOLT_MSG_FIELD_GET(&alloc_stats, rx_bytes);
+
+        /* call API */
+        err = bcmolt_stat_get((bcmolt_oltid)device_id, &alloc_stats.hdr, clear_on_read);
+        if (err == BCM_ERR_OK) {
+            allocid_stats->set_rxbytes(alloc_stats.data.rx_bytes);
+            allocid_stats->set_intfid(intf_id);
+            allocid_stats->set_allocid(alloc_id);
+        } else {
+            OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to retrieve ALLOC_ID statistics, intf_id %d, alloc_id %d, err no: %d - %s\n",
+                        (int)intf_id, (int)alloc_id, err, bcmos_strerror(err));
+            err1 = set_collect_alloc_stats(intf_id, alloc_id, BCMOS_FALSE);
+            if (err1 != BCM_ERR_OK) {
+            OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to disable collect_stats for ALLOC_ID, intf_id %d, alloc_id %d, err no: %d - %s\n",
+                        (int)intf_id, (int)alloc_id, err, bcmos_strerror(err));
+            }
+            return err;
+        }
+    } else {
+        OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to enable collect_stats for ALLOC_ID, intf_id %d, alloc_id %d, err no: %d - %s\n",
+                        (int)intf_id, (int)alloc_id, err, bcmos_strerror(err));
+        return err1;
+    }
+    
+    err1 = set_collect_alloc_stats(intf_id, alloc_id, BCMOS_FALSE);
+    if (err1 != BCM_ERR_OK) {
+        OPENOLT_LOG(ERROR, openolt_log_id,  "Failed to disable collect_stats for ALLOC_ID, intf_id %d, alloc_id %d, err no: %d - %s\n",
+                        (int)intf_id, (int)alloc_id, err, bcmos_strerror(err));
+        return err1;
+    }
+
+#endif
+
+    return err;
+}
+
 #if 0
 openolt::FlowStatistics* collectFlowStatistics(bcmbal_flow_id flow_id, bcmbal_flow_type flow_type) {
 
@@ -518,7 +779,7 @@
         intf_ref.intf_type = BCMOLT_INTERFACE_TYPE_NNI;
         intf_ref.intf_id = i;
 
-        openolt::PortStatistics* port_stats =
+        common::PortStatistics* port_stats =
             collectPortStatistics(intf_ref);
 
         ::openolt::Indication ind;
@@ -531,7 +792,7 @@
         intf_ref.intf_type = BCMOLT_INTERFACE_TYPE_PON;
         intf_ref.intf_id = i;
 
-        openolt::PortStatistics* port_stats =
+        common::PortStatistics* port_stats =
             collectPortStatistics(intf_ref);
 
         ::openolt::Indication ind;
diff --git a/agent/src/stats_collection.h b/agent/src/stats_collection.h
index 9281655..bd04a9d 100644
--- a/agent/src/stats_collection.h
+++ b/agent/src/stats_collection.h
@@ -18,6 +18,7 @@
 #define OPENOLT_STATS_COLLECTION_H_
 
 #include <voltha_protos/openolt.grpc.pb.h>
+#include <voltha_protos/common.grpc.pb.h>
 
 extern "C"
 {
@@ -26,10 +27,12 @@
 
 void init_stats();
 void stop_collecting_statistics();
-openolt::PortStatistics* get_default_port_statistics();
-openolt::PortStatistics* collectPortStatistics(bcmolt_interface_id intf_id, bcmolt_interface_type intf_type);
+common::PortStatistics* get_default_port_statistics();
+common::PortStatistics* collectPortStatistics(bcmolt_interface_id intf_id, bcmolt_interface_type intf_type);
 bcmos_errno get_onu_statistics(bcmolt_interface_id intf_id, bcmolt_onu_id onu_id, openolt::OnuStatistics* onu_stats);
 bcmos_errno get_gemport_statistics(bcmolt_interface_id intf_id, bcmolt_gem_port_id gemport_id, openolt::GemPortStatistics* gemport_stats);
+bcmos_errno get_port_statistics(bcmolt_intf_ref intf_ref, common::PortStatistics* port_stats);
+bcmos_errno get_alloc_statistics(bcmolt_interface_id intf_id, bcmolt_alloc_id alloc_id, openolt::OnuAllocIdStatistics* alloc_stats);
 #if 0
 openolt::FlowStatistics* get_default_flow_statistics();
 openolt::FlowStatistics* collectFlowStatistics(bcmbal_flow_id flow_id, bcmbal_flow_type flow_type);
