diff --git a/internal/pkg/commands/devices.go b/internal/pkg/commands/devices.go
index ba2b8c2..7d824f4 100644
--- a/internal/pkg/commands/devices.go
+++ b/internal/pkg/commands/devices.go
@@ -110,6 +110,49 @@
 DFrames_512To_1023Octets:	{{.DFrames_512To_1023Octets}}
 DFrames_1024To_1518Octets:	{{.DFrames_1024To_1518Octets}}
 PmFormat:	                {{.PmFormat}}`
+	DEFAULT_PON_PORT_STATS_FORMAT = `Pon Port:                   {{.PonPort}}
+Bip Units:                  {{.BipUnits}}
+Bip Errors:                 {{.BipErrors}}
+RxPackets:                  {{.RxPackets}}
+RxGem:                      {{.RxGem}}
+RxGemDropped:               {{.RxGemDropped}}
+RxGemIdle:                  {{.RxGemIdle}}
+RxGemCorrected:             {{.RxGemCorrected}}
+RxGemIllegal:               {{.RxGemIllegal}}
+RxCrcError:                 {{.RxCrcErrors}}
+RxFragmentError:            {{.RxFragmentError}}
+RxPacketsDropped:           {{.RxPacketsDropped}}
+RxCpuOmciPacketsDropped:    {{.RxCpuOmciPacketsDropped}}
+RxCpu:                      {{.RxCpu}}
+RxOmci:                     {{.RxOmci}}
+RxOmciPacketsCrcError:      {{.RxOmciPacketsCrcError}}
+TxPackets:                  {{.TxPackets}}
+TxGem:                      {{.TxGem}}
+TxCpu:                      {{.TxCpu}}
+TxOmci:                     {{.TxOmci}}
+TxDroppedIllegalLength:     {{.TxDroppedIllegalLength}}
+TxDroppedTpidMiss:          {{.TxDroppedTpidMiss}}
+TxDroppedVidMiss:           {{.TxDroppedVidMiss}}
+TxDroppedTotal:             {{.TxDroppedTotal}}`
+	DEFAULT_NNI_PORT_STATS_FORMAT = `Nni Port:               {{.NniPort}}
+RxBytes:                {{.RxBytes}}
+RxPackets:              {{.RxPackets}}
+RxUcastPackets:         {{.RxUcastPackets}}
+RxMcastPackets:         {{.RxMcastPackets}}
+RxBcastPackets:         {{.RxBcastPackets}}
+RxErrorPackets:         {{.RxErrorPackets}}
+RxFcsErrorPackets:      {{.RxFcsErrorPackets}}
+RxUndersizePackets:     {{.RxUndersizePackets}}
+RxOversizePackets:      {{.RxOversizePackets}}
+TxBytes:                {{.TxBytes}}
+TxPackets:              {{.TxPackets}}
+TxUcastPackets:         {{.TxUcastPackets}}
+TxMcastPackets:         {{.TxMcastPackets}}
+TxBcastPackets:         {{.TxBcastPackets}}
+TxErrorPackets:         {{.TxErrorPackets}}
+TxUndersizePackets:     {{.TxUndersizePackets}}
+TxOversizePackets:      {{.TxOversizePackets}}`
+
 	DEFAULT_ONU_OMCI_TX_RX_STATS_FORMAT = `BaseTxArFrames:        {{.BaseTxArFrames}}
 BaseRxAkFrames:        {{.BaseRxAkFrames}}
 BaseTxNoArFrames:      {{.BaseTxNoArFrames}}
@@ -120,10 +163,28 @@
 ExtRxNoAkFrames:       {{.ExtRxNoAkFrames}}
 TxOmciCounterRetries:  {{.TxOmciCounterRetries}}
 TxOmciCounterTimeouts: {{.TxOmciCounterTimeouts}}`
-	DEFAULT_DEVICE_ALARMS_FORMAT       = "table{{ .ClassId }}\t{{.InstanceId}}\t{{.Name}}\t{{.Description}}"
-	DEFAULT_DEVICE_ALARMS_ORDER        = "ClassId,InstanceId"
-	DEFAULT_PON_RX_POWER_STATUS_FORMAT = "table{{.OnuSn}}\t{{.Status}}\t{{.FailReason}}\t{{.RxPower}}\t"
-	DEFAULT_ONU_DISTANCE_FORMAT        = `Distance`
+	DEFAULT_ONU_STATS_FROM_OLT_FORMAT = `AllocId:        {{.AllocId}}
+AllocRxBytes:   {{.AllocRxBytes}}
+{{range .GemPortStats}}
+-GemId:          {{.GemId}}
+ RxPackets:      {{.RxPackets}}
+ RxBytes:        {{.RxBytes}}
+ TxPackets:      {{.TxPackets}}
+ TxBytes:        {{.TxBytes}}{{end}}`
+
+	DEFAULT_ONU_DISTANCE_FORMAT          = `Distance`
+	DEFAULT_DEVICE_ALARMS_FORMAT         = "table{{ .ClassId }}\t{{.InstanceId}}\t{{.Name}}\t{{.Description}}"
+	DEFAULT_DEVICE_ALARMS_ORDER          = "ClassId,InstanceId"
+	DEFAULT_PON_RX_POWER_STATUS_FORMAT   = "table{{.OnuSn}}\t{{.Status}}\t{{.FailReason}}\t{{.RxPower}}\t"
+	DEFAULT_DEVICE_VALUE_GEM_PORT_FORMAT = `AllocId:                {{.AllocId}}
+ AllocRxBytes:           {{.AllocRxBytes}}
+ {{range .GemHistoryStats}}
+-GemId:                  {{.GemId}}
+ TransmittedGEMFrames:   {{.TransmittedGEMFrames}}
+ ReceivedGEMFrames:      {{.ReceivedGEMFrames}}
+ ReceivedPayloadBytes:   {{.ReceivedPayloadBytes}}
+ TransmittedPayloadBytes:{{.TransmittedPayloadBytes}}
+ EncryptionKeyErrors:    {{.EncryptionKeyErrors}}{{end}}`
 )
 
 type DeviceList struct {
@@ -454,6 +515,30 @@
 	} `positional-args:"yes"`
 }
 
+type GetPonPortStats struct {
+	ListOutputOptions
+	Reset bool `long:"reset" description:"Reset the counters"`
+	Args  struct {
+		Id        DeviceId `positional-arg-name:"DEVICE_ID" required:"yes"`
+		PortLabel string   `positional-arg-name:"PORT_LABEL" required:"yes"`
+	} `positional-args:"yes"`
+}
+
+type GetNniPortStats struct {
+	ListOutputOptions
+	Reset bool `long:"reset" description:"Reset the counters"`
+	Args  struct {
+		Id        DeviceId `positional-arg-name:"DEVICE_ID" required:"yes"`
+		PortLabel string   `positional-arg-name:"PORT_LABEL" required:"yes"`
+	} `positional-args:"yes"`
+}
+
+type GetOnuAllocGemStatsFromOlt struct {
+	ListOutputOptions
+	Args struct {
+		Id DeviceId `positional-arg-name:"DEVICE_ID" required:"yes"`
+	} `positional-args:"yes"`
+}
 type RxPower struct {
 	ListOutputOptions
 	Args struct {
@@ -486,6 +571,13 @@
 	} `positional-args:"yes"`
 }
 
+type GetOnuGEMStats struct {
+	ListOutputOptions
+	Args struct {
+		Id DeviceId `positional-arg-name:"DEVICE_ID" required:"yes"`
+	} `positional-args:"yes"`
+}
+
 type GetOnuDistance struct {
 	ListOutputOptions
 	Args struct {
@@ -560,6 +652,10 @@
 		PonRxPower              PonRxPower                            `command:"pon_rx_power"`
 		OnuDistance             GetOnuDistance                        `command:"onu_distance"`
 		OffloadAppStats         GetOffloadApp                         `command:"offload_app_stats"`
+		PonStats                GetPonPortStats                       `command:"itu_pon_stats"`
+		NniStats                GetNniPortStats                       `command:"nni_statistics"`
+		OnuGEMStats             GetOnuGEMStats                        `command:"onu_gem_stats"`
+		OnuAllocGemStats        GetOnuAllocGemStatsFromOlt            `command:"onu_alloc_gem_from_olt"`
 	} `command:"getextval"`
 	SetExtVal struct {
 		OffloadAppStatsSet SetOffloadApp `command:"set_offload_app"`
@@ -567,6 +663,38 @@
 	} `command:"setextval"`
 }
 
+type AllocGemStatsFromOlt struct {
+	AllocId      uint32
+	AllocRxBytes uint64
+	GemPortStats []GemPortStatsFromOlt
+}
+type GemPortStatsFromOlt struct {
+	GemId     uint32
+	RxPackets uint64
+	RxBytes   uint64
+	TxPackets uint64
+	TxBytes   uint64
+}
+type onugemstats struct {
+	AllocId         uint32
+	AllocRxBytes    uint32
+	GemHistoryStats []gemHistoryStats
+}
+type gemHistoryStats struct {
+	GemId                   uint32
+	TransmittedGEMFrames    uint32
+	ReceivedGEMFrames       uint32
+	ReceivedPayloadBytes    uint32
+	TransmittedPayloadBytes uint32
+	EncryptionKeyErrors     uint32
+}
+
+type PortStats struct {
+	PonPort uint32 // use this for PON
+	NniPort uint32 // use this for NNI
+	*common.PortStatistics
+}
+
 var deviceOpts = DeviceOpts{}
 
 func RegisterDeviceCommands(parser *flags.Parser) {
@@ -2349,6 +2477,104 @@
 	}
 }
 
+func (options *GetPonPortStats) Execute(args []string) error {
+	conn, err := NewConnection()
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+	client := extension.NewExtensionClient(conn)
+
+	singleGetValReq := extension.SingleGetValueRequest{
+		TargetId: string(options.Args.Id),
+		Request: &extension.GetValueRequest{
+			Request: &extension.GetValueRequest_OltPonStats{
+				OltPonStats: &extension.GetPonStatsRequest{
+					PortInfo: &extension.GetPonStatsRequest_PortLabel{
+						PortLabel: options.Args.PortLabel,
+					},
+				},
+			},
+		},
+	}
+	ctx, cancel := context.WithTimeout(context.Background(), GlobalConfig.Current().Grpc.Timeout)
+	defer cancel()
+	rv, err := client.GetExtValue(ctx, &singleGetValReq)
+	if err != nil {
+		Error.Printf("Error getting value on device Id %s,err=%s\n", options.Args.Id, ErrorToString(err))
+		return err
+	}
+
+	if rv.Response.Status != extension.GetValueResponse_OK {
+		return fmt.Errorf("failed to get pon port stats %v", rv.Response.ErrReason.String())
+	}
+	outputFormat := CharReplacer.Replace(options.Format)
+	if outputFormat == "" {
+		outputFormat = GetCommandOptionWithDefault("device-get-pon-stats", "format", DEFAULT_PON_PORT_STATS_FORMAT)
+	}
+	data := PortStats{
+		PonPort:        rv.GetResponse().GetOltPonStatsResponse().GetPonPort(),
+		PortStatistics: rv.GetResponse().GetOltPonStatsResponse().GetPortStatistics(),
+	}
+	result := CommandResult{
+		Format:    format.Format(outputFormat),
+		OutputAs:  toOutputType(options.OutputAs),
+		NameLimit: options.NameLimit,
+		Data:      data,
+	}
+	GenerateOutput(&result)
+	return nil
+}
+
+func (options *GetNniPortStats) Execute(args []string) error {
+	conn, err := NewConnection()
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+	client := extension.NewExtensionClient(conn)
+
+	singleGetValReq := extension.SingleGetValueRequest{
+		TargetId: string(options.Args.Id),
+		Request: &extension.GetValueRequest{
+			Request: &extension.GetValueRequest_OltNniStats{
+				OltNniStats: &extension.GetNNIStatsRequest{
+					PortInfo: &extension.GetNNIStatsRequest_PortLabel{
+						PortLabel: options.Args.PortLabel,
+					},
+				},
+			},
+		},
+	}
+	ctx, cancel := context.WithTimeout(context.Background(), GlobalConfig.Current().Grpc.Timeout)
+	defer cancel()
+	rv, err := client.GetExtValue(ctx, &singleGetValReq)
+	if err != nil {
+		Error.Printf("Error getting value on device Id %s,err=%s\n", options.Args.Id, ErrorToString(err))
+		return err
+	}
+
+	if rv.Response.Status != extension.GetValueResponse_OK {
+		return fmt.Errorf("failed to get nni port stats %v", rv.Response.ErrReason.String())
+	}
+	outputFormat := CharReplacer.Replace(options.Format)
+	if outputFormat == "" {
+		outputFormat = GetCommandOptionWithDefault("device-get-nni-stats", "format", DEFAULT_NNI_PORT_STATS_FORMAT)
+	}
+	data := PortStats{
+		NniPort:        rv.GetResponse().GetOltNniStatsResponse().GetNniPort(),
+		PortStatistics: rv.GetResponse().GetOltNniStatsResponse().GetPortStatistics(),
+	}
+	result := CommandResult{
+		Format:    format.Format(outputFormat),
+		OutputAs:  toOutputType(options.OutputAs),
+		NameLimit: options.NameLimit,
+		Data:      data,
+	}
+	GenerateOutput(&result)
+	return nil
+}
+
 func (options *GetOnuEthernetFrameExtendedPmCounters) Execute(args []string) error {
 	conn, err := NewConnection()
 	if err != nil {
@@ -2789,3 +3015,123 @@
 	GenerateOutput(&result)
 	return nil
 }
+
+func (options *GetOnuGEMStats) Execute(args []string) error {
+
+	conn, err := NewConnection()
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+	client := extension.NewExtensionClient(conn)
+	singleGetValReq := extension.SingleGetValueRequest{
+		TargetId: string(options.Args.Id),
+		Request: &extension.GetValueRequest{
+			Request: &extension.GetValueRequest_OnuAllocGemStats{
+				OnuAllocGemStats: &extension.GetOnuAllocGemHistoryRequest{},
+			},
+		},
+	}
+
+	ctx, cancel := context.WithTimeout(context.Background(), GlobalConfig.Current().Grpc.Timeout)
+	defer cancel()
+
+	rv, err := client.GetExtValue(ctx, &singleGetValReq)
+
+	if err != nil {
+		Error.Printf("Error getting value on device Id %s,err=%s\n", options.Args.Id, ErrorToString(err))
+		return err
+	}
+
+	if rv.Response.Status != extension.GetValueResponse_OK {
+		return fmt.Errorf("failed to get gem port response %v", rv.Response.ErrReason.String())
+	}
+	outputFormat := CharReplacer.Replace(options.Format)
+	if outputFormat == "" {
+		outputFormat = GetCommandOptionWithDefault("device-get-gem-port", "format", DEFAULT_DEVICE_VALUE_GEM_PORT_FORMAT)
+	}
+	onugemhistoryresponse := rv.GetResponse().GetOnuAllocGemStatsResponse()
+	for _, OnuallocGemHistoryData := range onugemhistoryresponse.OnuAllocGemHistoryData {
+		data := onugemstats{}
+		data.AllocId = OnuallocGemHistoryData.OnuAllocIdInfo.AllocId
+		data.AllocRxBytes = OnuallocGemHistoryData.OnuAllocIdInfo.RxBytes
+		for _, gemStatsInfo := range OnuallocGemHistoryData.GemPortInfo {
+			data.GemHistoryStats = append(data.GemHistoryStats, gemHistoryStats{
+				GemId:                   gemStatsInfo.GemId,
+				TransmittedGEMFrames:    gemStatsInfo.TransmittedGEMFrames,
+				ReceivedGEMFrames:       gemStatsInfo.ReceivedGEMFrames,
+				ReceivedPayloadBytes:    gemStatsInfo.ReceivedPayloadBytes,
+				TransmittedPayloadBytes: gemStatsInfo.TransmittedPayloadBytes,
+				EncryptionKeyErrors:     gemStatsInfo.EncryptionKeyErrors,
+			})
+		}
+		result := CommandResult{
+			Format:    format.Format(outputFormat),
+			OutputAs:  toOutputType(options.OutputAs),
+			NameLimit: options.NameLimit,
+			Data:      &data,
+		}
+		GenerateOutput(&result)
+	}
+	return nil
+
+}
+
+func (options *GetOnuAllocGemStatsFromOlt) Execute(args []string) error {
+	conn, err := NewConnection()
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+	client := extension.NewExtensionClient(conn)
+
+	singleGetValReq := extension.SingleGetValueRequest{
+		TargetId: string(options.Args.Id),
+		Request: &extension.GetValueRequest{
+			Request: &extension.GetValueRequest_OnuStatsFromOlt{
+				OnuStatsFromOlt: &extension.GetOnuStatsFromOltRequest{},
+			},
+		},
+	}
+	ctx, cancel := context.WithTimeout(context.Background(), GlobalConfig.Current().Grpc.Timeout)
+	defer cancel()
+	rv, err := client.GetExtValue(ctx, &singleGetValReq)
+	if err != nil {
+		Error.Printf("Error getting value on device Id %s,err=%s\n", options.Args.Id, ErrorToString(err))
+		return err
+	}
+
+	if rv.Response.Status != extension.GetValueResponse_OK {
+		return fmt.Errorf("failed to get onu alloc gem stats from olt %v", rv.Response.ErrReason.String())
+	}
+	outputFormat := CharReplacer.Replace(options.Format)
+	if outputFormat == "" {
+		outputFormat = GetCommandOptionWithDefault("device-get-onu-status", "format", DEFAULT_ONU_STATS_FROM_OLT_FORMAT)
+	}
+
+	onuAllocGemStatsResponse := rv.GetResponse().GetOnuStatsFromOltResponse()
+
+	for _, allocGemStatsInfo := range onuAllocGemStatsResponse.AllocGemStatsInfo {
+		data := AllocGemStatsFromOlt{}
+		data.AllocId = allocGemStatsInfo.AllocIdInfo.AllocId
+		data.AllocRxBytes = allocGemStatsInfo.AllocIdInfo.RxBytes
+		for _, gemStatsInfo := range allocGemStatsInfo.GemPortInfo {
+			data.GemPortStats = append(data.GemPortStats, GemPortStatsFromOlt{
+				GemId:     gemStatsInfo.GemId,
+				RxBytes:   gemStatsInfo.RxBytes,
+				RxPackets: gemStatsInfo.RxPackets,
+				TxBytes:   gemStatsInfo.TxBytes,
+				TxPackets: gemStatsInfo.TxPackets,
+			})
+		}
+		result := CommandResult{
+			Format:    format.Format(outputFormat),
+			OutputAs:  toOutputType(options.OutputAs),
+			NameLimit: options.NameLimit,
+			Data:      &data,
+		}
+		GenerateOutput(&result)
+	}
+
+	return nil
+}
