diff --git a/internal/bbsimctl/commands/onu.go b/internal/bbsimctl/commands/onu.go
index 2e8f887..f99cb5c 100644
--- a/internal/bbsimctl/commands/onu.go
+++ b/internal/bbsimctl/commands/onu.go
@@ -19,6 +19,7 @@
 
 import (
 	"context"
+	"fmt"
 	"github.com/jessevdk/go-flags"
 	pb "github.com/opencord/bbsim/api/bbsim"
 	"github.com/opencord/bbsim/internal/bbsimctl/config"
@@ -26,33 +27,57 @@
 	log "github.com/sirupsen/logrus"
 	"google.golang.org/grpc"
 	"os"
+	"strings"
 )
 
 const (
 	DEFAULT_ONU_DEVICE_HEADER_FORMAT = "table{{ .PonPortID }}\t{{ .ID }}\t{{ .SerialNumber }}\t{{ .STag }}\t{{ .CTag }}\t{{ .OperState }}\t{{ .InternalState }}"
 )
 
-type ONUOptions struct{}
-
-func RegisterONUCommands(parser *flags.Parser) {
-	parser.AddCommand("onus", "List ONU Devices", "Commands to list the ONU devices and their internal state", &ONUOptions{})
+type OnuSnString string
+type ONUList struct{}
+type ONUShutDown struct {
+	Args struct {
+		OnuSn OnuSnString
+	} `positional-args:"yes" required:"yes"`
 }
 
-func getONUs() *pb.ONUs {
+type ONUPowerOn struct {
+	Args struct {
+		OnuSn OnuSnString
+	} `positional-args:"yes" required:"yes"`
+}
+
+type ONUOptions struct {
+	List     ONUList     `command:"list"`
+	ShutDown ONUShutDown `command:"shutdown"`
+	PowerOn  ONUPowerOn  `command:"poweron"`
+}
+
+func RegisterONUCommands(parser *flags.Parser) {
+	parser.AddCommand("onu", "ONU Commands", "Commands to query and manipulate ONU devices", &ONUOptions{})
+}
+
+func connect() (pb.BBSimClient, *grpc.ClientConn) {
 	conn, err := grpc.Dial(config.GlobalConfig.Server, grpc.WithInsecure())
 
 	if err != nil {
 		log.Fatalf("did not connect: %v", err)
-		return nil
+		return nil, conn
 	}
+	return pb.NewBBSimClient(conn), conn
+}
+
+func getONUs() *pb.ONUs {
+
+	client, conn := connect()
 	defer conn.Close()
-	c := pb.NewBBSimClient(conn)
 
 	// Contact the server and print out its response.
-
 	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
 	defer cancel()
-	onus, err := c.GetONUs(ctx, &pb.Empty{})
+
+	onus, err := client.GetONUs(ctx, &pb.Empty{})
 	if err != nil {
 		log.Fatalf("could not get OLT: %v", err)
 		return nil
@@ -60,7 +85,7 @@
 	return onus
 }
 
-func (options *ONUOptions) Execute(args []string) error {
+func (options *ONUList) Execute(args []string) error {
 	onus := getONUs()
 
 	// print out
@@ -71,3 +96,69 @@
 
 	return nil
 }
+
+func (options *ONUShutDown) Execute(args []string) error {
+
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+	req := pb.ONURequest{
+		SerialNumber: string(options.Args.OnuSn),
+	}
+	res, err := client.ShutdownONU(ctx, &req)
+
+	if err != nil {
+		log.Fatalf("Cannot not shutdown ONU %s: %v", options.Args.OnuSn, err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+
+	return nil
+}
+
+func (options *ONUPowerOn) Execute(args []string) error {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+	req := pb.ONURequest{
+		SerialNumber: string(options.Args.OnuSn),
+	}
+	res, err := client.PoweronONU(ctx, &req)
+
+	if err != nil {
+		log.Fatalf("Cannot not power on ONU %s: %v", options.Args.OnuSn, err)
+		return err
+	}
+
+	fmt.Println(fmt.Sprintf("[Status: %d] %s", res.StatusCode, res.Message))
+
+	return nil
+}
+
+func (onuSn *OnuSnString) Complete(match string) []flags.Completion {
+	client, conn := connect()
+	defer conn.Close()
+
+	ctx, cancel := context.WithTimeout(context.Background(), config.GlobalConfig.Grpc.Timeout)
+	defer cancel()
+
+	onus, err := client.GetONUs(ctx, &pb.Empty{})
+	if err != nil {
+		log.Fatal("could not get ONUs: %v", err)
+		return nil
+	}
+
+	list := make([]flags.Completion, 0)
+	for _, k := range onus.Items {
+		if strings.HasPrefix(k.SerialNumber, match) {
+			list = append(list, flags.Completion{Item: k.SerialNumber})
+		}
+	}
+
+	return list
+}
