diff --git a/internal/bbsimctl/commands/olt.go b/internal/bbsimctl/commands/olt.go
index 9ff6a30..d77cf77 100644
--- a/internal/bbsimctl/commands/olt.go
+++ b/internal/bbsimctl/commands/olt.go
@@ -47,12 +47,13 @@
 type OltReboot struct{}
 
 type oltOptions struct {
-	Get      OltGet      `command:"get"`
-	NNI      OltNNIs     `command:"nnis"`
-	PON      OltPONs     `command:"pons"`
-	Shutdown OltShutdown `command:"shutdown"`
-	Poweron  OltPoweron  `command:"poweron"`
-	Reboot   OltReboot   `command:"reboot"`
+	Get      OltGet          `command:"get"`
+	NNI      OltNNIs         `command:"nnis"`
+	PON      OltPONs         `command:"pons"`
+	Shutdown OltShutdown     `command:"shutdown"`
+	Poweron  OltPoweron      `command:"poweron"`
+	Reboot   OltReboot       `command:"reboot"`
+	Alarms   OltAlarmOptions `command:"alarms"`
 }
 
 func RegisterOltCommands(parser *flags.Parser) {
diff --git a/internal/bbsimctl/commands/oltalarms.go b/internal/bbsimctl/commands/oltalarms.go
new file mode 100755
index 0000000..645aade
--- /dev/null
+++ b/internal/bbsimctl/commands/oltalarms.go
@@ -0,0 +1,145 @@
+/*
+ * Portions copyright 2019-present Open Networking Foundation
+ * Original copyright 2019-present Ciena Corporation
+ *
+ * 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 commands
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"strings"
+
+	"github.com/jessevdk/go-flags"
+	"github.com/olekukonko/tablewriter"
+	pb "github.com/opencord/bbsim/api/bbsim"
+	"github.com/opencord/bbsim/internal/bbsim/alarmsim"
+	"github.com/opencord/bbsim/internal/bbsimctl/config"
+	log "github.com/sirupsen/logrus"
+)
+
+const (
+	DEFAULT_OLT_ALARM_LIST_FORMAT = "table{{ .Name }}"
+)
+
+type OltInterfaceStatus string
+
+type OltInterfaceID uint32
+
+type OltAlarmNameString string
+
+type OltAlarmListOutput struct {
+	Name string
+}
+
+type OltAlarmRaise struct {
+	Args struct {
+		Name   OltAlarmNameString
+		IntfID OltInterfaceID
+	} `positional-args:"yes" required:"yes"`
+}
+
+type OltAlarmClear struct {
+	Args struct {
+		Name   OltAlarmNameString
+		IntfID OltInterfaceID
+	} `positional-args:"yes" required:"yes"`
+}
+
+type OltAlarmList struct{}
+
+type OltAlarmOptions struct {
+	Raise OltAlarmRaise `command:"raise"`
+	Clear OltAlarmClear `command:"clear"`
+	List  OltAlarmList  `command:"list"`
+}
+
+// Execute alarm raise
+func (o *OltAlarmRaise) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	req := pb.OLTAlarmRequest{InterfaceType: string(o.Args.Name),
+		InterfaceID: uint32(o.Args.IntfID),
+		Status:      "on"}
+
+	res, err := client.SetOltAlarmIndication(ctx, &req)
+	if err != nil {
+		log.Fatalf("Cannot raise OLT alarm: %v", err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+	return nil
+}
+
+// Execute alarm clear
+func (o *OltAlarmClear) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	req := pb.OLTAlarmRequest{InterfaceType: string(o.Args.Name),
+		InterfaceID: uint32(o.Args.IntfID),
+		Status:      "off"}
+
+	res, err := client.SetOltAlarmIndication(ctx, &req)
+
+	if err != nil {
+		log.Fatalf("Cannot clear OLT alarm: %v", err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+	return nil
+}
+
+// Execute OLT alarm list
+func (o *OltAlarmList) Execute(args []string) error {
+	OltAlarmsValue := [][]string{}
+	OltAlarmstable := tablewriter.NewWriter(os.Stdout)
+	fmt.Fprintf(os.Stdout, "OLT Alarms List:\n")
+	OltAlarmstable.SetHeader([]string{"OLT Alarms"})
+
+	alarmNames := make([]AlarmListOutput, len(alarmsim.OltAlarmNameMap))
+	i := 0
+	for k := range alarmsim.OltAlarmNameMap {
+		alarmNames[i] = AlarmListOutput{Name: k}
+		OltAlarmsValue = append(OltAlarmsValue, []string{k})
+		i++
+	}
+	for _, v := range OltAlarmsValue {
+		OltAlarmstable.Append(v)
+	}
+	OltAlarmstable.Render()
+	return nil
+}
+
+func (o *OltAlarmNameString) Complete(match string) []flags.Completion {
+	list := make([]flags.Completion, 0)
+	for k := range alarmsim.OltAlarmNameMap {
+		if strings.HasPrefix(k, match) {
+			list = append(list, flags.Completion{Item: k})
+		}
+	}
+
+	return list
+}
diff --git a/internal/bbsimctl/commands/onu.go b/internal/bbsimctl/commands/onu.go
index 9e41990..2815501 100644
--- a/internal/bbsimctl/commands/onu.go
+++ b/internal/bbsimctl/commands/onu.go
@@ -92,6 +92,7 @@
 	RestartDchp       ONUDhcpRestart       `command:"dhcp_restart"`
 	Igmp              ONUIgmp              `command:"igmp"`
 	TrafficSchedulers ONUTrafficSchedulers `command:"traffic_schedulers"`
+	Alarms            AlarmOptions         `command:"alarms"`
 }
 
 type ONUTrafficSchedulers struct {
diff --git a/internal/bbsimctl/commands/alarms.go b/internal/bbsimctl/commands/onualarms.go
similarity index 78%
rename from internal/bbsimctl/commands/alarms.go
rename to internal/bbsimctl/commands/onualarms.go
index 044d74a..dcf53a3 100755
--- a/internal/bbsimctl/commands/alarms.go
+++ b/internal/bbsimctl/commands/onualarms.go
@@ -20,18 +20,15 @@
 import (
 	"context"
 	"fmt"
+	"os"
+	"strings"
+
 	"github.com/jessevdk/go-flags"
+	"github.com/olekukonko/tablewriter"
 	pb "github.com/opencord/bbsim/api/bbsim"
 	"github.com/opencord/bbsim/internal/bbsim/alarmsim"
 	"github.com/opencord/bbsim/internal/bbsimctl/config"
-	"github.com/opencord/cordctl/pkg/format"
 	log "github.com/sirupsen/logrus"
-	"os"
-	"strings"
-)
-
-const (
-	DEFAULT_ALARM_LIST_FORMAT = "table{{ .Name }}"
 )
 
 type AlarmNameString string
@@ -64,8 +61,8 @@
 	List  AlarmList  `command:"list"`
 }
 
-// add optional parameters from the command-line to the AlarmRequest
-func addParameters(parameters []string, req *pb.AlarmRequest) error {
+// add optional parameters from the command-line to the ONUAlarmRequest
+func addParameters(parameters []string, req *pb.ONUAlarmRequest) error {
 	req.Parameters = make([]*pb.AlarmParameter, len(parameters))
 	for i, kv := range parameters {
 		parts := strings.Split(kv, "=")
@@ -77,10 +74,6 @@
 	return nil
 }
 
-func RegisterAlarmCommands(parser *flags.Parser) {
-	parser.AddCommand("alarm", "Alarm Commands", "Commands to raise and clear alarms", &AlarmOptions{})
-}
-
 // Execute alarm raise
 func (o *AlarmRaise) Execute(args []string) error {
 	client, conn := connect()
@@ -89,7 +82,7 @@
 	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
 	defer cancel()
 
-	req := pb.AlarmRequest{AlarmType: string(o.Args.Name),
+	req := pb.ONUAlarmRequest{AlarmType: string(o.Args.Name),
 		SerialNumber: string(o.Args.SerialNumber),
 		Status:       "on"}
 
@@ -98,7 +91,7 @@
 		return err
 	}
 
-	res, err := client.SetAlarmIndication(ctx, &req)
+	res, err := client.SetOnuAlarmIndication(ctx, &req)
 	if err != nil {
 		log.Fatalf("Cannot raise alarm: %v", err)
 		return err
@@ -116,7 +109,7 @@
 	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
 	defer cancel()
 
-	req := pb.AlarmRequest{AlarmType: string(o.Args.Name),
+	req := pb.ONUAlarmRequest{AlarmType: string(o.Args.Name),
 		SerialNumber: string(o.Args.SerialNumber),
 		Status:       "off"}
 
@@ -125,7 +118,7 @@
 		return err
 	}
 
-	res, err := client.SetAlarmIndication(ctx, &req)
+	res, err := client.SetOnuAlarmIndication(ctx, &req)
 
 	if err != nil {
 		log.Fatalf("Cannot clear alarm: %v", err)
@@ -136,23 +129,30 @@
 	return nil
 }
 
-// Execute alarm list
+// Execute OLT alarm list
 func (o *AlarmList) Execute(args []string) error {
-	alarmNames := make([]AlarmListOutput, len(alarmsim.AlarmNameMap))
+	OnuAlarmsValue := [][]string{}
+	OnuAlarmstable := tablewriter.NewWriter(os.Stdout)
+	fmt.Fprintf(os.Stdout, "ONU Alarms List:\n")
+	OnuAlarmstable.SetHeader([]string{"ONU Alarms"})
+
+	alarmNames := make([]AlarmListOutput, len(alarmsim.OnuAlarmNameMap))
 	i := 0
-	for k := range alarmsim.AlarmNameMap {
+	for k := range alarmsim.OnuAlarmNameMap {
 		alarmNames[i] = AlarmListOutput{Name: k}
+		OnuAlarmsValue = append(OnuAlarmsValue, []string{k})
 		i++
 	}
-	// print out
-	tableFormat := format.Format(DEFAULT_ALARM_LIST_FORMAT)
-	tableFormat.Execute(os.Stdout, true, alarmNames)
+	for _, v := range OnuAlarmsValue {
+		OnuAlarmstable.Append(v)
+	}
+	OnuAlarmstable.Render()
 	return nil
 }
 
 func (onuSn *AlarmNameString) Complete(match string) []flags.Completion {
 	list := make([]flags.Completion, 0)
-	for k := range alarmsim.AlarmNameMap {
+	for k := range alarmsim.OnuAlarmNameMap {
 		if strings.HasPrefix(k, match) {
 			list = append(list, flags.Completion{Item: k})
 		}
