diff --git a/api/legacy/bbsim.pb.go b/api/legacy/bbsim.pb.go
new file mode 100644
index 0000000..060760b
--- /dev/null
+++ b/api/legacy/bbsim.pb.go
@@ -0,0 +1,1291 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: api/legacy/bbsim.proto
+
+package legacy
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
+	openolt "github.com/opencord/voltha-protos/v2/go/openolt"
+	tech_profile "github.com/opencord/voltha-protos/v2/go/tech_profile"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// OLT information
+//
+// Deprecated: Do not use.
+type OLTInfo struct {
+	OltId                int64    `protobuf:"varint,1,opt,name=olt_id,json=oltId,proto3" json:"olt_id,omitempty"`
+	OltSerial            string   `protobuf:"bytes,2,opt,name=olt_serial,json=oltSerial,proto3" json:"olt_serial,omitempty"`
+	OltIp                string   `protobuf:"bytes,3,opt,name=olt_ip,json=oltIp,proto3" json:"olt_ip,omitempty"`
+	OltState             string   `protobuf:"bytes,4,opt,name=olt_state,json=oltState,proto3" json:"olt_state,omitempty"`
+	OltVendor            string   `protobuf:"bytes,5,opt,name=olt_vendor,json=oltVendor,proto3" json:"olt_vendor,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OLTInfo) Reset()         { *m = OLTInfo{} }
+func (m *OLTInfo) String() string { return proto.CompactTextString(m) }
+func (*OLTInfo) ProtoMessage()    {}
+func (*OLTInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{0}
+}
+
+func (m *OLTInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OLTInfo.Unmarshal(m, b)
+}
+func (m *OLTInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OLTInfo.Marshal(b, m, deterministic)
+}
+func (m *OLTInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OLTInfo.Merge(m, src)
+}
+func (m *OLTInfo) XXX_Size() int {
+	return xxx_messageInfo_OLTInfo.Size(m)
+}
+func (m *OLTInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_OLTInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OLTInfo proto.InternalMessageInfo
+
+func (m *OLTInfo) GetOltId() int64 {
+	if m != nil {
+		return m.OltId
+	}
+	return 0
+}
+
+func (m *OLTInfo) GetOltSerial() string {
+	if m != nil {
+		return m.OltSerial
+	}
+	return ""
+}
+
+func (m *OLTInfo) GetOltIp() string {
+	if m != nil {
+		return m.OltIp
+	}
+	return ""
+}
+
+func (m *OLTInfo) GetOltState() string {
+	if m != nil {
+		return m.OltState
+	}
+	return ""
+}
+
+func (m *OLTInfo) GetOltVendor() string {
+	if m != nil {
+		return m.OltVendor
+	}
+	return ""
+}
+
+// ONU information
+type ONUInfo struct {
+	OnuId     uint32 `protobuf:"varint,1,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	PonPortId uint32 `protobuf:"varint,2,opt,name=pon_port_id,json=ponPortId,proto3" json:"pon_port_id,omitempty"`
+	// ONU serial number
+	OnuSerial string `protobuf:"bytes,3,opt,name=onu_serial,json=onuSerial,proto3" json:"onu_serial,omitempty"`
+	// ONU oper state
+	OperState string `protobuf:"bytes,4,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
+	// ONU internal state
+	OnuState             string   `protobuf:"bytes,5,opt,name=onu_state,json=onuState,proto3" json:"onu_state,omitempty"`
+	Gemports             []uint32 `protobuf:"varint,6,rep,packed,name=gemports,proto3" json:"gemports,omitempty"`
+	Tconts               *Tconts  `protobuf:"bytes,7,opt,name=tconts,proto3" json:"tconts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ONUInfo) Reset()         { *m = ONUInfo{} }
+func (m *ONUInfo) String() string { return proto.CompactTextString(m) }
+func (*ONUInfo) ProtoMessage()    {}
+func (*ONUInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{1}
+}
+
+func (m *ONUInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ONUInfo.Unmarshal(m, b)
+}
+func (m *ONUInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ONUInfo.Marshal(b, m, deterministic)
+}
+func (m *ONUInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ONUInfo.Merge(m, src)
+}
+func (m *ONUInfo) XXX_Size() int {
+	return xxx_messageInfo_ONUInfo.Size(m)
+}
+func (m *ONUInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ONUInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ONUInfo proto.InternalMessageInfo
+
+func (m *ONUInfo) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *ONUInfo) GetPonPortId() uint32 {
+	if m != nil {
+		return m.PonPortId
+	}
+	return 0
+}
+
+func (m *ONUInfo) GetOnuSerial() string {
+	if m != nil {
+		return m.OnuSerial
+	}
+	return ""
+}
+
+func (m *ONUInfo) GetOperState() string {
+	if m != nil {
+		return m.OperState
+	}
+	return ""
+}
+
+func (m *ONUInfo) GetOnuState() string {
+	if m != nil {
+		return m.OnuState
+	}
+	return ""
+}
+
+func (m *ONUInfo) GetGemports() []uint32 {
+	if m != nil {
+		return m.Gemports
+	}
+	return nil
+}
+
+func (m *ONUInfo) GetTconts() *Tconts {
+	if m != nil {
+		return m.Tconts
+	}
+	return nil
+}
+
+// Bulk ONU operations
+type ONUs struct {
+	Onus                 []*ONUInfo `protobuf:"bytes,1,rep,name=onus,proto3" json:"onus,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *ONUs) Reset()         { *m = ONUs{} }
+func (m *ONUs) String() string { return proto.CompactTextString(m) }
+func (*ONUs) ProtoMessage()    {}
+func (*ONUs) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{2}
+}
+
+func (m *ONUs) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ONUs.Unmarshal(m, b)
+}
+func (m *ONUs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ONUs.Marshal(b, m, deterministic)
+}
+func (m *ONUs) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ONUs.Merge(m, src)
+}
+func (m *ONUs) XXX_Size() int {
+	return xxx_messageInfo_ONUs.Size(m)
+}
+func (m *ONUs) XXX_DiscardUnknown() {
+	xxx_messageInfo_ONUs.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ONUs proto.InternalMessageInfo
+
+func (m *ONUs) GetOnus() []*ONUInfo {
+	if m != nil {
+		return m.Onus
+	}
+	return nil
+}
+
+type ONURequest struct {
+	Onu                  *ONUInfo `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
+	OnusBatch            *ONUs    `protobuf:"bytes,2,opt,name=onus_batch,json=onusBatch,proto3" json:"onus_batch,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ONURequest) Reset()         { *m = ONURequest{} }
+func (m *ONURequest) String() string { return proto.CompactTextString(m) }
+func (*ONURequest) ProtoMessage()    {}
+func (*ONURequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{3}
+}
+
+func (m *ONURequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ONURequest.Unmarshal(m, b)
+}
+func (m *ONURequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ONURequest.Marshal(b, m, deterministic)
+}
+func (m *ONURequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ONURequest.Merge(m, src)
+}
+func (m *ONURequest) XXX_Size() int {
+	return xxx_messageInfo_ONURequest.Size(m)
+}
+func (m *ONURequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ONURequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ONURequest proto.InternalMessageInfo
+
+func (m *ONURequest) GetOnu() *ONUInfo {
+	if m != nil {
+		return m.Onu
+	}
+	return nil
+}
+
+func (m *ONURequest) GetOnusBatch() *ONUs {
+	if m != nil {
+		return m.OnusBatch
+	}
+	return nil
+}
+
+// Port information
+type PortInfo struct {
+	PortType             string   `protobuf:"bytes,1,opt,name=port_type,json=portType,proto3" json:"port_type,omitempty"`
+	PortId               uint32   `protobuf:"varint,2,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"`
+	PonPortMaxOnus       uint32   `protobuf:"varint,3,opt,name=pon_port_max_onus,json=ponPortMaxOnus,proto3" json:"pon_port_max_onus,omitempty"`
+	PonPortActiveOnus    uint32   `protobuf:"varint,4,opt,name=pon_port_active_onus,json=ponPortActiveOnus,proto3" json:"pon_port_active_onus,omitempty"`
+	PortState            string   `protobuf:"bytes,5,opt,name=port_state,json=portState,proto3" json:"port_state,omitempty"`
+	AlarmState           string   `protobuf:"bytes,6,opt,name=alarm_state,json=alarmState,proto3" json:"alarm_state,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PortInfo) Reset()         { *m = PortInfo{} }
+func (m *PortInfo) String() string { return proto.CompactTextString(m) }
+func (*PortInfo) ProtoMessage()    {}
+func (*PortInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{4}
+}
+
+func (m *PortInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PortInfo.Unmarshal(m, b)
+}
+func (m *PortInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PortInfo.Marshal(b, m, deterministic)
+}
+func (m *PortInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PortInfo.Merge(m, src)
+}
+func (m *PortInfo) XXX_Size() int {
+	return xxx_messageInfo_PortInfo.Size(m)
+}
+func (m *PortInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_PortInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PortInfo proto.InternalMessageInfo
+
+func (m *PortInfo) GetPortType() string {
+	if m != nil {
+		return m.PortType
+	}
+	return ""
+}
+
+func (m *PortInfo) GetPortId() uint32 {
+	if m != nil {
+		return m.PortId
+	}
+	return 0
+}
+
+func (m *PortInfo) GetPonPortMaxOnus() uint32 {
+	if m != nil {
+		return m.PonPortMaxOnus
+	}
+	return 0
+}
+
+func (m *PortInfo) GetPonPortActiveOnus() uint32 {
+	if m != nil {
+		return m.PonPortActiveOnus
+	}
+	return 0
+}
+
+func (m *PortInfo) GetPortState() string {
+	if m != nil {
+		return m.PortState
+	}
+	return ""
+}
+
+func (m *PortInfo) GetAlarmState() string {
+	if m != nil {
+		return m.AlarmState
+	}
+	return ""
+}
+
+// Bulk port information
+type Ports struct {
+	Ports                []*PortInfo `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *Ports) Reset()         { *m = Ports{} }
+func (m *Ports) String() string { return proto.CompactTextString(m) }
+func (*Ports) ProtoMessage()    {}
+func (*Ports) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{5}
+}
+
+func (m *Ports) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Ports.Unmarshal(m, b)
+}
+func (m *Ports) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Ports.Marshal(b, m, deterministic)
+}
+func (m *Ports) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Ports.Merge(m, src)
+}
+func (m *Ports) XXX_Size() int {
+	return xxx_messageInfo_Ports.Size(m)
+}
+func (m *Ports) XXX_DiscardUnknown() {
+	xxx_messageInfo_Ports.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Ports proto.InternalMessageInfo
+
+func (m *Ports) GetPorts() []*PortInfo {
+	if m != nil {
+		return m.Ports
+	}
+	return nil
+}
+
+// BBSim status
+type OLTStatusResponse struct {
+	Olt                  *OLTInfo    `protobuf:"bytes,1,opt,name=olt,proto3" json:"olt,omitempty"`
+	Ports                []*PortInfo `protobuf:"bytes,2,rep,name=ports,proto3" json:"ports,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *OLTStatusResponse) Reset()         { *m = OLTStatusResponse{} }
+func (m *OLTStatusResponse) String() string { return proto.CompactTextString(m) }
+func (*OLTStatusResponse) ProtoMessage()    {}
+func (*OLTStatusResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{6}
+}
+
+func (m *OLTStatusResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OLTStatusResponse.Unmarshal(m, b)
+}
+func (m *OLTStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OLTStatusResponse.Marshal(b, m, deterministic)
+}
+func (m *OLTStatusResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OLTStatusResponse.Merge(m, src)
+}
+func (m *OLTStatusResponse) XXX_Size() int {
+	return xxx_messageInfo_OLTStatusResponse.Size(m)
+}
+func (m *OLTStatusResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_OLTStatusResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OLTStatusResponse proto.InternalMessageInfo
+
+func (m *OLTStatusResponse) GetOlt() *OLTInfo {
+	if m != nil {
+		return m.Olt
+	}
+	return nil
+}
+
+func (m *OLTStatusResponse) GetPorts() []*PortInfo {
+	if m != nil {
+		return m.Ports
+	}
+	return nil
+}
+
+// BBSim response message
+type BBSimResponse struct {
+	StatusMsg            string   `protobuf:"bytes,1,opt,name=status_msg,json=statusMsg,proto3" json:"status_msg,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BBSimResponse) Reset()         { *m = BBSimResponse{} }
+func (m *BBSimResponse) String() string { return proto.CompactTextString(m) }
+func (*BBSimResponse) ProtoMessage()    {}
+func (*BBSimResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{7}
+}
+
+func (m *BBSimResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BBSimResponse.Unmarshal(m, b)
+}
+func (m *BBSimResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BBSimResponse.Marshal(b, m, deterministic)
+}
+func (m *BBSimResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BBSimResponse.Merge(m, src)
+}
+func (m *BBSimResponse) XXX_Size() int {
+	return xxx_messageInfo_BBSimResponse.Size(m)
+}
+func (m *BBSimResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_BBSimResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BBSimResponse proto.InternalMessageInfo
+
+func (m *BBSimResponse) GetStatusMsg() string {
+	if m != nil {
+		return m.StatusMsg
+	}
+	return ""
+}
+
+// ONU alarm request
+type ONUAlarmRequest struct {
+	// ONU serial number
+	OnuSerial string `protobuf:"bytes,1,opt,name=onu_serial,json=onuSerial,proto3" json:"onu_serial,omitempty"`
+	// Alarm types are:
+	//   "signaldegrade"
+	//   "lossofomcichannel"
+	//   "lossofploam"
+	AlarmType string `protobuf:"bytes,2,opt,name=alarm_type,json=alarmType,proto3" json:"alarm_type,omitempty"`
+	// "on"/"off" indicates raised or cleared alarm
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ONUAlarmRequest) Reset()         { *m = ONUAlarmRequest{} }
+func (m *ONUAlarmRequest) String() string { return proto.CompactTextString(m) }
+func (*ONUAlarmRequest) ProtoMessage()    {}
+func (*ONUAlarmRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{8}
+}
+
+func (m *ONUAlarmRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ONUAlarmRequest.Unmarshal(m, b)
+}
+func (m *ONUAlarmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ONUAlarmRequest.Marshal(b, m, deterministic)
+}
+func (m *ONUAlarmRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ONUAlarmRequest.Merge(m, src)
+}
+func (m *ONUAlarmRequest) XXX_Size() int {
+	return xxx_messageInfo_ONUAlarmRequest.Size(m)
+}
+func (m *ONUAlarmRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ONUAlarmRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ONUAlarmRequest proto.InternalMessageInfo
+
+func (m *ONUAlarmRequest) GetOnuSerial() string {
+	if m != nil {
+		return m.OnuSerial
+	}
+	return ""
+}
+
+func (m *ONUAlarmRequest) GetAlarmType() string {
+	if m != nil {
+		return m.AlarmType
+	}
+	return ""
+}
+
+func (m *ONUAlarmRequest) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
+// OLT alarm request
+type OLTAlarmRequest struct {
+	PortId               uint32   `protobuf:"varint,1,opt,name=port_id,json=portId,proto3" json:"port_id,omitempty"`
+	PortType             string   `protobuf:"bytes,2,opt,name=port_type,json=portType,proto3" json:"port_type,omitempty"`
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OLTAlarmRequest) Reset()         { *m = OLTAlarmRequest{} }
+func (m *OLTAlarmRequest) String() string { return proto.CompactTextString(m) }
+func (*OLTAlarmRequest) ProtoMessage()    {}
+func (*OLTAlarmRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{9}
+}
+
+func (m *OLTAlarmRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OLTAlarmRequest.Unmarshal(m, b)
+}
+func (m *OLTAlarmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OLTAlarmRequest.Marshal(b, m, deterministic)
+}
+func (m *OLTAlarmRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OLTAlarmRequest.Merge(m, src)
+}
+func (m *OLTAlarmRequest) XXX_Size() int {
+	return xxx_messageInfo_OLTAlarmRequest.Size(m)
+}
+func (m *OLTAlarmRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_OLTAlarmRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OLTAlarmRequest proto.InternalMessageInfo
+
+func (m *OLTAlarmRequest) GetPortId() uint32 {
+	if m != nil {
+		return m.PortId
+	}
+	return 0
+}
+
+func (m *OLTAlarmRequest) GetPortType() string {
+	if m != nil {
+		return m.PortType
+	}
+	return ""
+}
+
+func (m *OLTAlarmRequest) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
+// Device action
+type DeviceAction struct {
+	DeviceType           string   `protobuf:"bytes,1,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
+	SerialNumber         string   `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
+	Action               string   `protobuf:"bytes,3,opt,name=action,proto3" json:"action,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeviceAction) Reset()         { *m = DeviceAction{} }
+func (m *DeviceAction) String() string { return proto.CompactTextString(m) }
+func (*DeviceAction) ProtoMessage()    {}
+func (*DeviceAction) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{10}
+}
+
+func (m *DeviceAction) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeviceAction.Unmarshal(m, b)
+}
+func (m *DeviceAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeviceAction.Marshal(b, m, deterministic)
+}
+func (m *DeviceAction) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeviceAction.Merge(m, src)
+}
+func (m *DeviceAction) XXX_Size() int {
+	return xxx_messageInfo_DeviceAction.Size(m)
+}
+func (m *DeviceAction) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeviceAction.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeviceAction proto.InternalMessageInfo
+
+func (m *DeviceAction) GetDeviceType() string {
+	if m != nil {
+		return m.DeviceType
+	}
+	return ""
+}
+
+func (m *DeviceAction) GetSerialNumber() string {
+	if m != nil {
+		return m.SerialNumber
+	}
+	return ""
+}
+
+func (m *DeviceAction) GetAction() string {
+	if m != nil {
+		return m.Action
+	}
+	return ""
+}
+
+type Tconts struct {
+	UniId                uint32                           `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+	PortNo               uint32                           `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
+	Tconts               []*tech_profile.TrafficScheduler `protobuf:"bytes,3,rep,name=tconts,proto3" json:"tconts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *Tconts) Reset()         { *m = Tconts{} }
+func (m *Tconts) String() string { return proto.CompactTextString(m) }
+func (*Tconts) ProtoMessage()    {}
+func (*Tconts) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{11}
+}
+
+func (m *Tconts) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Tconts.Unmarshal(m, b)
+}
+func (m *Tconts) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Tconts.Marshal(b, m, deterministic)
+}
+func (m *Tconts) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Tconts.Merge(m, src)
+}
+func (m *Tconts) XXX_Size() int {
+	return xxx_messageInfo_Tconts.Size(m)
+}
+func (m *Tconts) XXX_DiscardUnknown() {
+	xxx_messageInfo_Tconts.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Tconts proto.InternalMessageInfo
+
+func (m *Tconts) GetUniId() uint32 {
+	if m != nil {
+		return m.UniId
+	}
+	return 0
+}
+
+func (m *Tconts) GetPortNo() uint32 {
+	if m != nil {
+		return m.PortNo
+	}
+	return 0
+}
+
+func (m *Tconts) GetTconts() []*tech_profile.TrafficScheduler {
+	if m != nil {
+		return m.Tconts
+	}
+	return nil
+}
+
+type Flows struct {
+	Flows                []*openolt.Flow `protobuf:"bytes,1,rep,name=flows,proto3" json:"flows,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *Flows) Reset()         { *m = Flows{} }
+func (m *Flows) String() string { return proto.CompactTextString(m) }
+func (*Flows) ProtoMessage()    {}
+func (*Flows) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{12}
+}
+
+func (m *Flows) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Flows.Unmarshal(m, b)
+}
+func (m *Flows) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Flows.Marshal(b, m, deterministic)
+}
+func (m *Flows) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Flows.Merge(m, src)
+}
+func (m *Flows) XXX_Size() int {
+	return xxx_messageInfo_Flows.Size(m)
+}
+func (m *Flows) XXX_DiscardUnknown() {
+	xxx_messageInfo_Flows.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Flows proto.InternalMessageInfo
+
+func (m *Flows) GetFlows() []*openolt.Flow {
+	if m != nil {
+		return m.Flows
+	}
+	return nil
+}
+
+type Empty struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Empty) Reset()         { *m = Empty{} }
+func (m *Empty) String() string { return proto.CompactTextString(m) }
+func (*Empty) ProtoMessage()    {}
+func (*Empty) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6ea2bed57327b60e, []int{13}
+}
+
+func (m *Empty) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Empty.Unmarshal(m, b)
+}
+func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
+}
+func (m *Empty) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Empty.Merge(m, src)
+}
+func (m *Empty) XXX_Size() int {
+	return xxx_messageInfo_Empty.Size(m)
+}
+func (m *Empty) XXX_DiscardUnknown() {
+	xxx_messageInfo_Empty.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Empty proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*OLTInfo)(nil), "legacy.OLTInfo")
+	proto.RegisterType((*ONUInfo)(nil), "legacy.ONUInfo")
+	proto.RegisterType((*ONUs)(nil), "legacy.ONUs")
+	proto.RegisterType((*ONURequest)(nil), "legacy.ONURequest")
+	proto.RegisterType((*PortInfo)(nil), "legacy.PortInfo")
+	proto.RegisterType((*Ports)(nil), "legacy.Ports")
+	proto.RegisterType((*OLTStatusResponse)(nil), "legacy.OLTStatusResponse")
+	proto.RegisterType((*BBSimResponse)(nil), "legacy.BBSimResponse")
+	proto.RegisterType((*ONUAlarmRequest)(nil), "legacy.ONUAlarmRequest")
+	proto.RegisterType((*OLTAlarmRequest)(nil), "legacy.OLTAlarmRequest")
+	proto.RegisterType((*DeviceAction)(nil), "legacy.DeviceAction")
+	proto.RegisterType((*Tconts)(nil), "legacy.Tconts")
+	proto.RegisterType((*Flows)(nil), "legacy.Flows")
+	proto.RegisterType((*Empty)(nil), "legacy.Empty")
+}
+
+func init() { proto.RegisterFile("api/legacy/bbsim.proto", fileDescriptor_6ea2bed57327b60e) }
+
+var fileDescriptor_6ea2bed57327b60e = []byte{
+	// 1326 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4d, 0x6f, 0x1b, 0x55,
+	0x17, 0xd6, 0xd8, 0xb1, 0x1d, 0x9f, 0xc4, 0x6d, 0x7a, 0xfb, 0xe5, 0x37, 0x79, 0xd3, 0x4e, 0xa7,
+	0x55, 0x08, 0x69, 0xeb, 0x69, 0xdd, 0x2f, 0x08, 0xab, 0x44, 0x85, 0x2a, 0x52, 0x6b, 0x47, 0x93,
+	0x84, 0x85, 0xa9, 0xb0, 0x26, 0xf6, 0xb5, 0x3d, 0x68, 0x7c, 0xef, 0x30, 0xf7, 0x4e, 0xda, 0xc8,
+	0xf2, 0x06, 0x01, 0xea, 0x02, 0x16, 0x80, 0x54, 0x21, 0x96, 0xec, 0xf8, 0x15, 0xec, 0xf8, 0x03,
+	0x6c, 0x91, 0xba, 0x80, 0x1f, 0x82, 0xee, 0xb9, 0x33, 0xce, 0x4c, 0x3e, 0x20, 0x65, 0x15, 0xdf,
+	0x73, 0xce, 0xbd, 0xe7, 0x79, 0xce, 0xc7, 0x93, 0x81, 0x4b, 0x6e, 0xe0, 0xd9, 0x3e, 0xed, 0xbb,
+	0x9d, 0x7d, 0x7b, 0x77, 0x57, 0x78, 0xc3, 0x5a, 0x10, 0x72, 0xc9, 0x49, 0x51, 0xdb, 0xe6, 0xff,
+	0xdf, 0xe7, 0xbc, 0xef, 0x53, 0x5b, 0x85, 0xb9, 0x8c, 0x71, 0xe9, 0x4a, 0x8f, 0x33, 0xa1, 0xa3,
+	0xe6, 0x6f, 0xe1, 0x9f, 0xce, 0xed, 0x3e, 0x65, 0xb7, 0xc5, 0x0b, 0xb7, 0xdf, 0xa7, 0xa1, 0xcd,
+	0x03, 0x8c, 0x38, 0x26, 0x7a, 0x61, 0x8f, 0xfb, 0x72, 0xe0, 0xb6, 0xf1, 0x24, 0x6c, 0x1e, 0x50,
+	0xc6, 0x7d, 0x19, 0x3b, 0xcd, 0xac, 0x53, 0xd2, 0xce, 0x40, 0xfd, 0xee, 0x79, 0x3e, 0xd5, 0x11,
+	0xd6, 0x6b, 0x03, 0x4a, 0xcd, 0xa7, 0xdb, 0x1b, 0xac, 0xc7, 0xc9, 0x45, 0x28, 0x72, 0x5f, 0xb6,
+	0xbd, 0x6e, 0xd5, 0x30, 0x8d, 0xe5, 0xbc, 0x53, 0xe0, 0xbe, 0xdc, 0xe8, 0x92, 0x45, 0x00, 0x65,
+	0x16, 0x34, 0xf4, 0x5c, 0xbf, 0x9a, 0x33, 0x8d, 0xe5, 0xb2, 0x53, 0xe6, 0xbe, 0xdc, 0x42, 0xc3,
+	0xe4, 0x56, 0x50, 0xcd, 0xa3, 0x0b, 0x6f, 0x05, 0x64, 0x01, 0xca, 0x78, 0x4b, 0xba, 0x92, 0x56,
+	0xa7, 0xd0, 0x33, 0xad, 0x2e, 0xa9, 0x73, 0xf2, 0xe4, 0x1e, 0x65, 0x5d, 0x1e, 0x56, 0x0b, 0x93,
+	0x27, 0x3f, 0x46, 0xc3, 0x6a, 0xae, 0x6a, 0x58, 0x6f, 0x14, 0xb0, 0xc6, 0xce, 0x04, 0x18, 0x8b,
+	0x12, 0x60, 0x15, 0xa7, 0xc0, 0x59, 0xb4, 0xd1, 0x25, 0x57, 0x60, 0x26, 0xe0, 0xac, 0x1d, 0xf0,
+	0x10, 0x41, 0xe7, 0xd0, 0x57, 0x0e, 0x38, 0xdb, 0xe4, 0x61, 0x02, 0x9c, 0x45, 0x09, 0xf0, 0x7c,
+	0x9c, 0x85, 0x45, 0x31, 0x70, 0xe5, 0x0e, 0x68, 0x98, 0x81, 0x58, 0x56, 0x16, 0x8d, 0x51, 0x11,
+	0x50, 0xb7, 0xd1, 0x5b, 0x88, 0x09, 0xb0, 0x48, 0x3b, 0xe7, 0x61, 0xba, 0x4f, 0x87, 0x2a, 0xb3,
+	0xa8, 0x16, 0xcd, 0xfc, 0x72, 0xc5, 0x99, 0x9c, 0xc9, 0x12, 0x14, 0x65, 0x87, 0x33, 0x29, 0xaa,
+	0x25, 0xd3, 0x58, 0x9e, 0xa9, 0x9f, 0xa9, 0xe9, 0xb6, 0xd7, 0xb6, 0xd1, 0xea, 0xc4, 0x5e, 0xeb,
+	0x26, 0x4c, 0x35, 0x1b, 0x3b, 0x82, 0x5c, 0x87, 0x29, 0xce, 0x22, 0x51, 0x35, 0xcc, 0xfc, 0xf2,
+	0x4c, 0xfd, 0x6c, 0x12, 0x1d, 0x93, 0x77, 0xd0, 0x69, 0x3d, 0x07, 0x68, 0x36, 0x76, 0x1c, 0xfa,
+	0x79, 0x44, 0x85, 0x24, 0xd7, 0x20, 0xcf, 0x59, 0x84, 0xd5, 0x38, 0xe6, 0x86, 0xf2, 0x91, 0x9b,
+	0x48, 0x5e, 0xb4, 0x77, 0x5d, 0xd9, 0x19, 0x60, 0x6d, 0x66, 0xea, 0xb3, 0xa9, 0x48, 0x81, 0xa5,
+	0x10, 0xeb, 0xca, 0x6d, 0xfd, 0x61, 0xc0, 0x34, 0x16, 0x4d, 0x55, 0x7b, 0x01, 0xca, 0x58, 0x52,
+	0xb9, 0x1f, 0x50, 0x4c, 0x51, 0x76, 0xa6, 0x95, 0x61, 0x7b, 0x3f, 0xa0, 0xe4, 0x32, 0x94, 0xb2,
+	0xf5, 0x2e, 0x06, 0xba, 0xd8, 0xef, 0xc2, 0xb9, 0x49, 0x33, 0x86, 0xee, 0xcb, 0x36, 0x52, 0xca,
+	0x63, 0xc8, 0x99, 0xb8, 0x25, 0xcf, 0xdc, 0x97, 0x4d, 0x16, 0x09, 0x62, 0xc3, 0x85, 0x49, 0xa8,
+	0xdb, 0x91, 0xde, 0x1e, 0xd5, 0xd1, 0x53, 0x18, 0x7d, 0x2e, 0x8e, 0x5e, 0x43, 0x0f, 0x5e, 0x58,
+	0x04, 0xc0, 0xe0, 0x74, 0x2f, 0x10, 0xa3, 0x6e, 0xc6, 0x55, 0x98, 0x71, 0x7d, 0x37, 0x1c, 0xc6,
+	0xfe, 0x22, 0xfa, 0x01, 0x4d, 0x18, 0x60, 0xd9, 0x50, 0xd8, 0x8c, 0x5b, 0x53, 0xd0, 0x3d, 0xd3,
+	0xb5, 0x9e, 0x4b, 0xea, 0x91, 0x70, 0x77, 0xb4, 0xdb, 0xfa, 0x14, 0xce, 0x35, 0x9f, 0x6e, 0xab,
+	0xcb, 0x91, 0x70, 0xa8, 0x08, 0x38, 0x13, 0x14, 0x8b, 0xee, 0xcb, 0x23, 0x45, 0xd7, 0xcb, 0xe3,
+	0x28, 0xdf, 0xc1, 0xfb, 0xb9, 0x7f, 0x7e, 0xbf, 0x06, 0x95, 0xf5, 0xf5, 0x2d, 0x6f, 0x38, 0x79,
+	0x7b, 0x11, 0x40, 0x60, 0xb6, 0xf6, 0x50, 0xf4, 0xe3, 0xa2, 0x97, 0xb5, 0xe5, 0x99, 0xe8, 0x5b,
+	0x7d, 0x38, 0xdb, 0x6c, 0xec, 0xac, 0x29, 0x46, 0xc9, 0x08, 0x64, 0x87, 0xdb, 0x38, 0x66, 0xb8,
+	0x75, 0x4d, 0xb0, 0x8b, 0xf1, 0xd2, 0xa2, 0x05, 0xdb, 0x78, 0x09, 0x8a, 0xfa, 0xf5, 0x78, 0x2d,
+	0xe2, 0x93, 0xd5, 0x86, 0xb3, 0xcd, 0xa7, 0xdb, 0x99, 0x44, 0xa9, 0x8e, 0x1b, 0x99, 0x8e, 0x67,
+	0xe6, 0x24, 0x77, 0x68, 0x4e, 0x4e, 0x4a, 0xe0, 0xc3, 0xec, 0x63, 0xba, 0xe7, 0x75, 0xa8, 0x6a,
+	0x2f, 0x67, 0xaa, 0x77, 0x5d, 0x3c, 0xa7, 0xc7, 0x0d, 0xb4, 0x09, 0x1f, 0xba, 0x0e, 0x15, 0xcd,
+	0xb1, 0xcd, 0xa2, 0xe1, 0x2e, 0x0d, 0xe3, 0x4c, 0xb3, 0xda, 0xd8, 0x40, 0x9b, 0xca, 0xe6, 0xe2,
+	0x7b, 0x49, 0x36, 0x7d, 0xb2, 0x02, 0x28, 0xea, 0xa5, 0x53, 0x12, 0x12, 0x31, 0x4f, 0x91, 0x50,
+	0x53, 0x56, 0x72, 0x0a, 0x11, 0xf3, 0x36, 0xba, 0x13, 0x72, 0x8c, 0xe3, 0x58, 0x95, 0x34, 0xb9,
+	0x06, 0x27, 0x0f, 0x27, 0x4b, 0x9c, 0xc7, 0x56, 0x5e, 0xa9, 0x65, 0xc4, 0x73, 0x3b, 0x74, 0x7b,
+	0x3d, 0xaf, 0xb3, 0xd5, 0x19, 0xd0, 0x6e, 0xe4, 0xd3, 0x70, 0xb2, 0xd4, 0xb7, 0xa0, 0xf0, 0x91,
+	0xcf, 0x5f, 0xa8, 0xad, 0x2e, 0xf4, 0xd4, 0x8f, 0x78, 0xd4, 0x2a, 0xb5, 0x44, 0x99, 0x95, 0xdb,
+	0xd1, 0x3e, 0xab, 0x04, 0x85, 0x0f, 0x87, 0x81, 0xdc, 0xaf, 0xff, 0x09, 0x30, 0x8b, 0x13, 0xb1,
+	0x45, 0x43, 0x45, 0x9d, 0x7c, 0x02, 0xe5, 0xc9, 0x04, 0x92, 0x4a, 0x32, 0x47, 0x18, 0x3c, 0xff,
+	0xbf, 0xd4, 0xec, 0x65, 0x67, 0xd4, 0xba, 0xf1, 0xc5, 0xef, 0x7f, 0xfd, 0x90, 0x5b, 0x20, 0x25,
+	0x7b, 0xef, 0x8e, 0xcd, 0x7d, 0xd9, 0x9a, 0x23, 0x67, 0xe2, 0x9f, 0xb6, 0xee, 0xc0, 0xab, 0x9c,
+	0x41, 0xba, 0x00, 0x9b, 0xf1, 0xf6, 0x44, 0x82, 0x1c, 0x99, 0xd2, 0xf9, 0x4a, 0xda, 0x22, 0xac,
+	0x07, 0xf8, 0xe8, 0x2d, 0xb2, 0x92, 0xbc, 0x84, 0x43, 0x6c, 0x8f, 0x26, 0xdd, 0x1f, 0xc7, 0xbf,
+	0xbd, 0xee, 0x38, 0x95, 0xe5, 0x37, 0x03, 0xca, 0xcd, 0xc6, 0x4e, 0x9c, 0x85, 0xa4, 0xb4, 0x27,
+	0x1e, 0xad, 0xf9, 0x8c, 0x1e, 0x59, 0xaf, 0x0d, 0xcc, 0xf3, 0x8d, 0x41, 0x66, 0x93, 0x44, 0x4a,
+	0x16, 0x5a, 0x57, 0xc9, 0x62, 0xfa, 0x6c, 0x8f, 0x38, 0x8b, 0x6a, 0x07, 0xb3, 0x3f, 0x6e, 0xdd,
+	0x23, 0x77, 0x0f, 0x21, 0x53, 0x11, 0xa9, 0x7f, 0x0d, 0xe3, 0x43, 0x17, 0xbd, 0xee, 0xb8, 0xb5,
+	0x44, 0x6e, 0x9c, 0xe6, 0x92, 0x22, 0xf2, 0xab, 0x01, 0x33, 0x6a, 0xfd, 0x94, 0x20, 0x29, 0xbd,
+	0x39, 0x8e, 0xca, 0xc5, 0xc4, 0x96, 0xd9, 0x6b, 0xeb, 0x4b, 0xcd, 0x69, 0x64, 0x65, 0x28, 0xad,
+	0xa6, 0xa4, 0xb9, 0xb5, 0x64, 0x9d, 0x0a, 0x48, 0xeb, 0x91, 0xf5, 0xe0, 0xed, 0x58, 0xc6, 0xe5,
+	0x51, 0x0c, 0xde, 0x18, 0x50, 0x69, 0x36, 0x76, 0x1e, 0x53, 0xf7, 0x3f, 0x70, 0xf8, 0x59, 0x73,
+	0xf8, 0xd1, 0x58, 0x39, 0x99, 0xc4, 0xd5, 0x95, 0x7f, 0xe9, 0xd1, 0xd2, 0xca, 0xe9, 0x58, 0xde,
+	0x5b, 0x79, 0xfb, 0x5e, 0x2a, 0x86, 0x5f, 0x19, 0x30, 0xf7, 0x84, 0x32, 0x1a, 0xba, 0x92, 0x26,
+	0x52, 0x49, 0x2e, 0xa7, 0x48, 0xa6, 0x35, 0xed, 0x24, 0xa6, 0x6b, 0x48, 0xf4, 0x3d, 0xeb, 0xe1,
+	0x11, 0x2e, 0x09, 0x0f, 0x1b, 0x25, 0x54, 0xd8, 0xa3, 0x03, 0x71, 0x1d, 0xdb, 0x23, 0x3d, 0xf3,
+	0x88, 0xe3, 0xeb, 0x34, 0x8e, 0x58, 0x49, 0x53, 0x38, 0xb2, 0xda, 0x7a, 0x12, 0x8e, 0x75, 0xc4,
+	0xf1, 0xbe, 0xf5, 0xe8, 0x34, 0x0b, 0x17, 0x23, 0xf2, 0xb9, 0xc8, 0x00, 0xf9, 0xc5, 0x80, 0xf3,
+	0x9b, 0x34, 0xec, 0xf1, 0x70, 0x98, 0x11, 0xdc, 0x0b, 0x49, 0xca, 0xb4, 0xf5, 0x24, 0x20, 0x14,
+	0x81, 0x3c, 0xaf, 0x5f, 0x53, 0x40, 0x46, 0x29, 0xa1, 0x1e, 0xdb, 0x5a, 0x61, 0xed, 0x91, 0xfe,
+	0x3b, 0x6e, 0x3d, 0xaa, 0x4f, 0xc6, 0x33, 0x1b, 0x38, 0xca, 0xc8, 0xf7, 0x91, 0x8b, 0x0a, 0x6b,
+	0x0f, 0xa6, 0x9f, 0x50, 0xa9, 0x75, 0xf3, 0xf0, 0xd7, 0xcc, 0x81, 0x18, 0xa1, 0xdf, 0x5a, 0x45,
+	0x48, 0x77, 0x49, 0x25, 0xc9, 0x86, 0x4a, 0xda, 0x32, 0xc9, 0x95, 0x54, 0xd3, 0xb2, 0x3d, 0xc3,
+	0x88, 0x57, 0x39, 0x63, 0xfd, 0x3b, 0xe3, 0xfb, 0xb5, 0x6f, 0x0d, 0xf2, 0x0e, 0x94, 0x91, 0xa6,
+	0xb9, 0xb6, 0xb9, 0x61, 0x5d, 0x24, 0xe7, 0x07, 0x52, 0x06, 0xab, 0x36, 0x7e, 0x3a, 0x77, 0x78,
+	0xd8, 0xad, 0xf1, 0xb0, 0x5f, 0xcf, 0xdf, 0xad, 0xdd, 0x59, 0x31, 0x8c, 0xfa, 0x9c, 0x1b, 0x04,
+	0xbe, 0xd7, 0xc1, 0x4f, 0x6e, 0xfb, 0x33, 0xc1, 0xd9, 0xea, 0x11, 0x8b, 0xf3, 0x01, 0xe4, 0xef,
+	0xdf, 0xb9, 0x4f, 0xee, 0xc3, 0x8a, 0x43, 0x65, 0x14, 0x32, 0xda, 0x35, 0x5f, 0x0c, 0x28, 0x33,
+	0xe5, 0x80, 0x9a, 0x21, 0x15, 0x3c, 0x0a, 0x3b, 0xd4, 0xec, 0x72, 0x2a, 0x4c, 0xc6, 0xa5, 0x49,
+	0x5f, 0x7a, 0x42, 0xd6, 0x48, 0x11, 0xa6, 0x7e, 0xca, 0x19, 0xa5, 0xdd, 0x22, 0x7e, 0x87, 0xdf,
+	0xfb, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xb3, 0x49, 0x58, 0x34, 0x0c, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// BBSimServiceClient is the client API for BBSimService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type BBSimServiceClient interface {
+	// Get current status of OLT
+	OLTStatus(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*OLTStatusResponse, error)
+	// Get status of a PON/NNI port
+	PortStatus(ctx context.Context, in *PortInfo, opts ...grpc.CallOption) (*Ports, error)
+	// Get status of all or specific ONUs
+	ONUStatus(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUs, error)
+	// Single/bulk activate ONU(s) for specific PON port(s)
+	ONUActivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error)
+	// Deactivate ONU(s) for specific PON port(s) specified by
+	// a given onu_serial, onu_id, or pon_port_id
+	ONUDeactivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error)
+	// Generate ONU related alarms
+	GenerateONUAlarm(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error)
+	// Generate OLT related alarms
+	GenerateOLTAlarm(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error)
+	// Perform actions on OLT/ONU devices (e.g. reboot)
+	PerformDeviceAction(ctx context.Context, in *DeviceAction, opts ...grpc.CallOption) (*BBSimResponse, error)
+	// Get flows
+	GetFlows(ctx context.Context, in *ONUInfo, opts ...grpc.CallOption) (*Flows, error)
+}
+
+type bBSimServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewBBSimServiceClient(cc *grpc.ClientConn) BBSimServiceClient {
+	return &bBSimServiceClient{cc}
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) OLTStatus(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*OLTStatusResponse, error) {
+	out := new(OLTStatusResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/OLTStatus", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) PortStatus(ctx context.Context, in *PortInfo, opts ...grpc.CallOption) (*Ports, error) {
+	out := new(Ports)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/PortStatus", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) ONUStatus(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*ONUs, error) {
+	out := new(ONUs)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUStatus", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) ONUActivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
+	out := new(BBSimResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUActivate", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) ONUDeactivate(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
+	out := new(BBSimResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/ONUDeactivate", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) GenerateONUAlarm(ctx context.Context, in *ONUAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
+	out := new(BBSimResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GenerateONUAlarm", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) GenerateOLTAlarm(ctx context.Context, in *OLTAlarmRequest, opts ...grpc.CallOption) (*BBSimResponse, error) {
+	out := new(BBSimResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GenerateOLTAlarm", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) PerformDeviceAction(ctx context.Context, in *DeviceAction, opts ...grpc.CallOption) (*BBSimResponse, error) {
+	out := new(BBSimResponse)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/PerformDeviceAction", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Deprecated: Do not use.
+func (c *bBSimServiceClient) GetFlows(ctx context.Context, in *ONUInfo, opts ...grpc.CallOption) (*Flows, error) {
+	out := new(Flows)
+	err := c.cc.Invoke(ctx, "/legacy.BBSimService/GetFlows", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// BBSimServiceServer is the server API for BBSimService service.
+type BBSimServiceServer interface {
+	// Get current status of OLT
+	OLTStatus(context.Context, *Empty) (*OLTStatusResponse, error)
+	// Get status of a PON/NNI port
+	PortStatus(context.Context, *PortInfo) (*Ports, error)
+	// Get status of all or specific ONUs
+	ONUStatus(context.Context, *ONURequest) (*ONUs, error)
+	// Single/bulk activate ONU(s) for specific PON port(s)
+	ONUActivate(context.Context, *ONURequest) (*BBSimResponse, error)
+	// Deactivate ONU(s) for specific PON port(s) specified by
+	// a given onu_serial, onu_id, or pon_port_id
+	ONUDeactivate(context.Context, *ONURequest) (*BBSimResponse, error)
+	// Generate ONU related alarms
+	GenerateONUAlarm(context.Context, *ONUAlarmRequest) (*BBSimResponse, error)
+	// Generate OLT related alarms
+	GenerateOLTAlarm(context.Context, *OLTAlarmRequest) (*BBSimResponse, error)
+	// Perform actions on OLT/ONU devices (e.g. reboot)
+	PerformDeviceAction(context.Context, *DeviceAction) (*BBSimResponse, error)
+	// Get flows
+	GetFlows(context.Context, *ONUInfo) (*Flows, error)
+}
+
+// UnimplementedBBSimServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedBBSimServiceServer struct {
+}
+
+func (*UnimplementedBBSimServiceServer) OLTStatus(ctx context.Context, req *Empty) (*OLTStatusResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method OLTStatus not implemented")
+}
+func (*UnimplementedBBSimServiceServer) PortStatus(ctx context.Context, req *PortInfo) (*Ports, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method PortStatus not implemented")
+}
+func (*UnimplementedBBSimServiceServer) ONUStatus(ctx context.Context, req *ONURequest) (*ONUs, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ONUStatus not implemented")
+}
+func (*UnimplementedBBSimServiceServer) ONUActivate(ctx context.Context, req *ONURequest) (*BBSimResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ONUActivate not implemented")
+}
+func (*UnimplementedBBSimServiceServer) ONUDeactivate(ctx context.Context, req *ONURequest) (*BBSimResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ONUDeactivate not implemented")
+}
+func (*UnimplementedBBSimServiceServer) GenerateONUAlarm(ctx context.Context, req *ONUAlarmRequest) (*BBSimResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GenerateONUAlarm not implemented")
+}
+func (*UnimplementedBBSimServiceServer) GenerateOLTAlarm(ctx context.Context, req *OLTAlarmRequest) (*BBSimResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GenerateOLTAlarm not implemented")
+}
+func (*UnimplementedBBSimServiceServer) PerformDeviceAction(ctx context.Context, req *DeviceAction) (*BBSimResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method PerformDeviceAction not implemented")
+}
+func (*UnimplementedBBSimServiceServer) GetFlows(ctx context.Context, req *ONUInfo) (*Flows, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetFlows not implemented")
+}
+
+func RegisterBBSimServiceServer(s *grpc.Server, srv BBSimServiceServer) {
+	s.RegisterService(&_BBSimService_serviceDesc, srv)
+}
+
+func _BBSimService_OLTStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).OLTStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/OLTStatus",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).OLTStatus(ctx, req.(*Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_PortStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(PortInfo)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).PortStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/PortStatus",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).PortStatus(ctx, req.(*PortInfo))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_ONUStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ONURequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).ONUStatus(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/ONUStatus",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).ONUStatus(ctx, req.(*ONURequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_ONUActivate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ONURequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).ONUActivate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/ONUActivate",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).ONUActivate(ctx, req.(*ONURequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_ONUDeactivate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ONURequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).ONUDeactivate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/ONUDeactivate",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).ONUDeactivate(ctx, req.(*ONURequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_GenerateONUAlarm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ONUAlarmRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).GenerateONUAlarm(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/GenerateONUAlarm",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).GenerateONUAlarm(ctx, req.(*ONUAlarmRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_GenerateOLTAlarm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(OLTAlarmRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).GenerateOLTAlarm(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/GenerateOLTAlarm",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).GenerateOLTAlarm(ctx, req.(*OLTAlarmRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_PerformDeviceAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeviceAction)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).PerformDeviceAction(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/PerformDeviceAction",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).PerformDeviceAction(ctx, req.(*DeviceAction))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BBSimService_GetFlows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ONUInfo)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BBSimServiceServer).GetFlows(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/legacy.BBSimService/GetFlows",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServiceServer).GetFlows(ctx, req.(*ONUInfo))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _BBSimService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "legacy.BBSimService",
+	HandlerType: (*BBSimServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "OLTStatus",
+			Handler:    _BBSimService_OLTStatus_Handler,
+		},
+		{
+			MethodName: "PortStatus",
+			Handler:    _BBSimService_PortStatus_Handler,
+		},
+		{
+			MethodName: "ONUStatus",
+			Handler:    _BBSimService_ONUStatus_Handler,
+		},
+		{
+			MethodName: "ONUActivate",
+			Handler:    _BBSimService_ONUActivate_Handler,
+		},
+		{
+			MethodName: "ONUDeactivate",
+			Handler:    _BBSimService_ONUDeactivate_Handler,
+		},
+		{
+			MethodName: "GenerateONUAlarm",
+			Handler:    _BBSimService_GenerateONUAlarm_Handler,
+		},
+		{
+			MethodName: "GenerateOLTAlarm",
+			Handler:    _BBSimService_GenerateOLTAlarm_Handler,
+		},
+		{
+			MethodName: "PerformDeviceAction",
+			Handler:    _BBSimService_PerformDeviceAction_Handler,
+		},
+		{
+			MethodName: "GetFlows",
+			Handler:    _BBSimService_GetFlows_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "api/legacy/bbsim.proto",
+}
