[VOL-4111] Dinamically generating the MibDB during ONU creation and use
that to drive the MibUploadNextResponse generation

Change-Id: I67dbbe0700a7fbec802516fc6b2a9aff496022de
diff --git a/VERSION b/VERSION
index 943f9cb..0ef074f 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.7.1
+1.8.0-dev
diff --git a/api/bbsim/bbsim.pb.go b/api/bbsim/bbsim.pb.go
index 881187c..c5f10a2 100644
--- a/api/bbsim/bbsim.pb.go
+++ b/api/bbsim/bbsim.pb.go
@@ -159,7 +159,7 @@
 }
 
 func (AlarmType_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{14, 0}
+	return fileDescriptor_ef7750073d18011b, []int{16, 0}
 }
 
 type PONPort struct {
@@ -602,6 +602,7 @@
 	ImageSoftwareReceivedSections int32      `protobuf:"varint,12,opt,name=ImageSoftwareReceivedSections,proto3" json:"ImageSoftwareReceivedSections,omitempty"`
 	ActiveImageEntityId           int32      `protobuf:"varint,13,opt,name=ActiveImageEntityId,proto3" json:"ActiveImageEntityId,omitempty"`
 	CommittedImageEntityId        int32      `protobuf:"varint,14,opt,name=CommittedImageEntityId,proto3" json:"CommittedImageEntityId,omitempty"`
+	Unis                          []*UNI     `protobuf:"bytes,15,rep,name=unis,proto3" json:"unis,omitempty"`
 	XXX_NoUnkeyedLiteral          struct{}   `json:"-"`
 	XXX_unrecognized              []byte     `json:"-"`
 	XXX_sizecache                 int32      `json:"-"`
@@ -716,6 +717,84 @@
 	return 0
 }
 
+func (m *ONU) GetUnis() []*UNI {
+	if m != nil {
+		return m.Unis
+	}
+	return nil
+}
+
+type UNI struct {
+	ID                   int32    `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"`
+	OnuID                int32    `protobuf:"varint,2,opt,name=OnuID,proto3" json:"OnuID,omitempty"`
+	OnuSn                string   `protobuf:"bytes,3,opt,name=OnuSn,proto3" json:"OnuSn,omitempty"`
+	MeID                 uint32   `protobuf:"varint,4,opt,name=MeID,proto3" json:"MeID,omitempty"`
+	OperState            string   `protobuf:"bytes,5,opt,name=OperState,proto3" json:"OperState,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UNI) Reset()         { *m = UNI{} }
+func (m *UNI) String() string { return proto.CompactTextString(m) }
+func (*UNI) ProtoMessage()    {}
+func (*UNI) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ef7750073d18011b, []int{8}
+}
+
+func (m *UNI) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UNI.Unmarshal(m, b)
+}
+func (m *UNI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UNI.Marshal(b, m, deterministic)
+}
+func (m *UNI) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UNI.Merge(m, src)
+}
+func (m *UNI) XXX_Size() int {
+	return xxx_messageInfo_UNI.Size(m)
+}
+func (m *UNI) XXX_DiscardUnknown() {
+	xxx_messageInfo_UNI.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UNI proto.InternalMessageInfo
+
+func (m *UNI) GetID() int32 {
+	if m != nil {
+		return m.ID
+	}
+	return 0
+}
+
+func (m *UNI) GetOnuID() int32 {
+	if m != nil {
+		return m.OnuID
+	}
+	return 0
+}
+
+func (m *UNI) GetOnuSn() string {
+	if m != nil {
+		return m.OnuSn
+	}
+	return ""
+}
+
+func (m *UNI) GetMeID() uint32 {
+	if m != nil {
+		return m.MeID
+	}
+	return 0
+}
+
+func (m *UNI) GetOperState() string {
+	if m != nil {
+		return m.OperState
+	}
+	return ""
+}
+
 type Service struct {
 	Name                 string   `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
 	HwAddress            string   `protobuf:"bytes,2,opt,name=HwAddress,proto3" json:"HwAddress,omitempty"`
@@ -739,7 +818,7 @@
 func (m *Service) String() string { return proto.CompactTextString(m) }
 func (*Service) ProtoMessage()    {}
 func (*Service) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{8}
+	return fileDescriptor_ef7750073d18011b, []int{9}
 }
 
 func (m *Service) XXX_Unmarshal(b []byte) error {
@@ -862,7 +941,7 @@
 func (m *ONUTrafficSchedulers) String() string { return proto.CompactTextString(m) }
 func (*ONUTrafficSchedulers) ProtoMessage()    {}
 func (*ONUTrafficSchedulers) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{9}
+	return fileDescriptor_ef7750073d18011b, []int{10}
 }
 
 func (m *ONUTrafficSchedulers) XXX_Unmarshal(b []byte) error {
@@ -901,7 +980,7 @@
 func (m *ONUs) String() string { return proto.CompactTextString(m) }
 func (*ONUs) ProtoMessage()    {}
 func (*ONUs) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{10}
+	return fileDescriptor_ef7750073d18011b, []int{11}
 }
 
 func (m *ONUs) XXX_Unmarshal(b []byte) error {
@@ -940,7 +1019,7 @@
 func (m *Services) String() string { return proto.CompactTextString(m) }
 func (*Services) ProtoMessage()    {}
 func (*Services) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{11}
+	return fileDescriptor_ef7750073d18011b, []int{12}
 }
 
 func (m *Services) XXX_Unmarshal(b []byte) error {
@@ -968,6 +1047,45 @@
 	return nil
 }
 
+type UNIs struct {
+	Items                []*UNI   `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UNIs) Reset()         { *m = UNIs{} }
+func (m *UNIs) String() string { return proto.CompactTextString(m) }
+func (*UNIs) ProtoMessage()    {}
+func (*UNIs) Descriptor() ([]byte, []int) {
+	return fileDescriptor_ef7750073d18011b, []int{13}
+}
+
+func (m *UNIs) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UNIs.Unmarshal(m, b)
+}
+func (m *UNIs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UNIs.Marshal(b, m, deterministic)
+}
+func (m *UNIs) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UNIs.Merge(m, src)
+}
+func (m *UNIs) XXX_Size() int {
+	return xxx_messageInfo_UNIs.Size(m)
+}
+func (m *UNIs) XXX_DiscardUnknown() {
+	xxx_messageInfo_UNIs.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UNIs proto.InternalMessageInfo
+
+func (m *UNIs) GetItems() []*UNI {
+	if m != nil {
+		return m.Items
+	}
+	return nil
+}
+
 type ONURequest struct {
 	SerialNumber         string   `protobuf:"bytes,1,opt,name=SerialNumber,proto3" json:"SerialNumber,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -979,7 +1097,7 @@
 func (m *ONURequest) String() string { return proto.CompactTextString(m) }
 func (*ONURequest) ProtoMessage()    {}
 func (*ONURequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{12}
+	return fileDescriptor_ef7750073d18011b, []int{14}
 }
 
 func (m *ONURequest) XXX_Unmarshal(b []byte) error {
@@ -1018,7 +1136,7 @@
 func (m *PONRequest) String() string { return proto.CompactTextString(m) }
 func (*PONRequest) ProtoMessage()    {}
 func (*PONRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{13}
+	return fileDescriptor_ef7750073d18011b, []int{15}
 }
 
 func (m *PONRequest) XXX_Unmarshal(b []byte) error {
@@ -1056,7 +1174,7 @@
 func (m *AlarmType) String() string { return proto.CompactTextString(m) }
 func (*AlarmType) ProtoMessage()    {}
 func (*AlarmType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{14}
+	return fileDescriptor_ef7750073d18011b, []int{16}
 }
 
 func (m *AlarmType) XXX_Unmarshal(b []byte) error {
@@ -1089,7 +1207,7 @@
 func (m *AlarmParameter) String() string { return proto.CompactTextString(m) }
 func (*AlarmParameter) ProtoMessage()    {}
 func (*AlarmParameter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{15}
+	return fileDescriptor_ef7750073d18011b, []int{17}
 }
 
 func (m *AlarmParameter) XXX_Unmarshal(b []byte) error {
@@ -1141,7 +1259,7 @@
 func (m *ONUAlarmRequest) String() string { return proto.CompactTextString(m) }
 func (*ONUAlarmRequest) ProtoMessage()    {}
 func (*ONUAlarmRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{16}
+	return fileDescriptor_ef7750073d18011b, []int{18}
 }
 
 func (m *ONUAlarmRequest) XXX_Unmarshal(b []byte) error {
@@ -1204,7 +1322,7 @@
 func (m *OLTAlarmRequest) String() string { return proto.CompactTextString(m) }
 func (*OLTAlarmRequest) ProtoMessage()    {}
 func (*OLTAlarmRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{17}
+	return fileDescriptor_ef7750073d18011b, []int{19}
 }
 
 func (m *OLTAlarmRequest) XXX_Unmarshal(b []byte) error {
@@ -1260,7 +1378,7 @@
 func (m *VersionNumber) String() string { return proto.CompactTextString(m) }
 func (*VersionNumber) ProtoMessage()    {}
 func (*VersionNumber) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{18}
+	return fileDescriptor_ef7750073d18011b, []int{20}
 }
 
 func (m *VersionNumber) XXX_Unmarshal(b []byte) error {
@@ -1321,7 +1439,7 @@
 func (m *LogLevel) String() string { return proto.CompactTextString(m) }
 func (*LogLevel) ProtoMessage()    {}
 func (*LogLevel) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{19}
+	return fileDescriptor_ef7750073d18011b, []int{21}
 }
 
 func (m *LogLevel) XXX_Unmarshal(b []byte) error {
@@ -1368,7 +1486,7 @@
 func (m *Response) String() string { return proto.CompactTextString(m) }
 func (*Response) ProtoMessage()    {}
 func (*Response) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{20}
+	return fileDescriptor_ef7750073d18011b, []int{22}
 }
 
 func (m *Response) XXX_Unmarshal(b []byte) error {
@@ -1416,7 +1534,7 @@
 func (m *IgmpRequest) String() string { return proto.CompactTextString(m) }
 func (*IgmpRequest) ProtoMessage()    {}
 func (*IgmpRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{21}
+	return fileDescriptor_ef7750073d18011b, []int{23}
 }
 
 func (m *IgmpRequest) XXX_Unmarshal(b []byte) error {
@@ -1470,7 +1588,7 @@
 func (m *Flows) String() string { return proto.CompactTextString(m) }
 func (*Flows) ProtoMessage()    {}
 func (*Flows) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{22}
+	return fileDescriptor_ef7750073d18011b, []int{24}
 }
 
 func (m *Flows) XXX_Unmarshal(b []byte) error {
@@ -1516,7 +1634,7 @@
 func (m *Timeout) String() string { return proto.CompactTextString(m) }
 func (*Timeout) ProtoMessage()    {}
 func (*Timeout) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{23}
+	return fileDescriptor_ef7750073d18011b, []int{25}
 }
 
 func (m *Timeout) XXX_Unmarshal(b []byte) error {
@@ -1554,7 +1672,7 @@
 func (m *Empty) String() string { return proto.CompactTextString(m) }
 func (*Empty) ProtoMessage()    {}
 func (*Empty) Descriptor() ([]byte, []int) {
-	return fileDescriptor_ef7750073d18011b, []int{24}
+	return fileDescriptor_ef7750073d18011b, []int{26}
 }
 
 func (m *Empty) XXX_Unmarshal(b []byte) error {
@@ -1587,10 +1705,12 @@
 	proto.RegisterType((*OltAllocatedResource)(nil), "bbsim.OltAllocatedResource")
 	proto.RegisterType((*OltAllocatedResources)(nil), "bbsim.OltAllocatedResources")
 	proto.RegisterType((*ONU)(nil), "bbsim.ONU")
+	proto.RegisterType((*UNI)(nil), "bbsim.UNI")
 	proto.RegisterType((*Service)(nil), "bbsim.Service")
 	proto.RegisterType((*ONUTrafficSchedulers)(nil), "bbsim.ONUTrafficSchedulers")
 	proto.RegisterType((*ONUs)(nil), "bbsim.ONUs")
 	proto.RegisterType((*Services)(nil), "bbsim.Services")
+	proto.RegisterType((*UNIs)(nil), "bbsim.UNIs")
 	proto.RegisterType((*ONURequest)(nil), "bbsim.ONURequest")
 	proto.RegisterType((*PONRequest)(nil), "bbsim.PONRequest")
 	proto.RegisterType((*AlarmType)(nil), "bbsim.AlarmType")
@@ -1609,130 +1729,134 @@
 func init() { proto.RegisterFile("api/bbsim/bbsim.proto", fileDescriptor_ef7750073d18011b) }
 
 var fileDescriptor_ef7750073d18011b = []byte{
-	// 1956 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x51, 0x72, 0xdb, 0xc8,
-	0x11, 0x15, 0x49, 0x51, 0x24, 0x9b, 0x22, 0x05, 0x8d, 0x2d, 0x2d, 0x4b, 0xd6, 0xc6, 0x2a, 0xac,
-	0x37, 0x65, 0xbb, 0xb2, 0xf2, 0x5a, 0x4e, 0x36, 0xf6, 0x27, 0x44, 0x42, 0x34, 0x56, 0x14, 0x80,
-	0x1a, 0x90, 0x72, 0x39, 0xf9, 0x60, 0x41, 0xc0, 0x48, 0x42, 0x05, 0x24, 0x68, 0x60, 0x28, 0x45,
-	0x07, 0xc8, 0x19, 0xf2, 0x9f, 0x03, 0xe4, 0x12, 0xb9, 0x40, 0x4e, 0x90, 0x7c, 0xe5, 0x00, 0xa9,
-	0x5c, 0x20, 0x35, 0x83, 0x01, 0x08, 0x90, 0x90, 0x2d, 0x7f, 0xed, 0x0f, 0x0b, 0xfd, 0xba, 0x5f,
-	0x4f, 0x4f, 0x77, 0xa3, 0x67, 0x40, 0xd8, 0xb1, 0x67, 0xde, 0xab, 0x8b, 0x8b, 0xc8, 0x9b, 0xc4,
-	0xbf, 0x87, 0xb3, 0x30, 0xa0, 0x01, 0xaa, 0x72, 0x61, 0xef, 0xc9, 0x4d, 0xe0, 0xd3, 0x6b, 0x7b,
-	0xcc, 0xc1, 0xe8, 0x55, 0x30, 0x23, 0xd3, 0xc0, 0xa7, 0xb1, 0xcd, 0xde, 0x41, 0x5e, 0x49, 0x89,
-	0x73, 0xcd, 0x9e, 0x2f, 0x3d, 0x9f, 0xc4, 0x16, 0xf2, 0xbf, 0xcb, 0x50, 0x33, 0x0d, 0xdd, 0x0c,
-	0x42, 0x8a, 0xda, 0x50, 0xd6, 0x7a, 0x9d, 0xd2, 0x41, 0xe9, 0x79, 0x15, 0x97, 0xb5, 0x1e, 0xda,
-	0x87, 0x86, 0x31, 0x23, 0xa1, 0x45, 0x6d, 0x4a, 0x3a, 0xe5, 0x83, 0xd2, 0xf3, 0x06, 0x5e, 0x00,
-	0xe8, 0x19, 0xb4, 0xb4, 0x29, 0x25, 0xe1, 0xd4, 0xf6, 0x63, 0x8b, 0x0a, 0xb7, 0xc8, 0x83, 0xe8,
-	0x00, 0x9a, 0xa6, 0xed, 0xfc, 0x89, 0xd0, 0x6e, 0x30, 0x9f, 0xd2, 0xce, 0xfa, 0x41, 0xe9, 0xf9,
-	0x3a, 0xce, 0x42, 0xe8, 0x04, 0xb6, 0x14, 0xdf, 0x0f, 0x1c, 0x9b, 0x12, 0xd7, 0x98, 0xce, 0x35,
-	0x37, 0xea, 0x54, 0x0f, 0x2a, 0xcf, 0x9b, 0x47, 0xfb, 0x87, 0xf1, 0x76, 0xcd, 0x60, 0x9a, 0x1a,
-	0x60, 0x12, 0x05, 0xf3, 0xd0, 0x21, 0x11, 0x5e, 0x26, 0xa1, 0x9f, 0x61, 0x3b, 0x85, 0xfa, 0x64,
-	0xc2, 0x76, 0x14, 0x75, 0x36, 0x1e, 0xe0, 0x69, 0x95, 0x96, 0xf3, 0xc5, 0x1f, 0x58, 0x54, 0xb5,
-	0xaf, 0xf2, 0x95, 0xd0, 0xe4, 0x53, 0xd8, 0x29, 0xb4, 0x45, 0x32, 0x6c, 0x5a, 0x24, 0xf4, 0x6c,
-	0x5f, 0x9f, 0x4f, 0x2e, 0x48, 0xc8, 0x13, 0xdf, 0xc0, 0x39, 0x8c, 0x97, 0xc4, 0xe5, 0xb9, 0x67,
-	0x25, 0x71, 0xe5, 0xdf, 0x43, 0x4d, 0xd7, 0xb5, 0xaf, 0xaf, 0x96, 0xfc, 0x9f, 0x12, 0x54, 0x0c,
-	0x7f, 0x95, 0xb5, 0x1c, 0x44, 0xb9, 0x20, 0x88, 0x9c, 0xe7, 0xca, 0x17, 0xfb, 0x60, 0xbd, 0xa8,
-	0x0f, 0xd8, 0xba, 0x66, 0xa7, 0xc6, 0x55, 0x65, 0xcd, 0x44, 0x2f, 0xa1, 0x2e, 0x36, 0x92, 0x94,
-	0xbb, 0x2d, 0x12, 0x2b, 0x60, 0x9c, 0xea, 0x99, 0xad, 0x68, 0xd1, 0xa4, 0xa0, 0x89, 0xad, 0x80,
-	0x71, 0xaa, 0x97, 0xff, 0x52, 0x82, 0x8e, 0xe1, 0xd3, 0x95, 0x74, 0x0f, 0xef, 0x66, 0x04, 0xbd,
-	0x85, 0x75, 0x7a, 0x37, 0x23, 0x7c, 0xfb, 0xed, 0xa3, 0x67, 0xc2, 0xc9, 0x7d, 0xe6, 0x87, 0xec,
-	0x07, 0x73, 0x86, 0xfc, 0x0a, 0xd6, 0xb9, 0x87, 0x26, 0xd4, 0x46, 0xfa, 0xa9, 0x6e, 0x7c, 0xd0,
-	0xa5, 0x35, 0xb4, 0x09, 0x75, 0x65, 0x30, 0x30, 0xba, 0x63, 0xad, 0x27, 0x95, 0x98, 0xd4, 0x57,
-	0xcf, 0xc6, 0xa6, 0x81, 0x87, 0x52, 0x59, 0xfe, 0x7b, 0x09, 0x1e, 0x17, 0x39, 0x46, 0x28, 0xf6,
-	0x24, 0xaa, 0x1d, 0x7b, 0xdd, 0x87, 0x86, 0x19, 0x4c, 0xd9, 0x06, 0x44, 0xb1, 0x5b, 0x78, 0x01,
-	0xa0, 0xc7, 0x50, 0xe5, 0x2d, 0xce, 0x53, 0xdf, 0xc2, 0xb1, 0x80, 0x76, 0x61, 0x83, 0xe9, 0xf5,
-	0x80, 0xe7, 0xbb, 0x85, 0x85, 0x84, 0x7e, 0x05, 0x90, 0xac, 0xa5, 0xb9, 0x9d, 0x2a, 0x2f, 0x74,
-	0x06, 0x61, 0xbc, 0x13, 0x3f, 0xb8, 0xd5, 0xdc, 0xce, 0x06, 0x7f, 0x17, 0x85, 0x24, 0x63, 0xd8,
-	0x29, 0x8a, 0x37, 0x42, 0xef, 0xa0, 0x11, 0x26, 0x42, 0xa7, 0xc4, 0xd3, 0xff, 0xe4, 0x33, 0x99,
-	0xc3, 0x0b, 0x6b, 0xf9, 0x7f, 0x15, 0xa8, 0x18, 0xfa, 0xe8, 0x17, 0x6b, 0xba, 0x4c, 0x5e, 0x7b,
-	0x22, 0x15, 0x0b, 0x80, 0x69, 0xdf, 0xdf, 0x2a, 0xae, 0x1b, 0x92, 0x28, 0xea, 0xd4, 0xe3, 0x15,
-	0x52, 0x20, 0x93, 0xdf, 0x06, 0x27, 0x26, 0xf9, 0x7d, 0x09, 0xf5, 0x88, 0x84, 0x37, 0x1e, 0xcb,
-	0x06, 0xe4, 0x9a, 0xd1, 0x8a, 0x61, 0x9c, 0xea, 0x51, 0x0f, 0xbe, 0xd5, 0x26, 0xf6, 0x15, 0xb1,
-	0x82, 0x4b, 0x7a, 0x6b, 0x87, 0x44, 0xfd, 0xf3, 0x8c, 0x38, 0x94, 0xb8, 0x16, 0x71, 0xa8, 0x17,
-	0x4c, 0xa3, 0x4e, 0x93, 0xbb, 0xfe, 0xbc, 0xd1, 0x8a, 0x17, 0x4c, 0x1c, 0xe2, 0xdd, 0x64, 0xbc,
-	0x6c, 0x16, 0x78, 0x59, 0x36, 0x42, 0x3f, 0xc2, 0x23, 0xc5, 0xa1, 0xde, 0x0d, 0xe1, 0x66, 0xea,
-	0x94, 0x7a, 0xf4, 0x4e, 0x73, 0x3b, 0x2d, 0xce, 0x2d, 0x52, 0xa1, 0x9f, 0x60, 0xb7, 0x1b, 0x4c,
-	0x26, 0x1e, 0xa5, 0xc4, 0xcd, 0x93, 0xda, 0x9c, 0x74, 0x8f, 0x56, 0xfe, 0x6f, 0x19, 0x6a, 0x22,
-	0x17, 0xac, 0xdb, 0x75, 0x7b, 0x92, 0x76, 0x3b, 0x7b, 0xce, 0xe7, 0xbd, 0xbc, 0x9c, 0xf7, 0xb8,
-	0xdb, 0xad, 0xa9, 0xa8, 0x79, 0x2c, 0x30, 0x3f, 0xd6, 0xd0, 0xbe, 0xe2, 0x65, 0xae, 0x62, 0xfe,
-	0xcc, 0xb0, 0x2e, 0xc3, 0xe2, 0xc2, 0xf2, 0x67, 0xd6, 0xfd, 0x3a, 0x21, 0x6e, 0xa4, 0xda, 0xb3,
-	0xc0, 0xe7, 0x1d, 0x5e, 0xc7, 0x19, 0x84, 0xad, 0xcd, 0xa5, 0xde, 0xb5, 0x33, 0xe3, 0xd3, 0xa8,
-	0x8e, 0x17, 0x40, 0xaa, 0xd5, 0xae, 0x26, 0x33, 0xde, 0x11, 0x89, 0x96, 0x01, 0xa8, 0x03, 0x35,
-	0x71, 0x40, 0x88, 0x96, 0x48, 0x44, 0xb6, 0x2a, 0x77, 0x1f, 0xb7, 0x22, 0xf0, 0xc0, 0x33, 0x08,
-	0xf3, 0xcb, 0xfc, 0xc7, 0xea, 0x66, 0xbc, 0xe3, 0x14, 0x58, 0xed, 0xe5, 0xcd, 0x7b, 0x7a, 0x59,
-	0xeb, 0x9f, 0x99, 0xb1, 0x45, 0x2b, 0xf6, 0x91, 0x02, 0xb2, 0x0d, 0x8f, 0x0d, 0x7d, 0x34, 0x0c,
-	0xed, 0xcb, 0x4b, 0xcf, 0xb1, 0x9c, 0x6b, 0xe2, 0xce, 0x7d, 0x12, 0x46, 0x48, 0x83, 0x2d, 0xca,
-	0xc0, 0x05, 0xc4, 0x4b, 0xd1, 0x3c, 0x7a, 0x7a, 0x98, 0xbb, 0x0c, 0xac, 0x30, 0xf1, 0x32, 0x4f,
-	0x7e, 0x0e, 0xeb, 0x86, 0x3e, 0x8a, 0xd0, 0x01, 0x54, 0x3d, 0x4a, 0x26, 0xc9, 0x2c, 0x80, 0x64,
-	0x16, 0xe8, 0x23, 0x1c, 0x2b, 0xe4, 0x1f, 0xa1, 0x6e, 0x25, 0xaf, 0xc0, 0xb3, 0xbc, 0xf5, 0xf2,
-	0xbb, 0x92, 0x32, 0x80, 0xf1, 0xc9, 0xa7, 0x39, 0x89, 0xe8, 0x43, 0x0e, 0x46, 0xf9, 0x25, 0x80,
-	0x69, 0xe8, 0x09, 0x23, 0x37, 0x40, 0x4b, 0x4b, 0x03, 0x54, 0xfe, 0x57, 0x05, 0x1a, 0x8a, 0x6f,
-	0x87, 0x13, 0x36, 0x6c, 0xe5, 0x7f, 0x56, 0xa0, 0xca, 0x1e, 0x22, 0x54, 0x83, 0xca, 0xc0, 0xb0,
-	0xa4, 0x35, 0xd4, 0x06, 0xe8, 0x7d, 0xd4, 0xf4, 0xfe, 0xb8, 0xaf, 0x58, 0xa6, 0x54, 0x42, 0x2d,
-	0x68, 0x18, 0xfa, 0x68, 0xac, 0x0c, 0x14, 0x7c, 0x26, 0x95, 0xd1, 0x37, 0xf0, 0x88, 0x89, 0xd6,
-	0x50, 0xc1, 0xc3, 0x91, 0x39, 0x3e, 0x51, 0xb4, 0xc1, 0x08, 0xab, 0x52, 0x05, 0xed, 0x02, 0xe2,
-	0x0a, 0xad, 0xaf, 0x2b, 0x83, 0x71, 0x4f, 0xed, 0x63, 0xa5, 0xa7, 0x4a, 0xeb, 0x09, 0xa1, 0x87,
-	0xb5, 0x93, 0xe1, 0xd8, 0x38, 0x19, 0x7f, 0xd0, 0xf4, 0x9e, 0xf1, 0x41, 0xaa, 0xa2, 0x7d, 0xe8,
-	0x30, 0xc5, 0xc0, 0xb0, 0x2c, 0x86, 0x1b, 0x67, 0x5d, 0x6d, 0xdc, 0x7d, 0xaf, 0xe8, 0xba, 0x3a,
-	0x90, 0x36, 0xd2, 0x75, 0xb8, 0x3b, 0x2b, 0x5d, 0xa7, 0x86, 0x5e, 0xc0, 0xf7, 0x4c, 0x31, 0xc4,
-	0x8a, 0x6e, 0x9d, 0x69, 0x96, 0xa5, 0x19, 0xfa, 0x58, 0xd3, 0x87, 0x2a, 0x3e, 0x51, 0xb1, 0xaa,
-	0x77, 0xd5, 0xf1, 0x07, 0x05, 0xeb, 0x9a, 0xde, 0x97, 0xea, 0x68, 0x0f, 0x76, 0x79, 0xe8, 0xdd,
-	0xa1, 0x76, 0xae, 0x0c, 0x99, 0x61, 0xe2, 0xa6, 0x81, 0x3a, 0xbc, 0x49, 0xc6, 0x26, 0x36, 0xba,
-	0xaa, 0x65, 0xb1, 0xfd, 0xaa, 0x18, 0x1b, 0x58, 0x02, 0x74, 0x00, 0xfb, 0xd9, 0xb8, 0x4e, 0xd5,
-	0x8f, 0x63, 0xeb, 0xa3, 0xde, 0x4d, 0xb9, 0x4d, 0xb4, 0x03, 0xdb, 0xcc, 0x42, 0x1b, 0x8e, 0xc6,
-	0xa6, 0xa1, 0xb3, 0x5c, 0x0c, 0x2d, 0x69, 0x13, 0x6d, 0x43, 0x2b, 0xcd, 0x14, 0xa3, 0x4b, 0xad,
-	0x65, 0xe8, 0x58, 0x6a, 0x27, 0x1b, 0x4b, 0x20, 0xb3, 0x3b, 0x66, 0xbb, 0x90, 0xb6, 0x92, 0x7c,
-	0xe4, 0x14, 0x5d, 0x11, 0x95, 0x84, 0x10, 0xb4, 0xb3, 0xda, 0x13, 0x4d, 0xda, 0x46, 0x8f, 0x60,
-	0x2b, 0x8b, 0x29, 0x67, 0x9a, 0x84, 0xe4, 0xb7, 0xd0, 0xe6, 0xf5, 0x35, 0xed, 0xd0, 0x9e, 0x10,
-	0x4a, 0x42, 0x24, 0x41, 0xe5, 0x94, 0xdc, 0x89, 0xce, 0x61, 0x8f, 0x6c, 0xae, 0x9c, 0xdb, 0xfe,
-	0x3c, 0xb9, 0x1a, 0xc5, 0x82, 0xfc, 0xb7, 0x12, 0xf7, 0xc7, 0xd9, 0x99, 0x66, 0x4a, 0xbb, 0x45,
-	0x78, 0x58, 0x00, 0x0f, 0x3a, 0xbb, 0x76, 0x61, 0x83, 0xbd, 0x96, 0xf3, 0x48, 0x0c, 0x31, 0x21,
-	0xa1, 0xdf, 0x01, 0xa4, 0x21, 0x46, 0x9d, 0x75, 0xfe, 0x46, 0xec, 0x88, 0x37, 0x22, 0xbf, 0x01,
-	0x9c, 0x31, 0x94, 0x3f, 0xc1, 0x96, 0x31, 0x18, 0xe6, 0x62, 0x3c, 0x80, 0x26, 0x1f, 0x0f, 0x97,
-	0xb6, 0x43, 0xc4, 0xd1, 0xda, 0xc2, 0x59, 0x28, 0x9d, 0x2a, 0x4c, 0xe4, 0x3b, 0x29, 0x67, 0xa6,
-	0x4a, 0x02, 0xde, 0x17, 0x29, 0xbb, 0x46, 0xb5, 0xce, 0x49, 0x18, 0x79, 0xc1, 0x54, 0xec, 0xa9,
-	0x03, 0xb5, 0x9b, 0x18, 0x10, 0x39, 0x49, 0x44, 0x96, 0xaf, 0x8b, 0xb9, 0xe7, 0xbb, 0x43, 0x6f,
-	0x92, 0x5e, 0x3c, 0x53, 0x80, 0xcd, 0x46, 0x87, 0x9f, 0x13, 0xef, 0xed, 0xe8, 0x5a, 0xac, 0x92,
-	0x41, 0x18, 0xfb, 0xca, 0xa3, 0x22, 0x88, 0xf8, 0x14, 0x5f, 0x00, 0xf2, 0x5b, 0xa8, 0x0f, 0x82,
-	0xab, 0x01, 0xb9, 0x21, 0x3e, 0xab, 0xa0, 0xcf, 0x1e, 0xc4, 0xfa, 0xb1, 0xc0, 0x76, 0xe0, 0xd8,
-	0xbe, 0x2f, 0x2a, 0x51, 0xc7, 0x42, 0x92, 0x55, 0xa8, 0x63, 0x12, 0xcd, 0x82, 0x69, 0x44, 0xd0,
-	0x53, 0x68, 0x46, 0xdc, 0xdf, 0xd8, 0x09, 0x5c, 0x22, 0x2e, 0x22, 0x10, 0x43, 0xdd, 0xc0, 0x25,
-	0x6c, 0x73, 0x13, 0x12, 0x45, 0xf6, 0x55, 0xb2, 0x81, 0x44, 0x94, 0xff, 0x5a, 0x82, 0x26, 0x9b,
-	0xfe, 0x49, 0xe2, 0x5f, 0xc0, 0x86, 0x31, 0x9d, 0x63, 0xf2, 0x49, 0xcc, 0xd1, 0xed, 0xcc, 0xf8,
-	0x8b, 0x4d, 0xb0, 0x30, 0x40, 0xef, 0x60, 0xd3, 0x9a, 0x5f, 0x28, 0xfc, 0xfc, 0x3d, 0xb7, 0x7d,
-	0xee, 0xb9, 0x9d, 0xd6, 0x3b, 0x55, 0xf1, 0x59, 0x84, 0x73, 0xa6, 0xac, 0xc9, 0xfa, 0x61, 0x30,
-	0x9f, 0x25, 0xa7, 0x64, 0x9c, 0xb6, 0x1c, 0x26, 0x9f, 0x42, 0x95, 0x5d, 0xdd, 0x22, 0xf4, 0x2d,
-	0xc0, 0xa5, 0x1f, 0xdc, 0x8e, 0x1d, 0xfe, 0x85, 0x25, 0xa6, 0x1f, 0x43, 0xe2, 0xef, 0xab, 0xef,
-	0xa0, 0xca, 0x04, 0x76, 0xd4, 0xb2, 0x7e, 0x6b, 0x1d, 0x26, 0x9f, 0x88, 0x8c, 0x8d, 0x63, 0x9d,
-	0xfc, 0x14, 0x6a, 0xac, 0x5a, 0xc1, 0x9c, 0xb2, 0x34, 0xbb, 0xc4, 0xb7, 0xef, 0x84, 0xa7, 0x58,
-	0x90, 0x6b, 0x50, 0x55, 0x27, 0x33, 0x7a, 0xf7, 0xf2, 0x35, 0xb4, 0xf3, 0xa1, 0xa3, 0x3a, 0xac,
-	0xff, 0x6c, 0x68, 0xec, 0x42, 0xdc, 0x80, 0xea, 0x40, 0x55, 0xce, 0x55, 0xa9, 0x84, 0x00, 0x36,
-	0x18, 0x78, 0xfe, 0x46, 0x2a, 0x1f, 0xfd, 0xa3, 0x09, 0xd5, 0xe3, 0x63, 0xcb, 0x9b, 0xa0, 0x57,
-	0x50, 0x13, 0x5d, 0x85, 0x36, 0x45, 0x1e, 0xb8, 0xd7, 0xbd, 0xc7, 0x42, 0xca, 0xf5, 0x9c, 0xbc,
-	0x86, 0x5e, 0x43, 0xd3, 0x22, 0x34, 0x6d, 0x81, 0x2d, 0x61, 0x96, 0x00, 0x7b, 0xcb, 0x80, 0xbc,
-	0x86, 0x9e, 0xc1, 0x46, 0x9f, 0x50, 0xf6, 0xad, 0x93, 0x5f, 0x02, 0x16, 0x97, 0x56, 0x79, 0x0d,
-	0xfd, 0x11, 0x3a, 0xb1, 0x55, 0xc1, 0x8d, 0xf7, 0xe9, 0x17, 0x3e, 0x0c, 0xf6, 0xf6, 0x3f, 0x63,
-	0x10, 0xc9, 0x6b, 0xe8, 0x07, 0x00, 0x33, 0xb8, 0x25, 0x61, 0x30, 0x5d, 0x0d, 0x23, 0x89, 0x38,
-	0x69, 0x4e, 0x79, 0x0d, 0x1d, 0x42, 0xd3, 0xba, 0x9e, 0x53, 0x37, 0xb8, 0x7d, 0x98, 0xfd, 0x6f,
-	0xa0, 0x81, 0xc9, 0x45, 0x10, 0xd0, 0x07, 0x59, 0xb3, 0x82, 0xd1, 0x60, 0x76, 0x85, 0xcd, 0x2e,
-	0x3b, 0x75, 0x49, 0xf8, 0x65, 0xca, 0x11, 0x6c, 0x59, 0xd4, 0x0e, 0xe9, 0xd7, 0x70, 0x7e, 0x82,
-	0x6d, 0x4c, 0xa2, 0x25, 0x56, 0x72, 0xdc, 0x8b, 0xde, 0x2a, 0xe2, 0xbd, 0x88, 0xcb, 0xa5, 0x8f,
-	0xd0, 0xea, 0xab, 0xb4, 0x97, 0xb9, 0x5c, 0xc8, 0x6b, 0xe8, 0xd7, 0xec, 0x02, 0x46, 0xf9, 0x25,
-	0x24, 0x1f, 0x4e, 0x73, 0x61, 0x16, 0xc5, 0xf9, 0xec, 0x13, 0x9a, 0x5e, 0x41, 0x8a, 0x43, 0x4f,
-	0xd4, 0x3c, 0xf4, 0x36, 0xf3, 0x3b, 0x9d, 0xa7, 0x94, 0x82, 0x50, 0x0a, 0x78, 0x6f, 0x32, 0x75,
-	0x2b, 0x8e, 0xff, 0x9e, 0xdc, 0x0a, 0x92, 0xe2, 0xfb, 0x05, 0x9b, 0x29, 0xe0, 0xbc, 0x83, 0xed,
-	0xcc, 0x42, 0x91, 0x31, 0x35, 0x0d, 0x3d, 0x5d, 0x6e, 0x71, 0x0d, 0x2a, 0x5e, 0x2e, 0x6d, 0xc5,
-	0x07, 0x87, 0xf8, 0x1a, 0xda, 0x82, 0xf3, 0xe0, 0x08, 0xdf, 0x82, 0xb4, 0x58, 0xe6, 0xab, 0x02,
-	0xfc, 0x2d, 0x6c, 0x8a, 0xbe, 0x89, 0x6f, 0xe8, 0x0f, 0x0b, 0xf1, 0x0d, 0x34, 0x05, 0x8b, 0x5f,
-	0xdc, 0x1f, 0x46, 0x3a, 0x86, 0x1d, 0x8b, 0xd7, 0x99, 0x1f, 0xa5, 0xda, 0xd4, 0xf5, 0x1c, 0x9b,
-	0x8d, 0x31, 0xb4, 0xbb, 0xa0, 0x67, 0x4f, 0xd9, 0xcf, 0xf8, 0x60, 0x2f, 0xfe, 0x3d, 0x3e, 0xf2,
-	0x27, 0x75, 0x91, 0x8f, 0x1f, 0xa0, 0xde, 0x27, 0x34, 0x1e, 0xde, 0x05, 0x91, 0x27, 0xc9, 0xe6,
-	0x06, 0x3c, 0xb7, 0x5b, 0xdd, 0x6b, 0x7b, 0x7a, 0x45, 0xd8, 0x39, 0x14, 0x7f, 0x0c, 0x20, 0x61,
-	0x92, 0x39, 0x99, 0x8a, 0x16, 0x3a, 0x85, 0x6f, 0xe2, 0xc6, 0x5e, 0xfd, 0x30, 0x28, 0x58, 0xf7,
-	0xc9, 0x02, 0x5a, 0xb1, 0x97, 0xd7, 0x8e, 0xbf, 0xff, 0xc3, 0x77, 0x57, 0x1e, 0xbd, 0x9e, 0x5f,
-	0x1c, 0x3a, 0xc1, 0x84, 0xff, 0xcf, 0xe8, 0x04, 0xa1, 0x2b, 0xfe, 0x98, 0x4c, 0xff, 0xa2, 0xbc,
-	0xd8, 0xe0, 0xff, 0x2b, 0xbe, 0xf9, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xce, 0x0d, 0xfb, 0x2c,
-	0xb6, 0x14, 0x00, 0x00,
+	// 2026 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x5d, 0x72, 0xdb, 0xc8,
+	0x11, 0x16, 0xff, 0x44, 0xb2, 0x29, 0x52, 0xd0, 0xd8, 0xd2, 0xa2, 0x64, 0xed, 0x5a, 0x85, 0xf5,
+	0xa6, 0x64, 0x57, 0x56, 0x5e, 0xdb, 0xc9, 0xc6, 0x7e, 0x84, 0x48, 0x8a, 0xc6, 0x8a, 0x02, 0x58,
+	0x03, 0x52, 0x2e, 0x27, 0x0f, 0x2c, 0x88, 0x18, 0x49, 0xa8, 0x80, 0x00, 0x0d, 0x0c, 0xa5, 0xe8,
+	0x00, 0x39, 0x41, 0x1e, 0xf2, 0x9e, 0x03, 0xe4, 0x2c, 0x39, 0x41, 0xf2, 0x94, 0x03, 0xa4, 0x72,
+	0x81, 0xd4, 0x0c, 0x06, 0x20, 0x40, 0x42, 0x36, 0xfd, 0x94, 0x17, 0xd6, 0xf4, 0xd7, 0x3f, 0xd3,
+	0xd3, 0xdd, 0xd3, 0xd3, 0x20, 0xec, 0x5a, 0x33, 0xe7, 0xe5, 0xe5, 0x65, 0xe8, 0x4c, 0xa3, 0xdf,
+	0xe3, 0x59, 0xe0, 0x53, 0x1f, 0x55, 0x38, 0xb1, 0xff, 0xe4, 0xd6, 0x77, 0xe9, 0x8d, 0x35, 0xe6,
+	0x60, 0xf8, 0xd2, 0x9f, 0x11, 0xcf, 0x77, 0x69, 0x24, 0xb3, 0x7f, 0x98, 0x65, 0x52, 0x32, 0xb9,
+	0x61, 0xeb, 0x2b, 0xc7, 0x25, 0x91, 0x84, 0xf2, 0xaf, 0x22, 0x54, 0x07, 0x86, 0x3e, 0xf0, 0x03,
+	0x8a, 0x5a, 0x50, 0xd4, 0x3a, 0x72, 0xe1, 0xb0, 0x70, 0x54, 0xc1, 0x45, 0xad, 0x83, 0x0e, 0xa0,
+	0x6e, 0xcc, 0x48, 0x60, 0x52, 0x8b, 0x12, 0xb9, 0x78, 0x58, 0x38, 0xaa, 0xe3, 0x05, 0x80, 0x9e,
+	0x41, 0x53, 0xf3, 0x28, 0x09, 0x3c, 0xcb, 0x8d, 0x24, 0x4a, 0x5c, 0x22, 0x0b, 0xa2, 0x43, 0x68,
+	0x0c, 0xac, 0xc9, 0x1f, 0x09, 0x6d, 0xfb, 0x73, 0x8f, 0xca, 0xe5, 0xc3, 0xc2, 0x51, 0x19, 0xa7,
+	0x21, 0x74, 0x0a, 0xdb, 0xaa, 0xeb, 0xfa, 0x13, 0x8b, 0x12, 0xdb, 0xf0, 0xe6, 0x9a, 0x1d, 0xca,
+	0x95, 0xc3, 0xd2, 0x51, 0xe3, 0xf5, 0xc1, 0x71, 0x74, 0xdc, 0x81, 0xef, 0x25, 0x02, 0x98, 0x84,
+	0xfe, 0x3c, 0x98, 0x90, 0x10, 0x2f, 0x2b, 0xa1, 0x5f, 0x60, 0x27, 0x81, 0x7a, 0x64, 0xca, 0x4e,
+	0x14, 0xca, 0x9b, 0x6b, 0x58, 0x5a, 0x55, 0xcb, 0xd8, 0xe2, 0x0b, 0xe6, 0x55, 0xf5, 0xab, 0x6c,
+	0xc5, 0x6a, 0xca, 0x19, 0xec, 0xe6, 0xca, 0x22, 0x05, 0xb6, 0x4c, 0x12, 0x38, 0x96, 0xab, 0xcf,
+	0xa7, 0x97, 0x24, 0xe0, 0x81, 0xaf, 0xe3, 0x0c, 0xc6, 0x53, 0x62, 0xf3, 0xd8, 0xb3, 0x94, 0xd8,
+	0xca, 0xef, 0xa0, 0xaa, 0xeb, 0xda, 0xd7, 0x67, 0x4b, 0xf9, 0x77, 0x01, 0x4a, 0x86, 0xbb, 0xaa,
+	0xb5, 0xec, 0x44, 0x31, 0xc7, 0x89, 0x8c, 0xe5, 0xd2, 0x17, 0xeb, 0xa0, 0x9c, 0x57, 0x07, 0x6c,
+	0xdf, 0x81, 0x5c, 0xe5, 0xac, 0xa2, 0x36, 0x40, 0x2f, 0xa0, 0x26, 0x0e, 0x12, 0xa7, 0xbb, 0x25,
+	0x02, 0x2b, 0x60, 0x9c, 0xf0, 0x99, 0xac, 0x28, 0xd1, 0x38, 0xa1, 0xb1, 0xac, 0x80, 0x71, 0xc2,
+	0x57, 0xfe, 0x5c, 0x00, 0xd9, 0x70, 0xe9, 0x4a, 0xb8, 0x87, 0xf7, 0x33, 0x82, 0xde, 0x42, 0x99,
+	0xde, 0xcf, 0x08, 0x3f, 0x7e, 0xeb, 0xf5, 0x33, 0x61, 0xe4, 0x21, 0xf1, 0x63, 0xf6, 0x83, 0xb9,
+	0x86, 0xf2, 0x12, 0xca, 0xdc, 0x42, 0x03, 0xaa, 0x23, 0xfd, 0x4c, 0x37, 0x3e, 0xe8, 0xd2, 0x06,
+	0xda, 0x82, 0x9a, 0xda, 0xef, 0x1b, 0xed, 0xb1, 0xd6, 0x91, 0x0a, 0x8c, 0xea, 0x75, 0xcf, 0xc7,
+	0x03, 0x03, 0x0f, 0xa5, 0xa2, 0xf2, 0xf7, 0x02, 0x3c, 0xce, 0x33, 0x8c, 0x50, 0x64, 0x49, 0x64,
+	0x3b, 0xb2, 0x7a, 0x00, 0xf5, 0x81, 0xef, 0xb1, 0x03, 0x88, 0x64, 0x37, 0xf1, 0x02, 0x40, 0x8f,
+	0xa1, 0xc2, 0x4b, 0x9c, 0x87, 0xbe, 0x89, 0x23, 0x02, 0xed, 0xc1, 0x26, 0xe3, 0xeb, 0x3e, 0x8f,
+	0x77, 0x13, 0x0b, 0x0a, 0x7d, 0x07, 0x10, 0xef, 0xa5, 0xd9, 0x72, 0x85, 0x27, 0x3a, 0x85, 0x30,
+	0xbd, 0x53, 0xd7, 0xbf, 0xd3, 0x6c, 0x79, 0x93, 0xdf, 0x45, 0x41, 0x29, 0x18, 0x76, 0xf3, 0xfc,
+	0x0d, 0xd1, 0x3b, 0xa8, 0x07, 0x31, 0x21, 0x17, 0x78, 0xf8, 0x9f, 0x7c, 0x26, 0x72, 0x78, 0x21,
+	0xad, 0xfc, 0xa5, 0x0c, 0x25, 0x43, 0x1f, 0xfd, 0xdf, 0x8a, 0x2e, 0x15, 0xd7, 0x8e, 0x08, 0xc5,
+	0x02, 0x60, 0xdc, 0xf7, 0x77, 0xaa, 0x6d, 0x07, 0x24, 0x0c, 0xe5, 0x5a, 0xb4, 0x43, 0x02, 0xa4,
+	0xe2, 0x5b, 0xe7, 0x8a, 0x71, 0x7c, 0x5f, 0x40, 0x2d, 0x24, 0xc1, 0xad, 0xc3, 0xa2, 0x01, 0x99,
+	0x62, 0x34, 0x23, 0x18, 0x27, 0x7c, 0xd4, 0x81, 0x6f, 0xb5, 0xa9, 0x75, 0x4d, 0x4c, 0xff, 0x8a,
+	0xde, 0x59, 0x01, 0xe9, 0xfe, 0x69, 0x46, 0x26, 0x94, 0xd8, 0x26, 0x99, 0x50, 0xc7, 0xf7, 0x42,
+	0xb9, 0xc1, 0x4d, 0x7f, 0x5e, 0x68, 0xc5, 0x0a, 0x26, 0x13, 0xe2, 0xdc, 0xa6, 0xac, 0x6c, 0xe5,
+	0x58, 0x59, 0x16, 0x42, 0x3f, 0xc1, 0x23, 0x75, 0x42, 0x9d, 0x5b, 0xc2, 0xc5, 0xba, 0x1e, 0x75,
+	0xe8, 0xbd, 0x66, 0xcb, 0x4d, 0xae, 0x9b, 0xc7, 0x42, 0x3f, 0xc3, 0x5e, 0xdb, 0x9f, 0x4e, 0x1d,
+	0x4a, 0x89, 0x9d, 0x55, 0x6a, 0x71, 0xa5, 0x07, 0xb8, 0xe8, 0x3b, 0x28, 0xcf, 0x3d, 0x27, 0x94,
+	0xb7, 0x79, 0x74, 0x40, 0x44, 0x67, 0xa4, 0x6b, 0x98, 0xe3, 0x4a, 0x08, 0xa5, 0x91, 0xae, 0xad,
+	0x14, 0x85, 0x28, 0xf3, 0x8e, 0xe8, 0x76, 0x11, 0x21, 0x50, 0xd3, 0x13, 0x25, 0x10, 0x11, 0xec,
+	0x12, 0x9d, 0x13, 0xad, 0x23, 0x4a, 0x9f, 0xaf, 0xb3, 0x05, 0x53, 0x59, 0xee, 0x7f, 0xff, 0x29,
+	0x42, 0x55, 0x24, 0x88, 0x69, 0xeb, 0xd6, 0x34, 0xb9, 0x82, 0x6c, 0x9d, 0x2d, 0x86, 0xe2, 0x72,
+	0x31, 0x3c, 0xe8, 0x85, 0x39, 0xb4, 0xae, 0xb9, 0x17, 0x15, 0xcc, 0xd7, 0x0c, 0x6b, 0x33, 0x2c,
+	0xaa, 0x36, 0xbe, 0x66, 0x57, 0x52, 0x27, 0xc4, 0x0e, 0xbb, 0xd6, 0xcc, 0x77, 0xf9, 0xb5, 0xab,
+	0xe1, 0x14, 0xc2, 0xf6, 0xe6, 0x54, 0xe7, 0x66, 0x32, 0xe3, 0x2d, 0xb2, 0x86, 0x17, 0x40, 0xc2,
+	0xd5, 0xae, 0xa7, 0x33, 0x5e, 0xa6, 0x31, 0x97, 0x01, 0x48, 0x86, 0xaa, 0x78, 0xb5, 0x44, 0x9d,
+	0xc6, 0x24, 0xdb, 0x95, 0x9b, 0x8f, 0x02, 0x02, 0xdc, 0xf1, 0x14, 0xc2, 0xec, 0x32, 0xfb, 0x11,
+	0xbb, 0x11, 0x9d, 0x38, 0x01, 0x56, 0x2f, 0xd8, 0xd6, 0x03, 0x17, 0x4c, 0xeb, 0x9d, 0x0f, 0x22,
+	0x89, 0x66, 0x64, 0x23, 0x01, 0x14, 0x0b, 0x1e, 0x1b, 0xfa, 0x68, 0x18, 0x58, 0x57, 0x57, 0xce,
+	0xc4, 0x9c, 0xdc, 0x10, 0x7b, 0xee, 0x92, 0x20, 0x44, 0x1a, 0x6c, 0x53, 0x06, 0x2e, 0x20, 0x9e,
+	0x8a, 0xc6, 0xeb, 0xa7, 0xc7, 0x99, 0x09, 0x65, 0x45, 0x13, 0x2f, 0xeb, 0x29, 0x47, 0x50, 0x36,
+	0xf4, 0x51, 0x88, 0x0e, 0xa1, 0xe2, 0x50, 0x32, 0x8d, 0x1b, 0x54, 0x5c, 0x74, 0x86, 0x3e, 0xc2,
+	0x11, 0x43, 0xf9, 0x09, 0x6a, 0x66, 0x7c, 0x2f, 0x9f, 0x65, 0xa5, 0x97, 0x2f, 0xb0, 0xd0, 0x38,
+	0x82, 0xf2, 0x48, 0xd7, 0x1e, 0xb4, 0xcd, 0x0a, 0x3a, 0xb1, 0x0d, 0x6c, 0x27, 0xf2, 0x69, 0x4e,
+	0x42, 0xba, 0xce, 0xbb, 0xae, 0xbc, 0x00, 0x18, 0x18, 0x7a, 0xac, 0x91, 0xe9, 0xff, 0x85, 0xa5,
+	0xfe, 0xaf, 0xfc, 0xb3, 0x04, 0x75, 0xd5, 0xb5, 0x82, 0x29, 0x7b, 0x2b, 0x94, 0x7f, 0x94, 0xa0,
+	0xc2, 0x16, 0x21, 0xaa, 0x42, 0xa9, 0x6f, 0x98, 0xd2, 0x06, 0x6a, 0x01, 0x74, 0x3e, 0x6a, 0x7a,
+	0x6f, 0xdc, 0x53, 0xcd, 0x81, 0x54, 0x40, 0x4d, 0xa8, 0x1b, 0xfa, 0x68, 0xac, 0xf6, 0x55, 0x7c,
+	0x2e, 0x15, 0xd1, 0x37, 0xf0, 0x88, 0x91, 0xe6, 0x50, 0xc5, 0xc3, 0xd1, 0x60, 0x7c, 0xaa, 0x6a,
+	0xfd, 0x11, 0xee, 0x4a, 0x25, 0xb4, 0x07, 0x88, 0x33, 0xb4, 0x9e, 0xae, 0xf6, 0xc7, 0x9d, 0x6e,
+	0x0f, 0xab, 0x9d, 0xae, 0x54, 0x8e, 0x15, 0x3a, 0x58, 0x3b, 0x1d, 0x8e, 0x8d, 0xd3, 0xf1, 0x07,
+	0x4d, 0xef, 0x18, 0x1f, 0xa4, 0x0a, 0x3a, 0x00, 0x99, 0x31, 0xfa, 0x86, 0x69, 0x32, 0xdc, 0x38,
+	0x6f, 0x6b, 0xe3, 0xf6, 0x7b, 0x55, 0xd7, 0xbb, 0x7d, 0x69, 0x33, 0xd9, 0x87, 0x9b, 0x33, 0x93,
+	0x7d, 0xaa, 0xe8, 0x39, 0xfc, 0xc0, 0x18, 0x43, 0xac, 0xea, 0xe6, 0xb9, 0x66, 0x9a, 0x9a, 0xa1,
+	0x8f, 0x35, 0x7d, 0xd8, 0xc5, 0xa7, 0x5d, 0xdc, 0xd5, 0xdb, 0xdd, 0xf1, 0x07, 0x15, 0xeb, 0x9a,
+	0xde, 0x93, 0x6a, 0x68, 0x1f, 0xf6, 0xb8, 0xeb, 0xed, 0xa1, 0x76, 0xa1, 0x0e, 0x99, 0x60, 0x6c,
+	0xa6, 0x8e, 0x64, 0x5e, 0x4e, 0xe3, 0x01, 0x36, 0xda, 0x5d, 0xd3, 0x64, 0xe7, 0xed, 0x62, 0x6c,
+	0x60, 0x09, 0xd0, 0x21, 0x1c, 0xa4, 0xfd, 0x3a, 0xeb, 0x7e, 0x1c, 0x9b, 0x1f, 0xf5, 0x76, 0xa2,
+	0xdb, 0x40, 0xbb, 0xb0, 0xc3, 0x24, 0xb4, 0xe1, 0x68, 0x3c, 0x30, 0x74, 0x16, 0x8b, 0xa1, 0x29,
+	0x6d, 0xa1, 0x1d, 0x68, 0x26, 0x91, 0x62, 0xea, 0x52, 0x73, 0x19, 0x3a, 0x91, 0x5a, 0xf1, 0xc1,
+	0x62, 0x68, 0xd0, 0x1e, 0xb3, 0x53, 0x48, 0xdb, 0x71, 0x3c, 0x32, 0x8c, 0xb6, 0xf0, 0x4a, 0x42,
+	0x08, 0x5a, 0x69, 0xee, 0xa9, 0x26, 0xed, 0xa0, 0x47, 0xb0, 0x9d, 0xc6, 0xd4, 0x73, 0x4d, 0x42,
+	0xca, 0x5b, 0x68, 0xf1, 0xfc, 0x0e, 0xac, 0xc0, 0x9a, 0x12, 0x4a, 0x02, 0x24, 0x41, 0xe9, 0x8c,
+	0xdc, 0x8b, 0xca, 0x61, 0x4b, 0xd6, 0x81, 0x2e, 0x2c, 0x77, 0x1e, 0x4f, 0x76, 0x11, 0xa1, 0xfc,
+	0xad, 0xc0, 0xed, 0x71, 0xed, 0x54, 0x31, 0x25, 0xd5, 0x22, 0x2c, 0x2c, 0x80, 0xb5, 0x9e, 0xde,
+	0x3d, 0xd8, 0x64, 0x17, 0x78, 0x1e, 0x8a, 0x76, 0x27, 0x28, 0xf4, 0x5b, 0x80, 0xc4, 0xc5, 0x50,
+	0x2e, 0xf3, 0xdb, 0xb0, 0x2b, 0x6e, 0x43, 0xf6, 0x00, 0x38, 0x25, 0xa8, 0x7c, 0x82, 0x6d, 0xa3,
+	0x3f, 0xcc, 0xf8, 0x78, 0x08, 0x0d, 0xde, 0x48, 0xae, 0xac, 0x09, 0x11, 0x8f, 0x40, 0x13, 0xa7,
+	0xa1, 0xa4, 0xff, 0x30, 0x92, 0x9f, 0xa4, 0x98, 0xea, 0x3f, 0x31, 0xf8, 0x90, 0xa7, 0x6c, 0x0a,
+	0x6c, 0x5e, 0x90, 0x20, 0x74, 0x7c, 0x4f, 0x9c, 0x49, 0x86, 0xea, 0x6d, 0x04, 0x88, 0x98, 0xc4,
+	0x24, 0x8b, 0xd7, 0xe5, 0xdc, 0x71, 0xed, 0xa1, 0x33, 0x4d, 0xe6, 0xe6, 0x04, 0x60, 0x5d, 0x74,
+	0xc2, 0x9f, 0xb9, 0xf7, 0x56, 0x78, 0x23, 0x76, 0x49, 0x21, 0x4c, 0xfb, 0xda, 0xa1, 0xc2, 0x89,
+	0x68, 0x08, 0x59, 0x00, 0xca, 0x5b, 0xa8, 0xf5, 0xfd, 0xeb, 0x3e, 0xb9, 0x25, 0x2e, 0xcb, 0xa0,
+	0xcb, 0x16, 0x62, 0xff, 0x88, 0x60, 0x27, 0x98, 0x58, 0xae, 0x2b, 0x32, 0x51, 0xc3, 0x82, 0x52,
+	0xba, 0x50, 0xc3, 0x24, 0x9c, 0xf9, 0x5e, 0x48, 0xd0, 0x53, 0x68, 0x84, 0xdc, 0xde, 0x78, 0xe2,
+	0xdb, 0x44, 0x3c, 0x99, 0x10, 0x41, 0x6d, 0xdf, 0x26, 0xec, 0x70, 0x53, 0x12, 0x86, 0xd6, 0x75,
+	0x7c, 0x80, 0x98, 0x54, 0xfe, 0x5a, 0x80, 0x06, 0x7b, 0x27, 0xe2, 0xc0, 0x3f, 0x87, 0x4d, 0xc3,
+	0x9b, 0x63, 0xf2, 0x49, 0x74, 0xdc, 0x9d, 0x54, 0xa3, 0x8c, 0x44, 0xb0, 0x10, 0x40, 0xef, 0x60,
+	0xcb, 0x9c, 0x5f, 0xaa, 0x7c, 0x7c, 0xb8, 0xb0, 0x5c, 0x6e, 0xb9, 0x95, 0xe4, 0x3b, 0x61, 0xf1,
+	0x5e, 0x84, 0x33, 0xa2, 0xac, 0xc8, 0x7a, 0x81, 0x3f, 0x9f, 0xc5, 0xef, 0x69, 0x14, 0xb6, 0x0c,
+	0xa6, 0x9c, 0x41, 0x85, 0x4d, 0x9e, 0x21, 0xfa, 0x16, 0xe0, 0xca, 0xf5, 0xef, 0xc6, 0x13, 0xfe,
+	0x81, 0x28, 0xba, 0x1f, 0x43, 0xa2, 0xcf, 0xc3, 0xef, 0xa1, 0xc2, 0x08, 0xf6, 0x28, 0xb3, 0x7a,
+	0x6b, 0x1e, 0xc7, 0x5f, 0xb8, 0x4c, 0x1b, 0x47, 0x3c, 0xe5, 0x29, 0x54, 0x59, 0xb6, 0xfc, 0x39,
+	0x65, 0x61, 0xb6, 0x89, 0x6b, 0xdd, 0x0b, 0x4b, 0x11, 0xa1, 0x54, 0xa1, 0xd2, 0x9d, 0xce, 0xe8,
+	0xfd, 0x8b, 0x57, 0xd0, 0xca, 0xba, 0x8e, 0x6a, 0x50, 0xfe, 0xc5, 0xd0, 0xd8, 0x3c, 0x5f, 0x87,
+	0x4a, 0xbf, 0xab, 0x5e, 0x74, 0xa5, 0x02, 0x02, 0xd8, 0x64, 0xe0, 0xc5, 0x1b, 0xa9, 0xf8, 0xfa,
+	0xbf, 0x0d, 0xa8, 0x9c, 0x9c, 0x98, 0xce, 0x14, 0xbd, 0x84, 0xaa, 0xa8, 0x2a, 0xb4, 0x25, 0xe2,
+	0xc0, 0xad, 0xee, 0x3f, 0x16, 0x54, 0xa6, 0xe6, 0x94, 0x0d, 0xf4, 0x0a, 0x1a, 0x26, 0xa1, 0x49,
+	0x09, 0x6c, 0x0b, 0xb1, 0x18, 0xd8, 0x5f, 0x06, 0x94, 0x0d, 0xf4, 0x0c, 0x36, 0x7b, 0x84, 0xb2,
+	0x4f, 0xb5, 0xec, 0x16, 0xb0, 0x98, 0xb9, 0x95, 0x0d, 0xf4, 0x07, 0x90, 0x23, 0xa9, 0x9c, 0x81,
+	0xfd, 0xe9, 0x17, 0xbe, 0x6b, 0xf6, 0x0f, 0x3e, 0x23, 0x10, 0x2a, 0x1b, 0xe8, 0x47, 0x80, 0x81,
+	0x7f, 0x47, 0x02, 0xdf, 0x5b, 0x75, 0x23, 0xf6, 0x38, 0x2e, 0x4e, 0x65, 0x03, 0x1d, 0x43, 0xc3,
+	0xbc, 0x99, 0x53, 0xdb, 0xbf, 0x5b, 0x4f, 0xfe, 0xd7, 0x50, 0xc7, 0xe4, 0xd2, 0xf7, 0xe9, 0x5a,
+	0xd2, 0x2c, 0x61, 0xd4, 0x9f, 0x5d, 0xe3, 0x41, 0x9b, 0xbd, 0xcf, 0x24, 0xf8, 0xb2, 0xca, 0x6b,
+	0xd8, 0x36, 0xa9, 0x15, 0xd0, 0xaf, 0xd1, 0xf9, 0x19, 0x76, 0x30, 0x09, 0x97, 0xb4, 0xe2, 0xc1,
+	0x40, 0xd4, 0x56, 0x9e, 0xde, 0xf3, 0x28, 0x5d, 0xfa, 0x08, 0xad, 0x5e, 0xa5, 0xfd, 0xd4, 0x18,
+	0xa2, 0x6c, 0xa0, 0x5f, 0xb1, 0x51, 0x8d, 0xf2, 0x71, 0x25, 0xeb, 0x4e, 0x63, 0x21, 0x16, 0x46,
+	0xf1, 0xec, 0x11, 0x9a, 0x0c, 0x2b, 0xf9, 0xae, 0xc7, 0x6c, 0xee, 0x7a, 0x8b, 0xd9, 0xf5, 0xe6,
+	0x89, 0x4a, 0x8e, 0x2b, 0x39, 0x7a, 0xc7, 0x00, 0x91, 0xde, 0xc8, 0x73, 0x72, 0x75, 0x1a, 0x8b,
+	0x49, 0x87, 0xc9, 0xbf, 0x49, 0xe5, 0x39, 0xff, 0xbc, 0x0f, 0xe4, 0x42, 0x28, 0xa9, 0xae, 0x9b,
+	0x73, 0xf8, 0x1c, 0x9d, 0x77, 0xb0, 0x93, 0xda, 0x28, 0x34, 0xbc, 0x81, 0xa1, 0x27, 0xdb, 0x2d,
+	0xc6, 0xa6, 0xfc, 0xed, 0x92, 0xd2, 0x5d, 0xdb, 0xc5, 0x57, 0xd0, 0x12, 0x3a, 0x6b, 0x7b, 0xf8,
+	0x16, 0xa4, 0xc5, 0x36, 0x5f, 0xe5, 0xe0, 0x6f, 0x60, 0x4b, 0xd4, 0x59, 0x34, 0xfb, 0xaf, 0xe7,
+	0xe2, 0x1b, 0x68, 0x08, 0x2d, 0xfe, 0x49, 0xb0, 0x9e, 0xd2, 0x09, 0xec, 0x9a, 0x3c, 0xbf, 0xfc,
+	0xe9, 0xd5, 0x3c, 0xdb, 0x99, 0x58, 0xac, 0xed, 0xa1, 0xbd, 0x85, 0x7a, 0xfa, 0x55, 0xfe, 0x8c,
+	0x0d, 0xd6, 0x28, 0x1e, 0xb0, 0x91, 0x7d, 0xd9, 0xf3, 0x6c, 0xfc, 0x08, 0xb5, 0x1e, 0xa1, 0x51,
+	0xb3, 0xcf, 0xf1, 0x3c, 0x0e, 0x36, 0x17, 0xe0, 0xb1, 0xdd, 0x6e, 0xdf, 0x58, 0xde, 0x35, 0x61,
+	0xef, 0x56, 0xf4, 0x99, 0x81, 0x84, 0x48, 0xea, 0x25, 0xcb, 0xdb, 0xe8, 0x0c, 0xbe, 0x89, 0x0a,
+	0x7a, 0xf5, 0x93, 0x23, 0x67, 0xdf, 0x27, 0x0b, 0x68, 0x45, 0x5e, 0xd9, 0x38, 0xf9, 0xe1, 0xf7,
+	0xdf, 0x5f, 0x3b, 0xf4, 0x66, 0x7e, 0x79, 0x3c, 0xf1, 0xa7, 0xfc, 0x6f, 0xd5, 0x89, 0x1f, 0xd8,
+	0xe2, 0x7f, 0xd8, 0xe4, 0x1f, 0xd9, 0xcb, 0x4d, 0xfe, 0x37, 0xea, 0x9b, 0xff, 0x05, 0x00, 0x00,
+	0xff, 0xff, 0xaa, 0x2b, 0x80, 0x09, 0xa5, 0x15, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1774,6 +1898,8 @@
 	GetServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Services, error)
 	// Get all the Services of an ONU by serial number
 	GetOnuServices(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Services, error)
+	// Get all the UNIs of an ONU by serial number
+	GetOnuUnis(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*UNIs, error)
 	// Shutdown an ONU by serial number
 	ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error)
 	// Shutdown all ONUs in OLT
@@ -1936,6 +2062,15 @@
 	return out, nil
 }
 
+func (c *bBSimClient) GetOnuUnis(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*UNIs, error) {
+	out := new(UNIs)
+	err := c.cc.Invoke(ctx, "/bbsim.BBSim/GetOnuUnis", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *bBSimClient) ShutdownONU(ctx context.Context, in *ONURequest, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
 	err := c.cc.Invoke(ctx, "/bbsim.BBSim/ShutdownONU", in, out, opts...)
@@ -2082,6 +2217,8 @@
 	GetServices(context.Context, *Empty) (*Services, error)
 	// Get all the Services of an ONU by serial number
 	GetOnuServices(context.Context, *ONURequest) (*Services, error)
+	// Get all the UNIs of an ONU by serial number
+	GetOnuUnis(context.Context, *ONURequest) (*UNIs, error)
 	// Shutdown an ONU by serial number
 	ShutdownONU(context.Context, *ONURequest) (*Response, error)
 	// Shutdown all ONUs in OLT
@@ -2156,6 +2293,9 @@
 func (*UnimplementedBBSimServer) GetOnuServices(ctx context.Context, req *ONURequest) (*Services, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetOnuServices not implemented")
 }
+func (*UnimplementedBBSimServer) GetOnuUnis(ctx context.Context, req *ONURequest) (*UNIs, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOnuUnis not implemented")
+}
 func (*UnimplementedBBSimServer) ShutdownONU(ctx context.Context, req *ONURequest) (*Response, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ShutdownONU not implemented")
 }
@@ -2452,6 +2592,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _BBSim_GetOnuUnis_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.(BBSimServer).GetOnuUnis(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/bbsim.BBSim/GetOnuUnis",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BBSimServer).GetOnuUnis(ctx, req.(*ONURequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _BBSim_ShutdownONU_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(ONURequest)
 	if err := dec(in); err != nil {
@@ -2747,6 +2905,10 @@
 			Handler:    _BBSim_GetOnuServices_Handler,
 		},
 		{
+			MethodName: "GetOnuUnis",
+			Handler:    _BBSim_GetOnuUnis_Handler,
+		},
+		{
 			MethodName: "ShutdownONU",
 			Handler:    _BBSim_ShutdownONU_Handler,
 		},
diff --git a/api/bbsim/bbsim.proto b/api/bbsim/bbsim.proto
index 0216eb5..8f01dc6 100644
--- a/api/bbsim/bbsim.proto
+++ b/api/bbsim/bbsim.proto
@@ -89,6 +89,15 @@
     int32 ImageSoftwareReceivedSections = 12;
     int32 ActiveImageEntityId = 13;
     int32 CommittedImageEntityId = 14;
+    repeated UNI unis = 15;
+}
+
+message UNI {
+    int32 ID = 1;
+    int32 OnuID = 2;
+    string OnuSn = 3;
+    uint32 MeID = 4;
+    string OperState = 5;
 }
 
 message Service {
@@ -119,6 +128,10 @@
     repeated Service items = 1;
 }
 
+message UNIs {
+    repeated UNI items = 1;
+}
+
 // Inputs
 
 message ONURequest {
@@ -274,6 +287,10 @@
     rpc GetOnuServices (ONURequest) returns (Services) {
     }
 
+    // Get all the UNIs of an ONU by serial number
+    rpc GetOnuUnis (ONURequest) returns (UNIs) {
+    }
+
     // Shutdown an ONU by serial number
     rpc ShutdownONU (ONURequest) returns (Response) {
     }
diff --git a/internal/bbsim/api/onus_handler.go b/internal/bbsim/api/onus_handler.go
index 8f606d0..9fc73e7 100644
--- a/internal/bbsim/api/onus_handler.go
+++ b/internal/bbsim/api/onus_handler.go
@@ -48,6 +48,7 @@
 				ImageSoftwareExpectedSections: int32(o.ImageSoftwareExpectedSections),
 				ActiveImageEntityId:           int32(o.ActiveImageEntityId),
 				CommittedImageEntityId:        int32(o.CommittedImageEntityId),
+				Unis:                          convertBBsimUniPortsToProtoUniPorts(o.UniPorts),
 			}
 			onus.Items = append(onus.Items, &onu)
 		}
@@ -72,6 +73,7 @@
 		PonPortID:     int32(onu.PonPortID),
 		PortNo:        int32(onu.PortNo),
 		Services:      convertBBsimServicesToProtoServices(onu.Services),
+		Unis:          convertBBsimUniPortsToProtoUniPorts(onu.UniPorts),
 	}
 	return &res, nil
 }
diff --git a/internal/bbsim/api/uni_handler.go b/internal/bbsim/api/uni_handler.go
new file mode 100644
index 0000000..48eb260
--- /dev/null
+++ b/internal/bbsim/api/uni_handler.go
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 api
+
+import (
+	"context"
+	"github.com/opencord/bbsim/api/bbsim"
+	"github.com/opencord/bbsim/internal/bbsim/devices"
+)
+
+func convertBBSimUniPortToProtoUniPort(u *devices.UniPort) *bbsim.UNI {
+	return &bbsim.UNI{
+		ID:        int32(u.ID),
+		OnuID:     int32(u.Onu.ID),
+		OnuSn:     u.Onu.Sn(),
+		MeID:      uint32(u.MeId.ToUint16()),
+		OperState: u.OperState.Current(),
+	}
+}
+
+func convertBBsimUniPortsToProtoUniPorts(list []*devices.UniPort) []*bbsim.UNI {
+	unis := []*bbsim.UNI{}
+	for _, uni := range list {
+		unis = append(unis, convertBBSimUniPortToProtoUniPort(uni))
+	}
+	return unis
+}
+
+func (s BBSimServer) GetOnuUnis(ctx context.Context, req *bbsim.ONURequest) (*bbsim.UNIs, error) {
+	onu, err := s.GetONU(ctx, req)
+
+	if err != nil {
+		return nil, err
+	}
+
+	unis := bbsim.UNIs{
+		Items: onu.Unis,
+	}
+
+	return &unis, nil
+}
diff --git a/internal/bbsim/devices/onu.go b/internal/bbsim/devices/onu.go
index 1afb624..84706fd 100644
--- a/internal/bbsim/devices/onu.go
+++ b/internal/bbsim/devices/onu.go
@@ -52,6 +52,7 @@
 
 const (
 	maxOmciMsgCounter = 10
+	uniPorts          = 4 // TODO this will need to be configurable
 )
 
 const (
@@ -109,9 +110,11 @@
 	// PortNo comes with flows and it's used when sending packetIndications,
 	// There is one PortNo per UNI Port, for now we're only storing the first one
 	// FIXME add support for multiple UNIs (each UNI has a different PortNo)
-	PortNo  uint32
-	Flows   []FlowKey
-	FlowIds []uint64 // keep track of the flows we currently have in the ONU
+	// deprecated
+	PortNo   uint32
+	UniPorts []*UniPort
+	Flows    []FlowKey
+	FlowIds  []uint64 // keep track of the flows we currently have in the ONU
 
 	OperState    *fsm.FSM
 	SerialNumber *openolt.SerialNumber
@@ -131,6 +134,7 @@
 	tid       uint16
 	hpTid     uint16
 	seqNumber uint16
+	MibDb     *omcilib.MibDb
 
 	DoneChannel       chan bool // this channel is used to signal once the onu is complete (when the struct is used by BBR)
 	TrafficSchedulers *tech_profile.TrafficSchedulers
@@ -169,7 +173,9 @@
 	// state as requested by VOLTHA
 	o.OperState = getOperStateFSM(func(e *fsm.Event) {
 		onuLogger.WithFields(log.Fields{
-			"ID": o.ID,
+			"OnuId":  o.ID,
+			"IntfId": o.PonPortID,
+			"OnuSn":  o.Sn(),
 		}).Debugf("Changing ONU OperState from %s to %s", e.Src, e.Dst)
 	})
 	o.onuAlarmsInfo = make(map[omcilib.OnuAlarmInfoMapKey]omcilib.OnuAlarmInfo)
@@ -308,6 +314,29 @@
 		},
 	)
 
+	for i := 0; i < uniPorts; i++ {
+		uni, err := NewUniPort(uint32(i), &o)
+		if err != nil {
+			onuLogger.WithFields(log.Fields{
+				"OnuId":  o.ID,
+				"IntfId": o.PonPortID,
+				"OnuSn":  o.Sn(),
+				"Err":    err,
+			}).Fatal("cannot-create-uni-port")
+		}
+		o.UniPorts = append(o.UniPorts, uni)
+	}
+
+	mibDb, err := omcilib.GenerateMibDatabase(len(o.UniPorts))
+	if err != nil {
+		onuLogger.WithFields(log.Fields{
+			"OnuId":  o.ID,
+			"IntfId": o.PonPortID,
+			"OnuSn":  o.Sn(),
+		}).Fatal("cannot-generate-mibdb-for-onu")
+	}
+	o.MibDb = mibDb
+
 	return &o
 }
 
@@ -748,9 +777,9 @@
 			o.PonPort.removeGemPortBySn(o.SerialNumber)
 		}
 	case omci.MibUploadRequestType:
-		responsePkt, _ = omcilib.CreateMibUploadResponse(msg.OmciMsg.TransactionID)
+		responsePkt, _ = omcilib.CreateMibUploadResponse(msg.OmciMsg.TransactionID, o.MibDb.NumberOfCommands)
 	case omci.MibUploadNextRequestType:
-		responsePkt, _ = omcilib.CreateMibUploadNextResponse(msg.OmciPkt, msg.OmciMsg, o.MibDataSync)
+		responsePkt, _ = omcilib.CreateMibUploadNextResponse(msg.OmciPkt, msg.OmciMsg, o.MibDataSync, o.MibDb)
 	case omci.GetRequestType:
 		onuDown := o.OperState.Current() == "down"
 		responsePkt, _ = omcilib.CreateGetResponse(msg.OmciPkt, msg.OmciMsg, o.SerialNumber, o.MibDataSync, o.ActiveImageEntityId, o.CommittedImageEntityId, onuDown)
diff --git a/internal/bbsim/devices/onu_test_helpers.go b/internal/bbsim/devices/onu_test_helpers.go
index 017cc9c..1d48662 100644
--- a/internal/bbsim/devices/onu_test_helpers.go
+++ b/internal/bbsim/devices/onu_test_helpers.go
@@ -19,6 +19,7 @@
 import (
 	"context"
 	"errors"
+	omcilib "github.com/opencord/bbsim/internal/common/omci"
 	"time"
 
 	"github.com/opencord/bbsim/internal/bbsim/types"
@@ -151,6 +152,15 @@
 	}
 	o.SerialNumber = NewSN(0, ponPortId, o.ID)
 	o.Channel = make(chan types.Message, 10)
+
+	unis := []*UniPort{
+		{ID: 0, Onu: &o, MeId: omcilib.GenerateUniPortEntityId(1)},
+		{ID: 1, Onu: &o, MeId: omcilib.GenerateUniPortEntityId(2)},
+		{ID: 2, Onu: &o, MeId: omcilib.GenerateUniPortEntityId(3)},
+		{ID: 3, Onu: &o, MeId: omcilib.GenerateUniPortEntityId(4)},
+	}
+
+	o.UniPorts = unis
 	return &o
 }
 
diff --git a/internal/bbsim/devices/uni_port.go b/internal/bbsim/devices/uni_port.go
new file mode 100644
index 0000000..78640e3
--- /dev/null
+++ b/internal/bbsim/devices/uni_port.go
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 devices
+
+import (
+	"fmt"
+	"github.com/looplab/fsm"
+	omcilib "github.com/opencord/bbsim/internal/common/omci"
+	log "github.com/sirupsen/logrus"
+)
+
+const maxUniPorts = 4
+
+type UniPort struct {
+	ID        uint32
+	MeId      omcilib.EntityID
+	OperState *fsm.FSM
+	Onu       *Onu
+}
+
+func NewUniPort(ID uint32, onu *Onu) (*UniPort, error) {
+
+	// IDs starts from 0, thus the maximum UNI supported is maxUniPorts - 1
+	if ID > (maxUniPorts - 1) {
+		return nil, fmt.Errorf("%d-is-higher-than-the-maximum-supported-unis-%d", ID, maxUniPorts)
+	}
+
+	uni := UniPort{
+		ID:   ID,
+		Onu:  onu,
+		MeId: omcilib.GenerateUniPortEntityId(ID + 1),
+	}
+
+	uni.OperState = getOperStateFSM(func(e *fsm.Event) {
+		onuLogger.WithFields(log.Fields{
+			"ID":    uni.ID,
+			"OnuSn": onu.Sn(),
+		}).Debugf("changing-uni-operstate-from-%s-to-%s", e.Src, e.Dst)
+	})
+
+	return &uni, nil
+}
diff --git a/internal/bbsimctl/commands/onu.go b/internal/bbsimctl/commands/onu.go
index 33bd5ef..a986205 100644
--- a/internal/bbsimctl/commands/onu.go
+++ b/internal/bbsimctl/commands/onu.go
@@ -34,7 +34,8 @@
 
 const (
 	DEFAULT_ONU_DEVICE_HEADER_FORMAT               = "table{{ .PonPortID }}\t{{ .ID }}\t{{ .PortNo }}\t{{ .SerialNumber }}\t{{ .OperState }}\t{{ .InternalState }}\t{{ .ImageSoftwareExpectedSections }}\t{{ .ImageSoftwareReceivedSections }}\t{{ .ActiveImageEntityId }}\t{{ .CommittedImageEntityId }}"
-	DEFAULT_ONU_DEVICE_HEADER_FORMAT_WITH_SERVICES = "table{{ .PonPortID }}\t{{ .ID }}\t{{ .PortNo }}\t{{ .SerialNumber }}\t{{ .OperState }}\t{{ .InternalState }}\t{{ .ImageSoftwareExpectedSections }}\t{{ .ImageSoftwareReceivedSections }}\t{{ .ActiveImageEntityId }}\t{{ .CommittedImageEntityId }}\t{{ .Services }}"
+	DEFAULT_ONU_DEVICE_HEADER_FORMAT_WITH_SERVICES = "table{{ .PonPortID }}\t{{ .ID }}\t{{ .PortNo }}\t{{ .SerialNumber }}\t{{ .OperState }}\t{{ .InternalState }}\t{{ .ImageSoftwareExpectedSections }}\t{{ .ImageSoftwareReceivedSections }}\t{{ .ActiveImageEntityId }}\t{{ .CommittedImageEntityId }}\t{{ .Unis }}\t{{ .Services }}"
+	DEFAULT_UNI_HEADER_FORMAT                      = "table{{ .OnuSn }}\t{{ .OnuID }}\t{{ .ID }}\t{{ .MeID }}\t{{ .OperState }}"
 )
 
 type OnuSnString string
@@ -64,6 +65,12 @@
 	} `positional-args:"yes" required:"yes"`
 }
 
+type ONUUnis struct {
+	Args struct {
+		OnuSn OnuSnString
+	} `positional-args:"yes" required:"yes"`
+}
+
 type ONUShutDown struct {
 	Args struct {
 		OnuSn OnuSnString
@@ -112,6 +119,7 @@
 	List              ONUList              `command:"list"`
 	Get               ONUGet               `command:"get"`
 	Services          ONUServices          `command:"services"`
+	Unis              ONUUnis              `command:"unis"`
 	ShutDown          ONUShutDown          `command:"shutdown"`
 	PowerOn           ONUPowerOn           `command:"poweron"`
 	RestartEapol      ONUEapolRestart      `command:"auth_restart"`
@@ -214,6 +222,31 @@
 	return nil
 }
 
+func (options *ONUUnis) 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.GetOnuUnis(ctx, &req)
+
+	if err != nil {
+		log.Fatalf("Cannot not get unis for ONU %s: %v", options.Args.OnuSn, err)
+		return err
+	}
+
+	tableFormat := format.Format(DEFAULT_UNI_HEADER_FORMAT)
+	if err := tableFormat.Execute(os.Stdout, true, res.Items); err != nil {
+		log.Fatalf("Error while formatting Unis table: %s", err)
+	}
+
+	return nil
+}
+
 func (options *ONUShutDown) Execute(args []string) error {
 
 	client, conn := connect()
diff --git a/internal/common/omci/get.go b/internal/common/omci/get.go
index 384fc0b..73e53ac 100644
--- a/internal/common/omci/get.go
+++ b/internal/common/omci/get.go
@@ -119,7 +119,7 @@
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
 			"ManagedEntityId": entityID,
-			"EquipmentId":     toOctets("12345123451234512345", 20),
+			"EquipmentId":     ToOctets("12345123451234512345", 20),
 			"OpticalNetworkUnitManagementAndControlChannelOmccVersion": 180,
 			"VendorProductCode":                           0,
 			"SecurityCapability":                          1,
@@ -157,8 +157,8 @@
 		EntityID: entityID,
 		Attributes: me.AttributeValueMap{
 			"ManagedEntityId":         entityID,
-			"VendorId":                toOctets("BBSM", 4),
-			"Version":                 toOctets("v0.0.1", 14),
+			"VendorId":                ToOctets("BBSM", 4),
+			"Version":                 ToOctets("v0.0.1", 14),
 			"SerialNumber":            append(onuSn.VendorId, onuSn.VendorSpecific...),
 			"TrafficManagementOption": 0,
 			"Deprecated":              0,
@@ -166,8 +166,8 @@
 			"AdministrativeState":     0,
 			"OperationalState":        0,
 			"OnuSurvivalTime":         10,
-			"LogicalOnuId":            toOctets("BBSM", 24),
-			"LogicalPassword":         toOctets("BBSM", 12),
+			"LogicalOnuId":            ToOctets("BBSM", 24),
+			"LogicalPassword":         ToOctets("BBSM", 12),
 			"CredentialsStatus":       0,
 			"ExtendedTcLayerOptions":  0,
 		},
@@ -224,12 +224,12 @@
 		},
 		Attributes: me.AttributeValueMap{
 			"ManagedEntityId": 0,
-			"Version":         toOctets("00000000000001", 14),
+			"Version":         ToOctets("00000000000001", 14),
 			"IsCommitted":     committed,
 			"IsActive":        active,
 			"IsValid":         1,
-			"ProductCode":     toOctets("product-code", 25),
-			"ImageHash":       toOctets("broadband-sim", 16),
+			"ProductCode":     ToOctets("product-code", 25),
+			"ImageHash":       ToOctets("broadband-sim", 16),
 		},
 		Result:        me.Success,
 		AttributeMask: attributeMask,
@@ -253,7 +253,7 @@
 		},
 		Attributes: me.AttributeValueMap{
 			"ManagedEntityId": 0,
-			"MacAddress":      toOctets("aabbcc", 6),
+			"MacAddress":      ToOctets("aabbcc", 6),
 		},
 		Result:        me.Success,
 		AttributeMask: attributeMask,
@@ -590,7 +590,7 @@
 	}
 }
 
-func toOctets(str string, size int) []byte {
+func ToOctets(str string, size int) []byte {
 	asciiBytes := []byte(str)
 
 	if len(asciiBytes) < size {
diff --git a/internal/common/omci/mib_test.go b/internal/common/omci/mib_test.go
index a4ffbb7..139e3e1 100644
--- a/internal/common/omci/mib_test.go
+++ b/internal/common/omci/mib_test.go
@@ -71,27 +71,99 @@
 
 func TestCreateMibUploadNextResponse(t *testing.T) {
 
+	const uniPortCount = 4
+
+	var (
+		onuDataEntityId = EntityID{0x00, 0x00}
+		onu2gEntityId   = EntityID{0x00, 0x00}
+		anigEntityId    = EntityID{tcontSlotId, aniGId}
+	)
+
+	// create a fake mibDb, we only need to test that given a CommandSequenceNumber
+	// we return the corresponding entry
+	// the only exception is for OnuData in which we need to replace the MibDataSync attribute with the current value
+	mibDb := MibDb{
+		NumberOfCommands: 4,
+		items:            []MibDbEntry{},
+	}
+
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.OnuDataClassID,
+		onuDataEntityId,
+		me.AttributeValueMap{"MibDataSync": 0},
+	})
+
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"Type":          ethernetUnitType,
+			"NumberOfPorts": uniPortCount,
+			"SerialNumber":  ToOctets("BBSM-Circuit-Pack", 20),
+			"Version":       ToOctets("v0.0.1", 20),
+		},
+	})
+
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.AniGClassID,
+		anigEntityId,
+		me.AttributeValueMap{
+			"Arc":                         0,
+			"ArcInterval":                 0,
+			"Deprecated":                  0,
+			"GemBlockLength":              48,
+			"LowerOpticalThreshold":       255,
+			"LowerTransmitPowerThreshold": 129,
+			"OnuResponseTime":             0,
+			"OpticalSignalLevel":          57428,
+			"PiggybackDbaReporting":       0,
+			"SignalDegradeThreshold":      9,
+			"SignalFailThreshold":         5,
+			"SrIndication":                1,
+			"TotalTcontNumber":            8,
+			"TransmitOpticalLevel":        3171,
+			"UpperOpticalThreshold":       255,
+			"UpperTransmitPowerThreshold": 129,
+		},
+	})
+
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.Onu2GClassID,
+		onu2gEntityId,
+		me.AttributeValueMap{
+			"ConnectivityCapability":                      127,
+			"CurrentConnectivityMode":                     0,
+			"Deprecated":                                  1,
+			"PriorityQueueScaleFactor":                    1,
+			"QualityOfServiceQosConfigurationFlexibility": 63,
+			"Sysuptime":                                   0,
+			"TotalGemPortIdNumber":                        8,
+			"TotalPriorityQueueNumber":                    64,
+			"TotalTrafficSchedulerNumber":                 8,
+		},
+	})
+
 	tests := []struct {
 		name string
 		args mibArgs
 		want mibExpected
 	}{
 		{"mibUploadNext-0", createTestMibUploadNextArgs(t, 1, 0),
-
-			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 1, entityID: 0, entityClass: me.OnuDataClassID, attributes: map[string]interface{}{"MibDataSync": MDS}}},
+			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 1, entityID: onuDataEntityId.ToUint16(), entityClass: me.OnuDataClassID, attributes: map[string]interface{}{"MibDataSync": MDS}}},
 		{"mibUploadNext-1", createTestMibUploadNextArgs(t, 2, 1),
-			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 2, entityID: 257, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"Type": uint8(47), "NumberOfPorts": uint8(4)}}},
-		{"mibUploadNext-4", createTestMibUploadNextArgs(t, 3, 4),
-			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 3, entityID: 257, entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"PowerShedOverride": uint32(0)}}},
-		{"mibUploadNext-10", createTestMibUploadNextArgs(t, 4, 10),
-			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 4, entityID: 258, entityClass: me.PhysicalPathTerminationPointEthernetUniClassID, attributes: map[string]interface{}{"SensedType": uint8(47)}}},
+			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 2, entityID: circuitPackEntityID.ToUint16(), entityClass: me.CircuitPackClassID, attributes: map[string]interface{}{"Type": uint8(47), "NumberOfPorts": uint8(4)}}},
+		{"mibUploadNext-2", createTestMibUploadNextArgs(t, 3, 2),
+			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 3, entityID: anigEntityId.ToUint16(), entityClass: me.AniGClassID, attributes: map[string]interface{}{"GemBlockLength": uint16(48)}}},
+		{"mibUploadNext-3", createTestMibUploadNextArgs(t, 4, 3),
+			mibExpected{messageType: omci.MibUploadNextResponseType, transactionId: 4, entityID: onuDataEntityId.ToUint16(), entityClass: me.Onu2GClassID, attributes: map[string]interface{}{"TotalPriorityQueueNumber": uint16(64)}}},
 	}
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 
 			// create the packet starting from the mibUploadNextRequest
-			data, _ := CreateMibUploadNextResponse(tt.args.omciPkt, tt.args.omciMsg, MDS)
+			data, err := CreateMibUploadNextResponse(tt.args.omciPkt, tt.args.omciMsg, MDS, &mibDb)
+			assert.NilError(t, err)
 			omciMsg, omciPkt := omciBytesToMsg(t, data)
 
 			assert.Equal(t, omciMsg.MessageType, tt.want.messageType)
@@ -107,65 +179,15 @@
 			assert.Equal(t, msgObj.ReportedME.GetEntityID(), tt.want.entityID)
 
 			for k, v := range tt.want.attributes {
-				attr, _ := msgObj.ReportedME.GetAttribute(k)
+				attr, err := msgObj.ReportedME.GetAttribute(k)
+				assert.NilError(t, err)
 				assert.Equal(t, attr, v)
 			}
 		})
 	}
-}
 
-type pqueueExpected struct {
-	entityId    uint16
-	relatedPort uint32
-}
-
-func TestGeneratePriorityQueueMe(t *testing.T) {
-
-	tests := []struct {
-		name     string
-		sequence uint16
-		want     pqueueExpected
-	}{
-		{"generate-pq-downstream-1", 26,
-			pqueueExpected{entityId: 1, relatedPort: 16842752}},
-		{"generate-pq-downstream-2", 30,
-			pqueueExpected{entityId: 2, relatedPort: 16842753}},
-		{"generate-pq-downstream-3", 58,
-			pqueueExpected{entityId: 9, relatedPort: 16842760}},
-		{"generate-pq-upstream-1", 28,
-			pqueueExpected{entityId: 32769, relatedPort: 2147549184}},
-		{"generate-pq-upstream-2", 32,
-			pqueueExpected{entityId: 32770, relatedPort: 2147549185}},
-		{"generate-pq-upstream-3", 60,
-			pqueueExpected{entityId: 32777, relatedPort: 2147614720}},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			reportedMe, meErr := GeneratePriorityQueueMe(tt.sequence)
-			if meErr.GetError() != nil {
-				t.Fatal(meErr.Error())
-			}
-
-			assert.Equal(t, reportedMe.GetEntityID(), tt.want.entityId)
-
-			relatedPort, _ := reportedMe.GetAttribute("RelatedPort")
-			assert.Equal(t, relatedPort, tt.want.relatedPort)
-		})
-	}
-
-	// test that the related ports are unique
-	allRelatedPorts := make(map[uint32]struct{})
-	for v := 26; v <= 281; v++ {
-		reportedMe, meErr := GeneratePriorityQueueMe(uint16(v))
-		if meErr.GetError() != nil {
-			t.Fatal(meErr.Error())
-		}
-		relatedPort, _ := reportedMe.GetAttribute("RelatedPort")
-		allRelatedPorts[relatedPort.(uint32)] = struct{}{}
-	}
-
-	// we report 128 queues total, but each of them is comprised of 2 messages
-	// that's why the 256 iterations
-	assert.Equal(t, len(allRelatedPorts), 128)
+	// now try to get a non existing command from the DB anche expect an error
+	args := createTestMibUploadNextArgs(t, 1, 20)
+	_, err := CreateMibUploadNextResponse(args.omciPkt, args.omciMsg, MDS, &mibDb)
+	assert.Error(t, err, "mibdb-does-not-contain-item")
 }
diff --git a/internal/common/omci/mibpackets.go b/internal/common/omci/mibpackets.go
index 6d22200..8db0709 100755
--- a/internal/common/omci/mibpackets.go
+++ b/internal/common/omci/mibpackets.go
@@ -23,25 +23,12 @@
 	"github.com/opencord/omci-lib-go"
 	me "github.com/opencord/omci-lib-go/generated"
 	log "github.com/sirupsen/logrus"
-	"strconv"
 )
 
 var omciLogger = log.WithFields(log.Fields{
 	"module": "OMCI",
 })
 
-// we have a fixed number of 8 T-CONTS
-var reportedTcontsMeId = []uint16{
-	32769,
-	32770,
-	32771,
-	32772,
-	32773,
-	32774,
-	32775,
-	32776,
-}
-
 // NOTE this is basically the same as https://github.com/opencord/voltha-openonu-adapter-go/blob/master/internal/pkg/onuadaptercore/omci_cc.go#L545-L564
 // we should probably move it in "omci-lib-go"
 func Serialize(msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
@@ -112,10 +99,7 @@
 	return HexEncode(pkt)
 }
 
-func CreateMibUploadResponse(tid uint16) ([]byte, error) {
-
-	numberOfCommands := uint16(291) //NOTE should this be configurable? (not until we have moved all the messages away from omci-sim)
-
+func CreateMibUploadResponse(tid uint16, numberOfCommands uint16) ([]byte, error) {
 	request := &omci.MibUploadResponse{
 		MeBasePacket: omci.MeBasePacket{
 			EntityClass: me.OnuDataClassID,
@@ -168,7 +152,7 @@
 	return msgObj, nil
 }
 
-func CreateMibUploadNextResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI, mds uint8) ([]byte, error) {
+func CreateMibUploadNextResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI, mds uint8, mibDb *MibDb) ([]byte, error) {
 
 	msgObj, err := ParseMibUploadNextRequest(omciPkt)
 	if err != nil {
@@ -183,256 +167,28 @@
 		"CommandSequenceNumber": msgObj.CommandSequenceNumber,
 	}).Trace("received-omci-mibUploadNext-request")
 
-	var reportedMe *me.ManagedEntity
-	var meErr me.OmciErrors
+	if msgObj.CommandSequenceNumber > mibDb.NumberOfCommands {
+		omciLogger.WithFields(log.Fields{
+			"CommandSequenceNumber": msgObj.CommandSequenceNumber,
+			"MibDbNumberOfCommands": mibDb.NumberOfCommands,
+		}).Error("mibdb-does-not-contain-item")
+		return nil, fmt.Errorf("mibdb-does-not-contain-item")
+	}
+	currentEntry := mibDb.items[int(msgObj.CommandSequenceNumber)]
+	reportedMe, meErr := me.LoadManagedEntityDefinition(currentEntry.classId, me.ParamData{
+		EntityID:   currentEntry.entityId.ToUint16(),
+		Attributes: currentEntry.params,
+	})
 
-	switch msgObj.CommandSequenceNumber {
-	case 0:
-		reportedMe, meErr = me.NewOnuData(me.ParamData{Attributes: me.AttributeValueMap{
-			"MibDataSync": mds,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewOnuData %v", meErr.Error())
-		}
+	if meErr.GetError() != nil {
+		omciLogger.Errorf("Error while generating %s: %v", currentEntry.classId.String(), meErr.Error())
+	}
 
-	case 1:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"Type":          47,
-				"NumberOfPorts": 4,
-				"SerialNumber":  toOctets("BBSM-Circuit-Pack", 20),
-				"Version":       toOctets("v0.0.1", 20),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
+	if reportedMe.GetClassID() == me.OnuDataClassID {
+		// if this is ONU-Data we need to replace the MDS
+		if err := reportedMe.SetAttribute("MibDataSync", mds); err.GetError() != nil {
+			omciLogger.Errorf("Error while setting mds in %s: %v", currentEntry.classId.String(), meErr.Error())
 		}
-	case 2:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"VendorId":            "ONF",
-				"AdministrativeState": 0,
-				"OperationalState":    0,
-				"BridgedOrIpInd":      0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 3:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"EquipmentId":                 toOctets("BBSM-Circuit-Pack", 20),
-				"CardConfiguration":           0,
-				"TotalTContBufferNumber":      8,
-				"TotalPriorityQueueNumber":    8,
-				"TotalTrafficSchedulerNumber": 16,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 4:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"PowerShedOverride": uint32(0),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 5:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257,
-			Attributes: me.AttributeValueMap{
-				"Type":          238,
-				"NumberOfPorts": 4, //number of UNI for this device
-				"SerialNumber":  toOctets("BBSM-Circuit-Pack-2", 20),
-				"Version":       toOctets("v0.0.1", 20),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 6:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"VendorId":            "ONF",
-				"AdministrativeState": 0,
-				"OperationalState":    0,
-				"BridgedOrIpInd":      0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 7:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"EquipmentId":                 toOctets("BBSM-Circuit-Pack", 20),
-				"CardConfiguration":           0,
-				"TotalTContBufferNumber":      0,
-				"TotalPriorityQueueNumber":    8,
-				"TotalTrafficSchedulerNumber": 0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 8:
-		reportedMe, meErr = me.NewCircuitPack(me.ParamData{
-			EntityID: 257, // first UNI
-			Attributes: me.AttributeValueMap{
-				"PowerShedOverride": uint32(0),
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewCircuitPack %v", meErr.Error())
-		}
-	case 9, 10, 11, 12:
-		// NOTE we're reporting for different UNIs, the IDs are 257, 258, 259, 260
-		meInstance := 248 + msgObj.CommandSequenceNumber
-		reportedMe, meErr = me.NewPhysicalPathTerminationPointEthernetUni(me.ParamData{
-			EntityID: meInstance,
-			Attributes: me.AttributeValueMap{
-				"ExpectedType":                  0,
-				"SensedType":                    47,
-				"AutoDetectionConfiguration":    0,
-				"EthernetLoopbackConfiguration": 0,
-				"AdministrativeState":           0,
-				"OperationalState":              0,
-				"ConfigurationInd":              3,
-				"MaxFrameSize":                  1518,
-				"DteOrDceInd":                   0,
-				"PauseTime":                     0,
-				"BridgedOrIpInd":                2,
-				"Arc":                           0,
-				"ArcInterval":                   0,
-				"PppoeFilter":                   0,
-				"PowerControl":                  0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewPhysicalPathTerminationPointEthernetUni %v", meErr.Error())
-		}
-	case 13, 14, 15, 16, 17, 18, 19, 20:
-		reportedMe, meErr = me.NewTCont(me.ParamData{
-			// NOTE fetch the correct T-CONT MeID based on the sequence number
-			EntityID: reportedTcontsMeId[msgObj.CommandSequenceNumber-13],
-			Attributes: me.AttributeValueMap{
-				"AllocId": 65535,
-			},
-		})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewTCont %v", meErr.Error())
-		}
-	case 21:
-		reportedMe, meErr = me.NewAniG(me.ParamData{
-			EntityID: 32769, // same as the first T-CONT
-			Attributes: me.AttributeValueMap{
-				"Arc":                         0,
-				"ArcInterval":                 0,
-				"Deprecated":                  0,
-				"GemBlockLength":              48,
-				"LowerOpticalThreshold":       255,
-				"LowerTransmitPowerThreshold": 129,
-				"OnuResponseTime":             0,
-				"OpticalSignalLevel":          57428,
-				"PiggybackDbaReporting":       0,
-				"SignalDegradeThreshold":      9,
-				"SignalFailThreshold":         5,
-				"SrIndication":                1,
-				"TotalTcontNumber":            8,
-				"TransmitOpticalLevel":        3171,
-				"UpperOpticalThreshold":       255,
-				"UpperTransmitPowerThreshold": 129,
-			},
-		})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewAniG %v", meErr.Error())
-		}
-	case 22, 23, 24, 25:
-		// NOTE we're reporting for different UNIs, the IDs are 257, 258, 259, 260
-		meInstance := 235 + msgObj.CommandSequenceNumber
-		reportedMe, meErr = me.NewUniG(me.ParamData{
-			EntityID: meInstance,
-			Attributes: me.AttributeValueMap{
-				"AdministrativeState":         0,
-				"Deprecated":                  0,
-				"ManagementCapability":        0,
-				"NonOmciManagementIdentifier": 0,
-				"RelayAgentOptions":           0,
-			}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewUniG %v", meErr.Error())
-		}
-	// Prior-Q with mask downstream
-	case 26, 30, 34, 38, 42, 46, 50, 54,
-		58, 62, 66, 70, 74, 78, 82, 86,
-		90, 94, 98, 102, 106, 110, 114, 118,
-		122, 126, 130, 134, 138, 142, 146, 150,
-		154, 158, 162, 166, 170, 174, 178, 182,
-		186, 190, 194, 198, 202, 206, 210, 214,
-		218, 222, 226, 230, 234, 238, 242, 246,
-		250, 254, 258, 262, 266, 270, 274, 278,
-		// Prior-Q with attribute list downstream
-		27, 31, 35, 39, 43, 47, 51, 55,
-		59, 63, 67, 71, 75, 79, 83, 87,
-		91, 95, 99, 103, 107, 111, 115, 119,
-		123, 127, 131, 135, 139, 143, 147, 151,
-		155, 159, 163, 167, 171, 175, 179, 183,
-		187, 191, 195, 199, 203, 207, 211, 215,
-		219, 223, 227, 231, 235, 239, 243, 247,
-		251, 255, 259, 263, 267, 271, 275, 279,
-		// Prior-Q with mask upstream
-		28, 32, 36, 40, 44, 48, 52, 56,
-		60, 64, 68, 72, 76, 80, 84, 88,
-		92, 96, 100, 104, 108, 112, 116, 120,
-		124, 128, 132, 136, 140, 144, 148, 152,
-		156, 160, 164, 168, 172, 176, 180, 184,
-		188, 192, 196, 200, 204, 208, 212, 216,
-		220, 224, 228, 232, 236, 240, 244, 248,
-		252, 256, 260, 264, 268, 272, 276, 280,
-		// Prior-Q with attribute list upstream
-		29, 33, 37, 41, 45, 49, 53, 57,
-		61, 65, 69, 73, 77, 81, 85, 89,
-		93, 97, 101, 105, 109, 113, 117, 121,
-		125, 129, 133, 137, 141, 145, 149, 153,
-		157, 161, 165, 169, 173, 177, 181, 185,
-		189, 193, 197, 201, 205, 209, 213, 217,
-		221, 225, 229, 233, 237, 241, 245, 249,
-		253, 257, 261, 265, 269, 273, 277, 281:
-
-		reportedMe, meErr = GeneratePriorityQueueMe(msgObj.CommandSequenceNumber)
-
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewPriorityQueue %v", meErr.Error())
-		}
-	case 282, 283, 284, 285, 286, 287, 288, 289:
-		reportedMe, meErr = me.NewTrafficScheduler(me.ParamData{Attributes: me.AttributeValueMap{
-			"TContPointer":            32768, // NOTE does this need to change?
-			"TrafficSchedulerPointer": 0,
-			"Policy":                  02,
-			"PriorityWeight":          0,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewTrafficScheduler %v", meErr.Error())
-		}
-	case 290:
-		reportedMe, meErr = me.NewOnu2G(me.ParamData{Attributes: me.AttributeValueMap{
-			"ConnectivityCapability":                      127,
-			"CurrentConnectivityMode":                     0,
-			"Deprecated":                                  1,
-			"PriorityQueueScaleFactor":                    1,
-			"QualityOfServiceQosConfigurationFlexibility": 63,
-			"Sysuptime":                                   0,
-			"TotalGemPortIdNumber":                        8,
-			"TotalPriorityQueueNumber":                    64,
-			"TotalTrafficSchedulerNumber":                 8,
-		}})
-		if meErr.GetError() != nil {
-			omciLogger.Errorf("NewOnu2G %v", meErr.Error())
-		}
-	default:
-		omciLogger.Warn("unsupported-CommandSequenceNumber-in-mib-upload-next", msgObj.CommandSequenceNumber)
-		return nil, nil
 	}
 
 	response := &omci.MibUploadNextResponse{
@@ -457,83 +213,3 @@
 
 	return pkt, nil
 }
-
-func GeneratePriorityQueueMe(sequence uint16) (*me.ManagedEntity, me.OmciErrors) {
-
-	iteration := sequence - 26
-
-	// we report 256 messages for priority queues,
-	// 128 downstream and 128 upstream
-	// we repeat 64 times the quartet:
-	// - downstream with mask
-	// - downstream with attributes (same MeID as the previous)
-	// - upstream with mask
-	// - upstream with attributes (same MeID as the previous)
-
-	// very ugly way to define whether the priority queue is upstream or downstream
-	// (first 2 blocks are downstream, second two are upstream)
-	// for example sequence 26, 27 are downstream
-	// sequence 28, 29 are upstream
-	isDownstream := ((sequence-26)%4 == 0) || ((sequence-27)%4 == 0)
-	// entityIds are:
-	// - 1 to 64 for downstream (hex 0001 to 0040)
-	// - 32769 to 32832 for upstream (hex 8001 to 8040)
-	var entityId uint16
-	if isDownstream {
-		entityId = (iteration)/4 + 1
-	} else {
-		entityId = (iteration)/4 + 32769
-	}
-
-	var relatedPort uint32
-	if isDownstream {
-		// downstream the related port is:
-		// - Circuit Pack/ UNI port of UNI Port (01 01/04)
-		// - priority 0 to 15 -> iteration%16
-
-		// every 16 iteration (of 4 commands) we move to the next the TCONT MeID
-		uniPort := int(iteration/64) + 1
-		priority := (iteration / 4) % 16
-
-		// concat the uniPort and priority in an hex string
-		// we have a single circuit pack, so we hardcode it
-		v := fmt.Sprintf("010%x000%x", uniPort, priority)
-
-		// convert back to int
-		k, _ := strconv.ParseInt(v, 16, 64)
-		relatedPort = uint32(k)
-	} else {
-		// upstream the related port is:
-		// - Tcont MeID -> reportedTcontsMeId[ceil(iteration/4/8)]
-		// - priority 0 to 7 -> iteration%8
-
-		// every 8 iteration (of 4 commands) we move to the next the TCONT MeID
-		tcontMe := reportedTcontsMeId[int(iteration/32)]
-		priority := (iteration / 4) % 8
-
-		// concat the tcontMe and priority in an hex string
-		v := fmt.Sprintf("%x000%x", tcontMe, priority)
-
-		// convert back to int
-		k, _ := strconv.ParseInt(v, 16, 64)
-		relatedPort = uint32(k)
-	}
-
-	return me.NewPriorityQueue(me.ParamData{
-		EntityID: entityId,
-		Attributes: me.AttributeValueMap{
-			"QueueConfigurationOption":                            0,
-			"MaximumQueueSize":                                    100,
-			"AllocatedQueueSize":                                  100,
-			"DiscardBlockCounterResetInterval":                    0,
-			"ThresholdValueForDiscardedBlocksDueToBufferOverflow": 0,
-			"RelatedPort":                                         relatedPort,
-			"TrafficSchedulerPointer":                             264,
-			"Weight":                                              1,
-			"BackPressureOperation":                               1,
-			"BackPressureTime":                                    0,
-			"BackPressureOccurQueueThreshold":                     0,
-			"BackPressureClearQueueThreshold":                     0,
-		},
-	})
-}
diff --git a/internal/common/omci/onu_mib_db.go b/internal/common/omci/onu_mib_db.go
new file mode 100644
index 0000000..c8696a7
--- /dev/null
+++ b/internal/common/omci/onu_mib_db.go
@@ -0,0 +1,362 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 omci
+
+import (
+	"encoding/binary"
+	"encoding/hex"
+	me "github.com/opencord/omci-lib-go/generated"
+)
+
+type MibDbEntry struct {
+	classId  me.ClassID
+	entityId EntityID
+	params   me.AttributeValueMap
+}
+
+type MibDb struct {
+	NumberOfCommands uint16
+	items            []MibDbEntry
+}
+
+type EntityID []byte
+
+func (e EntityID) ToString() string {
+	return hex.EncodeToString(e)
+}
+
+func (e EntityID) ToUint16() uint16 {
+	return binary.BigEndian.Uint16(e)
+}
+
+func (e EntityID) ToUint32() uint32 {
+	return binary.BigEndian.Uint32(e)
+}
+
+const (
+	cardHolderOnuType byte = 0x01 // ONU is a single piece of integrated equipment
+	ethernetUnitType  byte = 0x2f // Ethernet BASE-T
+	xgsPonUnitType    byte = 0xee // XG-PON10G10
+	cardHolderSlotID  byte = 0x01
+	tcontSlotId       byte = 0x80 // why is this not the same as the cardHolderSlotID, it does not point to anything
+	aniGId            byte = 0x01
+
+	upstreamPriorityQueues   = 8  // Number of queues for each T-CONT
+	downstreamPriorityQueues = 16 // Number of queues for each PPTP
+	tconts                   = 8  // NOTE will we ever need to configure this?
+	// trafficSchedulers        = 8  // NOTE will we ever need to configure this?
+)
+
+var (
+	cardHolderEntityID  = EntityID{cardHolderOnuType, cardHolderSlotID}
+	circuitPackEntityID = cardHolderEntityID // is the same as that of the cardholder ME containing this circuit pack instance
+)
+
+func GenerateUniPortEntityId(id uint32) EntityID {
+	return EntityID{cardHolderSlotID, byte(id)}
+}
+
+// creates a MIB database for a ONU
+// CircuitPack and CardHolder are static, everything else can be configured
+func GenerateMibDatabase(uniPortCount int) (*MibDb, error) {
+
+	mibDb := MibDb{
+		items: []MibDbEntry{},
+	}
+
+	// the first element to return is the ONU-Data
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.OnuDataClassID,
+		EntityID{0x00, 0x00},
+		me.AttributeValueMap{"MibDataSync": 0}, // FIXME this needs to be parametrized before sending the response
+	})
+
+	// then we report the CardHolder
+	// NOTE we have not report it till now, so leave it commented out
+	//mibDb.items = append(mibDb.items, MibDbEntry{
+	//	me.CardholderClassID,
+	//	cardHolderEntityID,
+	//	me.AttributeValueMap{
+	//		"ActualPlugInUnitType":   cardHolderOnuType,
+	//		"ExpectedPlugInUnitType": ethernetUnitType,
+	//	},
+	//})
+
+	// circuitPack XG-PON10G10
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"Type":          xgsPonUnitType,
+			"NumberOfPorts": 1, // NOTE is this the ANI port? must be
+			"SerialNumber":  ToOctets("BBSM-Circuit-Pack-ani", 20),
+			"Version":       ToOctets("v0.0.1", 20),
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"VendorId":            "ONF",
+			"AdministrativeState": 0,
+			"OperationalState":    0,
+			"BridgedOrIpInd":      0,
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"EquipmentId":                 ToOctets("BBSM-Circuit-Pack", 20),
+			"CardConfiguration":           0,
+			"TotalTContBufferNumber":      8,
+			"TotalPriorityQueueNumber":    8,
+			"TotalTrafficSchedulerNumber": 0,
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"PowerShedOverride": uint32(0),
+		},
+	})
+
+	// ANI-G
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.AniGClassID,
+		EntityID{tcontSlotId, aniGId},
+		me.AttributeValueMap{
+			"Arc":                         0,
+			"ArcInterval":                 0,
+			"Deprecated":                  0,
+			"GemBlockLength":              48,
+			"LowerOpticalThreshold":       255,
+			"LowerTransmitPowerThreshold": 129,
+			"OnuResponseTime":             0,
+			"OpticalSignalLevel":          57428,
+			"PiggybackDbaReporting":       0,
+			"SignalDegradeThreshold":      9,
+			"SignalFailThreshold":         5,
+			"SrIndication":                1,
+			"TotalTcontNumber":            8,
+			"TransmitOpticalLevel":        3171,
+			"UpperOpticalThreshold":       255,
+			"UpperTransmitPowerThreshold": 129,
+		},
+	})
+
+	// circuitPack Ethernet
+	// NOTE the circuit pack is divided in multiple messages as too big to fit in a single one
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"Type":          ethernetUnitType,
+			"NumberOfPorts": uniPortCount,
+			"SerialNumber":  ToOctets("BBSM-Circuit-Pack", 20),
+			"Version":       ToOctets("v0.0.1", 20),
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"VendorId":            "ONF",
+			"AdministrativeState": 0,
+			"OperationalState":    0,
+			"BridgedOrIpInd":      0,
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"EquipmentId":                 ToOctets("BBSM-Circuit-Pack", 20),
+			"CardConfiguration":           0,
+			"TotalTContBufferNumber":      8,
+			"TotalPriorityQueueNumber":    8,
+			"TotalTrafficSchedulerNumber": 16,
+		},
+	})
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.CircuitPackClassID,
+		circuitPackEntityID,
+		me.AttributeValueMap{
+			"PowerShedOverride": uint32(0),
+		},
+	})
+
+	// PPTP and UNI-Gs
+	// NOTE this are dependent on the number of UNI this ONU supports
+	// Through an identical ID, the UNI-G ME is implicitly linked to an instance of a PPTP
+	for i := 1; i <= uniPortCount; i++ {
+		uniEntityId := GenerateUniPortEntityId(uint32(i))
+
+		mibDb.items = append(mibDb.items, MibDbEntry{
+			me.PhysicalPathTerminationPointEthernetUniClassID,
+			uniEntityId,
+			me.AttributeValueMap{
+				"ExpectedType":                  0,
+				"SensedType":                    ethernetUnitType,
+				"AutoDetectionConfiguration":    0,
+				"EthernetLoopbackConfiguration": 0,
+				"AdministrativeState":           0,
+				"OperationalState":              0,
+				"ConfigurationInd":              3,
+				"MaxFrameSize":                  1518,
+				"DteOrDceInd":                   0,
+				"PauseTime":                     0,
+				"BridgedOrIpInd":                2,
+				"Arc":                           0,
+				"ArcInterval":                   0,
+				"PppoeFilter":                   0,
+				"PowerControl":                  0,
+			},
+		})
+
+		mibDb.items = append(mibDb.items, MibDbEntry{
+			me.UniGClassID,
+			uniEntityId,
+			me.AttributeValueMap{
+				"AdministrativeState":         0,
+				"Deprecated":                  0,
+				"ManagementCapability":        0,
+				"NonOmciManagementIdentifier": 0,
+				"RelayAgentOptions":           0,
+			},
+		})
+
+		// Downstream Queues (related to PPTP)
+		// 16 priorities queues for each UNI Ports
+		// EntityID = cardHolderSlotID + Uni EntityID (0101)
+		for j := 1; j <= downstreamPriorityQueues; j++ {
+			queueEntityId := EntityID{cardHolderSlotID, byte(j)}
+
+			// we first report the PriorityQueue without any attribute
+			mibDb.items = append(mibDb.items, MibDbEntry{
+				me.PriorityQueueClassID,
+				queueEntityId, //was not reported in the original implementation
+				me.AttributeValueMap{},
+			})
+
+			// then we report it with the required attributes
+			// In the downstream direction, the first byte is the slot number and the second byte is the port number of the queue's destination port.
+			relatedPort := append(uniEntityId, 0x00, byte(j))
+			mibDb.items = append(mibDb.items, MibDbEntry{
+				me.PriorityQueueClassID,
+				queueEntityId, //was not reported in the original implementation
+				me.AttributeValueMap{
+					"QueueConfigurationOption":                            0,
+					"MaximumQueueSize":                                    100,
+					"AllocatedQueueSize":                                  100,
+					"DiscardBlockCounterResetInterval":                    0,
+					"ThresholdValueForDiscardedBlocksDueToBufferOverflow": 0,
+					"RelatedPort":                                         relatedPort.ToUint32(),
+					"TrafficSchedulerPointer":                             0, //it was hardcoded to 0x0108 in the current implementation
+					"Weight":                                              1,
+					"BackPressureOperation":                               1,
+					"BackPressureTime":                                    0,
+					"BackPressureOccurQueueThreshold":                     0,
+					"BackPressureClearQueueThreshold":                     0,
+				},
+			})
+		}
+	}
+
+	// T-CONTS and Traffic Schedulers
+	for i := 1; i <= tconts; i++ {
+		tcontEntityId := EntityID{tcontSlotId, byte(i)}
+
+		mibDb.items = append(mibDb.items, MibDbEntry{
+			me.TContClassID,
+			tcontEntityId,
+			me.AttributeValueMap{
+				"AllocId": 65535,
+			},
+		})
+
+		tsEntityId := EntityID{cardHolderSlotID, byte(i)}
+		mibDb.items = append(mibDb.items, MibDbEntry{
+			me.TrafficSchedulerClassID,
+			tsEntityId, //was not reported in the original implementation
+			me.AttributeValueMap{
+				"TContPointer":            tcontEntityId.ToUint16(), // was hardcoded to a non-existing t-cont
+				"TrafficSchedulerPointer": 0,
+				"Policy":                  02,
+				"PriorityWeight":          0,
+			},
+		})
+
+		for j := 1; j <= upstreamPriorityQueues; j++ {
+			queueEntityId := EntityID{tcontSlotId, byte(j)}
+			// Upstream Queues (related to traffic schedulers)
+			// 8 priorities queues per TCONT
+			// EntityID = tcontSlotId + Uni EntityID (8001)
+
+			// we first report the PriorityQueue without any attribute
+			mibDb.items = append(mibDb.items, MibDbEntry{
+				me.PriorityQueueClassID,
+				queueEntityId, //was not reported in the original implementation
+				me.AttributeValueMap{},
+			})
+
+			// then we report it with the required attributes
+			// In the upstream direction, the first 2 bytes are the ME ID of the associated T- CONT, the first byte of which is a slot number, the second byte a T-CONT number.
+			relatedPort := append(tcontEntityId, 0x00, byte(j))
+			mibDb.items = append(mibDb.items, MibDbEntry{
+				me.PriorityQueueClassID,
+				queueEntityId, //was not reported in the original implementation
+				me.AttributeValueMap{
+					"QueueConfigurationOption":                            0,
+					"MaximumQueueSize":                                    100,
+					"AllocatedQueueSize":                                  100,
+					"DiscardBlockCounterResetInterval":                    0,
+					"ThresholdValueForDiscardedBlocksDueToBufferOverflow": 0,
+					"RelatedPort":                                         relatedPort.ToUint32(),
+					"TrafficSchedulerPointer":                             tsEntityId.ToUint16(), //it was hardcoded to 0x0108 in the current implementation
+					"Weight":                                              1,
+					"BackPressureOperation":                               1,
+					"BackPressureTime":                                    0,
+					"BackPressureOccurQueueThreshold":                     0,
+					"BackPressureClearQueueThreshold":                     0,
+				},
+			})
+		}
+	}
+
+	// ONU-2g
+	mibDb.items = append(mibDb.items, MibDbEntry{
+		me.Onu2GClassID,
+		EntityID{0x00, 0x00},
+		me.AttributeValueMap{
+			"ConnectivityCapability":                      127,
+			"CurrentConnectivityMode":                     0,
+			"Deprecated":                                  1,
+			"PriorityQueueScaleFactor":                    1,
+			"QualityOfServiceQosConfigurationFlexibility": 63,
+			"Sysuptime":                                   0,
+			"TotalGemPortIdNumber":                        8,
+			"TotalPriorityQueueNumber":                    64,
+			"TotalTrafficSchedulerNumber":                 8,
+		},
+	})
+
+	mibDb.NumberOfCommands = uint16(len(mibDb.items))
+
+	return &mibDb, nil
+}
diff --git a/internal/common/omci/onu_mib_db_test.go b/internal/common/omci/onu_mib_db_test.go
new file mode 100644
index 0000000..cea0daf
--- /dev/null
+++ b/internal/common/omci/onu_mib_db_test.go
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * 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 omci
+
+import (
+	"github.com/opencord/omci-lib-go"
+	me "github.com/opencord/omci-lib-go/generated"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestEntityID_ToUint16(t *testing.T) {
+	var id EntityID
+	var res uint16
+
+	id = EntityID{0x01, 0x01}
+	res = id.ToUint16()
+	assert.Equal(t, uint16(257), res)
+
+	id = EntityID{0x00, 0x00}
+	res = id.ToUint16()
+	assert.Equal(t, uint16(0), res)
+}
+
+func Test_GenerateMibDatabase(t *testing.T) {
+	const uniPortCount = 4
+	mibDb, err := GenerateMibDatabase(uniPortCount)
+
+	expectedItems := 9                     //ONU-G + 2 Circuit Packs (4 messages each)
+	expectedItems += 2 * uniPortCount      // 1 PPTP and 1 UniG per UNI
+	expectedItems += 1                     // ANI-G
+	expectedItems += 2 * tconts            // T-CONT and traffic schedulers
+	expectedItems += 1                     // ONU-2g
+	expectedItems += 2 * 8 * tconts        // 8 upstream queues for each T-CONT, and we report each queue twice
+	expectedItems += 2 * 16 * uniPortCount // 16 downstream queues for each T-CONT, and we report each queue twice
+
+	assert.NoError(t, err)
+	assert.NotNil(t, mibDb)
+	assert.Equal(t, expectedItems, int(mibDb.NumberOfCommands))
+
+	// now try to serialize all messages to check on the attributes
+	for _, entry := range mibDb.items {
+		reportedMe, meErr := me.LoadManagedEntityDefinition(entry.classId, me.ParamData{
+			EntityID:   entry.entityId.ToUint16(),
+			Attributes: entry.params,
+		})
+		assert.NoError(t, meErr.GetError())
+
+		response := &omci.MibUploadNextResponse{
+			MeBasePacket: omci.MeBasePacket{
+				EntityClass: me.OnuDataClassID,
+			},
+			ReportedME: *reportedMe,
+		}
+
+		_, err := Serialize(omci.MibUploadNextResponseType, response, uint16(10))
+		assert.NoError(t, err)
+	}
+
+}