diff --git a/go/inter_adapter/inter_adapter.pb.go b/go/inter_adapter/inter_adapter.pb.go
index fd76f67..901deb8 100644
--- a/go/inter_adapter/inter_adapter.pb.go
+++ b/go/inter_adapter/inter_adapter.pb.go
@@ -1,579 +1,673 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.36.11
+// 	protoc        v4.25.8
 // source: voltha_protos/inter_adapter.proto
 
 package inter_adapter
 
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
 	common "github.com/opencord/voltha-protos/v5/go/common"
 	openolt "github.com/opencord/voltha-protos/v5/go/openolt"
 	tech_profile "github.com/opencord/voltha-protos/v5/go/tech_profile"
 	voltha "github.com/opencord/voltha-protos/v5/go/voltha"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+	unsafe "unsafe"
 )
 
-// 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
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
 type OmciMessage struct {
-	Message              []byte                      `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-	ConnectStatus        common.ConnectStatus_Types  `protobuf:"varint,2,opt,name=connect_status,json=connectStatus,proto3,enum=common.ConnectStatus_Types" json:"connect_status,omitempty"`
-	ProxyAddress         *voltha.Device_ProxyAddress `protobuf:"bytes,3,opt,name=proxy_address,json=proxyAddress,proto3" json:"proxy_address,omitempty"`
-	ParentDeviceId       string                      `protobuf:"bytes,4,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
-	ChildDeviceId        string                      `protobuf:"bytes,5,opt,name=child_device_id,json=childDeviceId,proto3" json:"child_device_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
-	XXX_unrecognized     []byte                      `json:"-"`
-	XXX_sizecache        int32                       `json:"-"`
+	state          protoimpl.MessageState      `protogen:"open.v1"`
+	Message        []byte                      `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+	ConnectStatus  common.ConnectStatus_Types  `protobuf:"varint,2,opt,name=connect_status,json=connectStatus,proto3,enum=common.ConnectStatus_Types" json:"connect_status,omitempty"`
+	ProxyAddress   *voltha.Device_ProxyAddress `protobuf:"bytes,3,opt,name=proxy_address,json=proxyAddress,proto3" json:"proxy_address,omitempty"`
+	ParentDeviceId string                      `protobuf:"bytes,4,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
+	ChildDeviceId  string                      `protobuf:"bytes,5,opt,name=child_device_id,json=childDeviceId,proto3" json:"child_device_id,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *OmciMessage) Reset()         { *m = OmciMessage{} }
-func (m *OmciMessage) String() string { return proto.CompactTextString(m) }
-func (*OmciMessage) ProtoMessage()    {}
+func (x *OmciMessage) Reset() {
+	*x = OmciMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OmciMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OmciMessage) ProtoMessage() {}
+
+func (x *OmciMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[0]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OmciMessage.ProtoReflect.Descriptor instead.
 func (*OmciMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{0}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{0}
 }
 
-func (m *OmciMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OmciMessage.Unmarshal(m, b)
-}
-func (m *OmciMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OmciMessage.Marshal(b, m, deterministic)
-}
-func (m *OmciMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OmciMessage.Merge(m, src)
-}
-func (m *OmciMessage) XXX_Size() int {
-	return xxx_messageInfo_OmciMessage.Size(m)
-}
-func (m *OmciMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_OmciMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OmciMessage proto.InternalMessageInfo
-
-func (m *OmciMessage) GetMessage() []byte {
-	if m != nil {
-		return m.Message
+func (x *OmciMessage) GetMessage() []byte {
+	if x != nil {
+		return x.Message
 	}
 	return nil
 }
 
-func (m *OmciMessage) GetConnectStatus() common.ConnectStatus_Types {
-	if m != nil {
-		return m.ConnectStatus
+func (x *OmciMessage) GetConnectStatus() common.ConnectStatus_Types {
+	if x != nil {
+		return x.ConnectStatus
 	}
-	return common.ConnectStatus_UNKNOWN
+	return common.ConnectStatus_Types(0)
 }
 
-func (m *OmciMessage) GetProxyAddress() *voltha.Device_ProxyAddress {
-	if m != nil {
-		return m.ProxyAddress
+func (x *OmciMessage) GetProxyAddress() *voltha.Device_ProxyAddress {
+	if x != nil {
+		return x.ProxyAddress
 	}
 	return nil
 }
 
-func (m *OmciMessage) GetParentDeviceId() string {
-	if m != nil {
-		return m.ParentDeviceId
+func (x *OmciMessage) GetParentDeviceId() string {
+	if x != nil {
+		return x.ParentDeviceId
 	}
 	return ""
 }
 
-func (m *OmciMessage) GetChildDeviceId() string {
-	if m != nil {
-		return m.ChildDeviceId
+func (x *OmciMessage) GetChildDeviceId() string {
+	if x != nil {
+		return x.ChildDeviceId
 	}
 	return ""
 }
 
 type OmciMessages struct {
-	Messages             [][]byte                    `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"`
-	ConnectStatus        common.ConnectStatus_Types  `protobuf:"varint,2,opt,name=connect_status,json=connectStatus,proto3,enum=common.ConnectStatus_Types" json:"connect_status,omitempty"`
-	ProxyAddress         *voltha.Device_ProxyAddress `protobuf:"bytes,3,opt,name=proxy_address,json=proxyAddress,proto3" json:"proxy_address,omitempty"`
-	ParentDeviceId       string                      `protobuf:"bytes,4,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
-	ChildDeviceId        string                      `protobuf:"bytes,5,opt,name=child_device_id,json=childDeviceId,proto3" json:"child_device_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
-	XXX_unrecognized     []byte                      `json:"-"`
-	XXX_sizecache        int32                       `json:"-"`
+	state          protoimpl.MessageState      `protogen:"open.v1"`
+	Messages       [][]byte                    `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"`
+	ConnectStatus  common.ConnectStatus_Types  `protobuf:"varint,2,opt,name=connect_status,json=connectStatus,proto3,enum=common.ConnectStatus_Types" json:"connect_status,omitempty"`
+	ProxyAddress   *voltha.Device_ProxyAddress `protobuf:"bytes,3,opt,name=proxy_address,json=proxyAddress,proto3" json:"proxy_address,omitempty"`
+	ParentDeviceId string                      `protobuf:"bytes,4,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
+	ChildDeviceId  string                      `protobuf:"bytes,5,opt,name=child_device_id,json=childDeviceId,proto3" json:"child_device_id,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *OmciMessages) Reset()         { *m = OmciMessages{} }
-func (m *OmciMessages) String() string { return proto.CompactTextString(m) }
-func (*OmciMessages) ProtoMessage()    {}
+func (x *OmciMessages) Reset() {
+	*x = OmciMessages{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OmciMessages) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OmciMessages) ProtoMessage() {}
+
+func (x *OmciMessages) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[1]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OmciMessages.ProtoReflect.Descriptor instead.
 func (*OmciMessages) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{1}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *OmciMessages) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OmciMessages.Unmarshal(m, b)
-}
-func (m *OmciMessages) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OmciMessages.Marshal(b, m, deterministic)
-}
-func (m *OmciMessages) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OmciMessages.Merge(m, src)
-}
-func (m *OmciMessages) XXX_Size() int {
-	return xxx_messageInfo_OmciMessages.Size(m)
-}
-func (m *OmciMessages) XXX_DiscardUnknown() {
-	xxx_messageInfo_OmciMessages.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OmciMessages proto.InternalMessageInfo
-
-func (m *OmciMessages) GetMessages() [][]byte {
-	if m != nil {
-		return m.Messages
+func (x *OmciMessages) GetMessages() [][]byte {
+	if x != nil {
+		return x.Messages
 	}
 	return nil
 }
 
-func (m *OmciMessages) GetConnectStatus() common.ConnectStatus_Types {
-	if m != nil {
-		return m.ConnectStatus
+func (x *OmciMessages) GetConnectStatus() common.ConnectStatus_Types {
+	if x != nil {
+		return x.ConnectStatus
 	}
-	return common.ConnectStatus_UNKNOWN
+	return common.ConnectStatus_Types(0)
 }
 
-func (m *OmciMessages) GetProxyAddress() *voltha.Device_ProxyAddress {
-	if m != nil {
-		return m.ProxyAddress
+func (x *OmciMessages) GetProxyAddress() *voltha.Device_ProxyAddress {
+	if x != nil {
+		return x.ProxyAddress
 	}
 	return nil
 }
 
-func (m *OmciMessages) GetParentDeviceId() string {
-	if m != nil {
-		return m.ParentDeviceId
+func (x *OmciMessages) GetParentDeviceId() string {
+	if x != nil {
+		return x.ParentDeviceId
 	}
 	return ""
 }
 
-func (m *OmciMessages) GetChildDeviceId() string {
-	if m != nil {
-		return m.ChildDeviceId
+func (x *OmciMessages) GetChildDeviceId() string {
+	if x != nil {
+		return x.ChildDeviceId
 	}
 	return ""
 }
 
 type TechProfileDownloadMessage struct {
-	DeviceId       string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	UniId          uint32 `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
-	TpInstancePath string `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	DeviceId       string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	UniId          uint32                 `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+	TpInstancePath string                 `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
 	// Types that are valid to be assigned to TechTpInstance:
+	//
 	//	*TechProfileDownloadMessage_TpInstance
 	//	*TechProfileDownloadMessage_EponTpInstance
-	TechTpInstance       isTechProfileDownloadMessage_TechTpInstance `protobuf_oneof:"tech_tp_instance"`
-	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
-	XXX_unrecognized     []byte                                      `json:"-"`
-	XXX_sizecache        int32                                       `json:"-"`
+	TechTpInstance isTechProfileDownloadMessage_TechTpInstance `protobuf_oneof:"tech_tp_instance"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *TechProfileDownloadMessage) Reset()         { *m = TechProfileDownloadMessage{} }
-func (m *TechProfileDownloadMessage) String() string { return proto.CompactTextString(m) }
-func (*TechProfileDownloadMessage) ProtoMessage()    {}
+func (x *TechProfileDownloadMessage) Reset() {
+	*x = TechProfileDownloadMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *TechProfileDownloadMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TechProfileDownloadMessage) ProtoMessage() {}
+
+func (x *TechProfileDownloadMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[2]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TechProfileDownloadMessage.ProtoReflect.Descriptor instead.
 func (*TechProfileDownloadMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{2}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *TechProfileDownloadMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TechProfileDownloadMessage.Unmarshal(m, b)
-}
-func (m *TechProfileDownloadMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TechProfileDownloadMessage.Marshal(b, m, deterministic)
-}
-func (m *TechProfileDownloadMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TechProfileDownloadMessage.Merge(m, src)
-}
-func (m *TechProfileDownloadMessage) XXX_Size() int {
-	return xxx_messageInfo_TechProfileDownloadMessage.Size(m)
-}
-func (m *TechProfileDownloadMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_TechProfileDownloadMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TechProfileDownloadMessage proto.InternalMessageInfo
-
-func (m *TechProfileDownloadMessage) GetDeviceId() string {
-	if m != nil {
-		return m.DeviceId
+func (x *TechProfileDownloadMessage) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
 	}
 	return ""
 }
 
-func (m *TechProfileDownloadMessage) GetUniId() uint32 {
-	if m != nil {
-		return m.UniId
+func (x *TechProfileDownloadMessage) GetUniId() uint32 {
+	if x != nil {
+		return x.UniId
 	}
 	return 0
 }
 
-func (m *TechProfileDownloadMessage) GetTpInstancePath() string {
-	if m != nil {
-		return m.TpInstancePath
+func (x *TechProfileDownloadMessage) GetTpInstancePath() string {
+	if x != nil {
+		return x.TpInstancePath
 	}
 	return ""
 }
 
+func (x *TechProfileDownloadMessage) GetTechTpInstance() isTechProfileDownloadMessage_TechTpInstance {
+	if x != nil {
+		return x.TechTpInstance
+	}
+	return nil
+}
+
+func (x *TechProfileDownloadMessage) GetTpInstance() *tech_profile.TechProfileInstance {
+	if x != nil {
+		if x, ok := x.TechTpInstance.(*TechProfileDownloadMessage_TpInstance); ok {
+			return x.TpInstance
+		}
+	}
+	return nil
+}
+
+func (x *TechProfileDownloadMessage) GetEponTpInstance() *tech_profile.EponTechProfileInstance {
+	if x != nil {
+		if x, ok := x.TechTpInstance.(*TechProfileDownloadMessage_EponTpInstance); ok {
+			return x.EponTpInstance
+		}
+	}
+	return nil
+}
+
 type isTechProfileDownloadMessage_TechTpInstance interface {
 	isTechProfileDownloadMessage_TechTpInstance()
 }
 
 type TechProfileDownloadMessage_TpInstance struct {
-	TpInstance *tech_profile.TechProfileInstance `protobuf:"bytes,4,opt,name=tp_instance,json=tpInstance,proto3,oneof"`
+	TpInstance *tech_profile.TechProfileInstance `protobuf:"bytes,4,opt,name=tp_instance,json=tpInstance,proto3,oneof"` // relevant for GPON, XGPON and XGS-PON technologies
 }
 
 type TechProfileDownloadMessage_EponTpInstance struct {
-	EponTpInstance *tech_profile.EponTechProfileInstance `protobuf:"bytes,5,opt,name=epon_tp_instance,json=eponTpInstance,proto3,oneof"`
+	EponTpInstance *tech_profile.EponTechProfileInstance `protobuf:"bytes,5,opt,name=epon_tp_instance,json=eponTpInstance,proto3,oneof"` // relevant for EPON technology
 }
 
 func (*TechProfileDownloadMessage_TpInstance) isTechProfileDownloadMessage_TechTpInstance() {}
 
 func (*TechProfileDownloadMessage_EponTpInstance) isTechProfileDownloadMessage_TechTpInstance() {}
 
-func (m *TechProfileDownloadMessage) GetTechTpInstance() isTechProfileDownloadMessage_TechTpInstance {
-	if m != nil {
-		return m.TechTpInstance
-	}
-	return nil
-}
-
-func (m *TechProfileDownloadMessage) GetTpInstance() *tech_profile.TechProfileInstance {
-	if x, ok := m.GetTechTpInstance().(*TechProfileDownloadMessage_TpInstance); ok {
-		return x.TpInstance
-	}
-	return nil
-}
-
-func (m *TechProfileDownloadMessage) GetEponTpInstance() *tech_profile.EponTechProfileInstance {
-	if x, ok := m.GetTechTpInstance().(*TechProfileDownloadMessage_EponTpInstance); ok {
-		return x.EponTpInstance
-	}
-	return nil
-}
-
-// XXX_OneofWrappers is for the internal use of the proto package.
-func (*TechProfileDownloadMessage) XXX_OneofWrappers() []interface{} {
-	return []interface{}{
-		(*TechProfileDownloadMessage_TpInstance)(nil),
-		(*TechProfileDownloadMessage_EponTpInstance)(nil),
-	}
-}
-
 type DeleteGemPortMessage struct {
-	DeviceId             string   `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	UniId                uint32   `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
-	TpInstancePath       string   `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
-	GemPortId            uint32   `protobuf:"varint,4,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	DeviceId       string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	UniId          uint32                 `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+	TpInstancePath string                 `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
+	GemPortId      uint32                 `protobuf:"varint,4,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *DeleteGemPortMessage) Reset()         { *m = DeleteGemPortMessage{} }
-func (m *DeleteGemPortMessage) String() string { return proto.CompactTextString(m) }
-func (*DeleteGemPortMessage) ProtoMessage()    {}
+func (x *DeleteGemPortMessage) Reset() {
+	*x = DeleteGemPortMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteGemPortMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteGemPortMessage) ProtoMessage() {}
+
+func (x *DeleteGemPortMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[3]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteGemPortMessage.ProtoReflect.Descriptor instead.
 func (*DeleteGemPortMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{3}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{3}
 }
 
-func (m *DeleteGemPortMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeleteGemPortMessage.Unmarshal(m, b)
-}
-func (m *DeleteGemPortMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeleteGemPortMessage.Marshal(b, m, deterministic)
-}
-func (m *DeleteGemPortMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteGemPortMessage.Merge(m, src)
-}
-func (m *DeleteGemPortMessage) XXX_Size() int {
-	return xxx_messageInfo_DeleteGemPortMessage.Size(m)
-}
-func (m *DeleteGemPortMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeleteGemPortMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DeleteGemPortMessage proto.InternalMessageInfo
-
-func (m *DeleteGemPortMessage) GetDeviceId() string {
-	if m != nil {
-		return m.DeviceId
+func (x *DeleteGemPortMessage) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
 	}
 	return ""
 }
 
-func (m *DeleteGemPortMessage) GetUniId() uint32 {
-	if m != nil {
-		return m.UniId
+func (x *DeleteGemPortMessage) GetUniId() uint32 {
+	if x != nil {
+		return x.UniId
 	}
 	return 0
 }
 
-func (m *DeleteGemPortMessage) GetTpInstancePath() string {
-	if m != nil {
-		return m.TpInstancePath
+func (x *DeleteGemPortMessage) GetTpInstancePath() string {
+	if x != nil {
+		return x.TpInstancePath
 	}
 	return ""
 }
 
-func (m *DeleteGemPortMessage) GetGemPortId() uint32 {
-	if m != nil {
-		return m.GemPortId
+func (x *DeleteGemPortMessage) GetGemPortId() uint32 {
+	if x != nil {
+		return x.GemPortId
 	}
 	return 0
 }
 
 type DeleteTcontMessage struct {
-	DeviceId             string   `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	UniId                uint32   `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
-	TpInstancePath       string   `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
-	AllocId              uint32   `protobuf:"varint,4,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	DeviceId       string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	UniId          uint32                 `protobuf:"varint,2,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+	TpInstancePath string                 `protobuf:"bytes,3,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
+	AllocId        uint32                 `protobuf:"varint,4,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *DeleteTcontMessage) Reset()         { *m = DeleteTcontMessage{} }
-func (m *DeleteTcontMessage) String() string { return proto.CompactTextString(m) }
-func (*DeleteTcontMessage) ProtoMessage()    {}
+func (x *DeleteTcontMessage) Reset() {
+	*x = DeleteTcontMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteTcontMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteTcontMessage) ProtoMessage() {}
+
+func (x *DeleteTcontMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[4]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteTcontMessage.ProtoReflect.Descriptor instead.
 func (*DeleteTcontMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{4}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{4}
 }
 
-func (m *DeleteTcontMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeleteTcontMessage.Unmarshal(m, b)
-}
-func (m *DeleteTcontMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeleteTcontMessage.Marshal(b, m, deterministic)
-}
-func (m *DeleteTcontMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteTcontMessage.Merge(m, src)
-}
-func (m *DeleteTcontMessage) XXX_Size() int {
-	return xxx_messageInfo_DeleteTcontMessage.Size(m)
-}
-func (m *DeleteTcontMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeleteTcontMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DeleteTcontMessage proto.InternalMessageInfo
-
-func (m *DeleteTcontMessage) GetDeviceId() string {
-	if m != nil {
-		return m.DeviceId
+func (x *DeleteTcontMessage) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
 	}
 	return ""
 }
 
-func (m *DeleteTcontMessage) GetUniId() uint32 {
-	if m != nil {
-		return m.UniId
+func (x *DeleteTcontMessage) GetUniId() uint32 {
+	if x != nil {
+		return x.UniId
 	}
 	return 0
 }
 
-func (m *DeleteTcontMessage) GetTpInstancePath() string {
-	if m != nil {
-		return m.TpInstancePath
+func (x *DeleteTcontMessage) GetTpInstancePath() string {
+	if x != nil {
+		return x.TpInstancePath
 	}
 	return ""
 }
 
-func (m *DeleteTcontMessage) GetAllocId() uint32 {
-	if m != nil {
-		return m.AllocId
+func (x *DeleteTcontMessage) GetAllocId() uint32 {
+	if x != nil {
+		return x.AllocId
 	}
 	return 0
 }
 
 type OnuIndicationMessage struct {
-	DeviceId             string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	OnuIndication        *openolt.OnuIndication `protobuf:"bytes,2,opt,name=onu_indication,json=onuIndication,proto3" json:"onu_indication,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
-	XXX_unrecognized     []byte                 `json:"-"`
-	XXX_sizecache        int32                  `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	DeviceId      string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	OnuIndication *openolt.OnuIndication `protobuf:"bytes,2,opt,name=onu_indication,json=onuIndication,proto3" json:"onu_indication,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *OnuIndicationMessage) Reset()         { *m = OnuIndicationMessage{} }
-func (m *OnuIndicationMessage) String() string { return proto.CompactTextString(m) }
-func (*OnuIndicationMessage) ProtoMessage()    {}
+func (x *OnuIndicationMessage) Reset() {
+	*x = OnuIndicationMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OnuIndicationMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnuIndicationMessage) ProtoMessage() {}
+
+func (x *OnuIndicationMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[5]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OnuIndicationMessage.ProtoReflect.Descriptor instead.
 func (*OnuIndicationMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{5}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{5}
 }
 
-func (m *OnuIndicationMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_OnuIndicationMessage.Unmarshal(m, b)
-}
-func (m *OnuIndicationMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_OnuIndicationMessage.Marshal(b, m, deterministic)
-}
-func (m *OnuIndicationMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OnuIndicationMessage.Merge(m, src)
-}
-func (m *OnuIndicationMessage) XXX_Size() int {
-	return xxx_messageInfo_OnuIndicationMessage.Size(m)
-}
-func (m *OnuIndicationMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_OnuIndicationMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_OnuIndicationMessage proto.InternalMessageInfo
-
-func (m *OnuIndicationMessage) GetDeviceId() string {
-	if m != nil {
-		return m.DeviceId
+func (x *OnuIndicationMessage) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
 	}
 	return ""
 }
 
-func (m *OnuIndicationMessage) GetOnuIndication() *openolt.OnuIndication {
-	if m != nil {
-		return m.OnuIndication
+func (x *OnuIndicationMessage) GetOnuIndication() *openolt.OnuIndication {
+	if x != nil {
+		return x.OnuIndication
 	}
 	return nil
 }
 
 type TechProfileInstanceRequestMessage struct {
-	DeviceId             string   `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	TpInstancePath       string   `protobuf:"bytes,2,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"`
-	ParentDeviceId       string   `protobuf:"bytes,3,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
-	ParentPonPort        uint32   `protobuf:"varint,4,opt,name=parent_pon_port,json=parentPonPort,proto3" json:"parent_pon_port,omitempty"`
-	OnuId                uint32   `protobuf:"varint,5,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	UniId                uint32   `protobuf:"varint,6,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	DeviceId       string                 `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	TpInstancePath string                 `protobuf:"bytes,2,opt,name=tp_instance_path,json=tpInstancePath,proto3" json:"tp_instance_path,omitempty"` // technology profile instance path
+	ParentDeviceId string                 `protobuf:"bytes,3,opt,name=parent_device_id,json=parentDeviceId,proto3" json:"parent_device_id,omitempty"`
+	ParentPonPort  uint32                 `protobuf:"varint,4,opt,name=parent_pon_port,json=parentPonPort,proto3" json:"parent_pon_port,omitempty"`
+	OnuId          uint32                 `protobuf:"varint,5,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	UniId          uint32                 `protobuf:"varint,6,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *TechProfileInstanceRequestMessage) Reset()         { *m = TechProfileInstanceRequestMessage{} }
-func (m *TechProfileInstanceRequestMessage) String() string { return proto.CompactTextString(m) }
-func (*TechProfileInstanceRequestMessage) ProtoMessage()    {}
+func (x *TechProfileInstanceRequestMessage) Reset() {
+	*x = TechProfileInstanceRequestMessage{}
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *TechProfileInstanceRequestMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TechProfileInstanceRequestMessage) ProtoMessage() {}
+
+func (x *TechProfileInstanceRequestMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_inter_adapter_proto_msgTypes[6]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TechProfileInstanceRequestMessage.ProtoReflect.Descriptor instead.
 func (*TechProfileInstanceRequestMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a316e60f0a1fb837, []int{6}
+	return file_voltha_protos_inter_adapter_proto_rawDescGZIP(), []int{6}
 }
 
-func (m *TechProfileInstanceRequestMessage) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TechProfileInstanceRequestMessage.Unmarshal(m, b)
-}
-func (m *TechProfileInstanceRequestMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TechProfileInstanceRequestMessage.Marshal(b, m, deterministic)
-}
-func (m *TechProfileInstanceRequestMessage) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TechProfileInstanceRequestMessage.Merge(m, src)
-}
-func (m *TechProfileInstanceRequestMessage) XXX_Size() int {
-	return xxx_messageInfo_TechProfileInstanceRequestMessage.Size(m)
-}
-func (m *TechProfileInstanceRequestMessage) XXX_DiscardUnknown() {
-	xxx_messageInfo_TechProfileInstanceRequestMessage.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TechProfileInstanceRequestMessage proto.InternalMessageInfo
-
-func (m *TechProfileInstanceRequestMessage) GetDeviceId() string {
-	if m != nil {
-		return m.DeviceId
+func (x *TechProfileInstanceRequestMessage) GetDeviceId() string {
+	if x != nil {
+		return x.DeviceId
 	}
 	return ""
 }
 
-func (m *TechProfileInstanceRequestMessage) GetTpInstancePath() string {
-	if m != nil {
-		return m.TpInstancePath
+func (x *TechProfileInstanceRequestMessage) GetTpInstancePath() string {
+	if x != nil {
+		return x.TpInstancePath
 	}
 	return ""
 }
 
-func (m *TechProfileInstanceRequestMessage) GetParentDeviceId() string {
-	if m != nil {
-		return m.ParentDeviceId
+func (x *TechProfileInstanceRequestMessage) GetParentDeviceId() string {
+	if x != nil {
+		return x.ParentDeviceId
 	}
 	return ""
 }
 
-func (m *TechProfileInstanceRequestMessage) GetParentPonPort() uint32 {
-	if m != nil {
-		return m.ParentPonPort
+func (x *TechProfileInstanceRequestMessage) GetParentPonPort() uint32 {
+	if x != nil {
+		return x.ParentPonPort
 	}
 	return 0
 }
 
-func (m *TechProfileInstanceRequestMessage) GetOnuId() uint32 {
-	if m != nil {
-		return m.OnuId
+func (x *TechProfileInstanceRequestMessage) GetOnuId() uint32 {
+	if x != nil {
+		return x.OnuId
 	}
 	return 0
 }
 
-func (m *TechProfileInstanceRequestMessage) GetUniId() uint32 {
-	if m != nil {
-		return m.UniId
+func (x *TechProfileInstanceRequestMessage) GetUniId() uint32 {
+	if x != nil {
+		return x.UniId
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*OmciMessage)(nil), "inter_adapter.OmciMessage")
-	proto.RegisterType((*OmciMessages)(nil), "inter_adapter.OmciMessages")
-	proto.RegisterType((*TechProfileDownloadMessage)(nil), "inter_adapter.TechProfileDownloadMessage")
-	proto.RegisterType((*DeleteGemPortMessage)(nil), "inter_adapter.DeleteGemPortMessage")
-	proto.RegisterType((*DeleteTcontMessage)(nil), "inter_adapter.DeleteTcontMessage")
-	proto.RegisterType((*OnuIndicationMessage)(nil), "inter_adapter.OnuIndicationMessage")
-	proto.RegisterType((*TechProfileInstanceRequestMessage)(nil), "inter_adapter.TechProfileInstanceRequestMessage")
+var File_voltha_protos_inter_adapter_proto protoreflect.FileDescriptor
+
+const file_voltha_protos_inter_adapter_proto_rawDesc = "" +
+	"\n" +
+	"!voltha_protos/inter_adapter.proto\x12\rinter_adapter\x1a\x1avoltha_protos/common.proto\x1a\x1avoltha_protos/voltha.proto\x1a voltha_protos/tech_profile.proto\x1a\x1bvoltha_protos/openolt.proto\x1a\x1avoltha_protos/device.proto\"\xff\x01\n" +
+	"\vOmciMessage\x12\x18\n" +
+	"\amessage\x18\x01 \x01(\fR\amessage\x12B\n" +
+	"\x0econnect_status\x18\x02 \x01(\x0e2\x1b.common.ConnectStatus.TypesR\rconnectStatus\x12@\n" +
+	"\rproxy_address\x18\x03 \x01(\v2\x1b.device.Device.ProxyAddressR\fproxyAddress\x12(\n" +
+	"\x10parent_device_id\x18\x04 \x01(\tR\x0eparentDeviceId\x12&\n" +
+	"\x0fchild_device_id\x18\x05 \x01(\tR\rchildDeviceId\"\x82\x02\n" +
+	"\fOmciMessages\x12\x1a\n" +
+	"\bmessages\x18\x01 \x03(\fR\bmessages\x12B\n" +
+	"\x0econnect_status\x18\x02 \x01(\x0e2\x1b.common.ConnectStatus.TypesR\rconnectStatus\x12@\n" +
+	"\rproxy_address\x18\x03 \x01(\v2\x1b.device.Device.ProxyAddressR\fproxyAddress\x12(\n" +
+	"\x10parent_device_id\x18\x04 \x01(\tR\x0eparentDeviceId\x12&\n" +
+	"\x0fchild_device_id\x18\x05 \x01(\tR\rchildDeviceId\"\xa7\x02\n" +
+	"\x1aTechProfileDownloadMessage\x12\x1b\n" +
+	"\tdevice_id\x18\x01 \x01(\tR\bdeviceId\x12\x15\n" +
+	"\x06uni_id\x18\x02 \x01(\rR\x05uniId\x12(\n" +
+	"\x10tp_instance_path\x18\x03 \x01(\tR\x0etpInstancePath\x12D\n" +
+	"\vtp_instance\x18\x04 \x01(\v2!.tech_profile.TechProfileInstanceH\x00R\n" +
+	"tpInstance\x12Q\n" +
+	"\x10epon_tp_instance\x18\x05 \x01(\v2%.tech_profile.EponTechProfileInstanceH\x00R\x0eeponTpInstanceB\x12\n" +
+	"\x10tech_tp_instance\"\x94\x01\n" +
+	"\x14DeleteGemPortMessage\x12\x1b\n" +
+	"\tdevice_id\x18\x01 \x01(\tR\bdeviceId\x12\x15\n" +
+	"\x06uni_id\x18\x02 \x01(\rR\x05uniId\x12(\n" +
+	"\x10tp_instance_path\x18\x03 \x01(\tR\x0etpInstancePath\x12\x1e\n" +
+	"\vgem_port_id\x18\x04 \x01(\rR\tgemPortId\"\x8d\x01\n" +
+	"\x12DeleteTcontMessage\x12\x1b\n" +
+	"\tdevice_id\x18\x01 \x01(\tR\bdeviceId\x12\x15\n" +
+	"\x06uni_id\x18\x02 \x01(\rR\x05uniId\x12(\n" +
+	"\x10tp_instance_path\x18\x03 \x01(\tR\x0etpInstancePath\x12\x19\n" +
+	"\balloc_id\x18\x04 \x01(\rR\aallocId\"r\n" +
+	"\x14OnuIndicationMessage\x12\x1b\n" +
+	"\tdevice_id\x18\x01 \x01(\tR\bdeviceId\x12=\n" +
+	"\x0eonu_indication\x18\x02 \x01(\v2\x16.openolt.OnuIndicationR\ronuIndication\"\xea\x01\n" +
+	"!TechProfileInstanceRequestMessage\x12\x1b\n" +
+	"\tdevice_id\x18\x01 \x01(\tR\bdeviceId\x12(\n" +
+	"\x10tp_instance_path\x18\x02 \x01(\tR\x0etpInstancePath\x12(\n" +
+	"\x10parent_device_id\x18\x03 \x01(\tR\x0eparentDeviceId\x12&\n" +
+	"\x0fparent_pon_port\x18\x04 \x01(\rR\rparentPonPort\x12\x15\n" +
+	"\x06onu_id\x18\x05 \x01(\rR\x05onuId\x12\x15\n" +
+	"\x06uni_id\x18\x06 \x01(\rR\x05uniIdBZ\n" +
+	"!org.opencord.voltha.inter_adapterZ5github.com/opencord/voltha-protos/v5/go/inter_adapterb\x06proto3"
+
+var (
+	file_voltha_protos_inter_adapter_proto_rawDescOnce sync.Once
+	file_voltha_protos_inter_adapter_proto_rawDescData []byte
+)
+
+func file_voltha_protos_inter_adapter_proto_rawDescGZIP() []byte {
+	file_voltha_protos_inter_adapter_proto_rawDescOnce.Do(func() {
+		file_voltha_protos_inter_adapter_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_inter_adapter_proto_rawDesc), len(file_voltha_protos_inter_adapter_proto_rawDesc)))
+	})
+	return file_voltha_protos_inter_adapter_proto_rawDescData
 }
 
-func init() { proto.RegisterFile("voltha_protos/inter_adapter.proto", fileDescriptor_a316e60f0a1fb837) }
+var file_voltha_protos_inter_adapter_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_voltha_protos_inter_adapter_proto_goTypes = []any{
+	(*OmciMessage)(nil),                          // 0: inter_adapter.OmciMessage
+	(*OmciMessages)(nil),                         // 1: inter_adapter.OmciMessages
+	(*TechProfileDownloadMessage)(nil),           // 2: inter_adapter.TechProfileDownloadMessage
+	(*DeleteGemPortMessage)(nil),                 // 3: inter_adapter.DeleteGemPortMessage
+	(*DeleteTcontMessage)(nil),                   // 4: inter_adapter.DeleteTcontMessage
+	(*OnuIndicationMessage)(nil),                 // 5: inter_adapter.OnuIndicationMessage
+	(*TechProfileInstanceRequestMessage)(nil),    // 6: inter_adapter.TechProfileInstanceRequestMessage
+	(common.ConnectStatus_Types)(0),              // 7: common.ConnectStatus.Types
+	(*voltha.Device_ProxyAddress)(nil),           // 8: device.Device.ProxyAddress
+	(*tech_profile.TechProfileInstance)(nil),     // 9: tech_profile.TechProfileInstance
+	(*tech_profile.EponTechProfileInstance)(nil), // 10: tech_profile.EponTechProfileInstance
+	(*openolt.OnuIndication)(nil),                // 11: openolt.OnuIndication
+}
+var file_voltha_protos_inter_adapter_proto_depIdxs = []int32{
+	7,  // 0: inter_adapter.OmciMessage.connect_status:type_name -> common.ConnectStatus.Types
+	8,  // 1: inter_adapter.OmciMessage.proxy_address:type_name -> device.Device.ProxyAddress
+	7,  // 2: inter_adapter.OmciMessages.connect_status:type_name -> common.ConnectStatus.Types
+	8,  // 3: inter_adapter.OmciMessages.proxy_address:type_name -> device.Device.ProxyAddress
+	9,  // 4: inter_adapter.TechProfileDownloadMessage.tp_instance:type_name -> tech_profile.TechProfileInstance
+	10, // 5: inter_adapter.TechProfileDownloadMessage.epon_tp_instance:type_name -> tech_profile.EponTechProfileInstance
+	11, // 6: inter_adapter.OnuIndicationMessage.onu_indication:type_name -> openolt.OnuIndication
+	7,  // [7:7] is the sub-list for method output_type
+	7,  // [7:7] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
+}
 
-var fileDescriptor_a316e60f0a1fb837 = []byte{
-	// 632 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x55, 0xc1, 0x6e, 0xd3, 0x4c,
-	0x10, 0xfe, 0x9d, 0xfe, 0x69, 0x9b, 0x49, 0x1c, 0x2a, 0xab, 0xa0, 0x90, 0x48, 0x28, 0x89, 0x04,
-	0xca, 0x05, 0x57, 0x0a, 0xea, 0x11, 0x09, 0x4a, 0x10, 0xe4, 0x80, 0x1a, 0x4c, 0x4e, 0xbd, 0x58,
-	0xdb, 0xdd, 0x25, 0x5e, 0xc9, 0xd9, 0x59, 0xec, 0x75, 0xa1, 0x57, 0xee, 0xdc, 0x78, 0x07, 0xde,
-	0x8d, 0x97, 0x00, 0x79, 0xd7, 0x6e, 0x6c, 0x64, 0xa4, 0x9e, 0x7a, 0xe0, 0x14, 0xcf, 0xcc, 0x37,
-	0x5f, 0xbe, 0x99, 0xd9, 0xdd, 0x81, 0xc9, 0x15, 0xc6, 0x3a, 0x22, 0xa1, 0x4a, 0x50, 0x63, 0x7a,
-	0x22, 0xa4, 0xe6, 0x49, 0x48, 0x18, 0x51, 0x9a, 0x27, 0xbe, 0x71, 0x7a, 0x6e, 0xcd, 0x39, 0x1c,
-	0xd6, 0x33, 0x28, 0x6e, 0xb7, 0x28, 0x2d, 0xf4, 0xcf, 0x98, 0xb5, 0x8a, 0xd8, 0xb8, 0x1e, 0xd3,
-	0x9c, 0x46, 0xf9, 0xf7, 0x47, 0x11, 0xf3, 0x02, 0x31, 0xaa, 0x23, 0x50, 0x71, 0x89, 0xb1, 0x6e,
-	0xa6, 0x66, 0xfc, 0x4a, 0xd0, 0x22, 0x71, 0xfa, 0xcb, 0x81, 0xee, 0xf9, 0x96, 0x8a, 0x77, 0x3c,
-	0x4d, 0xc9, 0x86, 0x7b, 0x03, 0x38, 0xd8, 0xda, 0xcf, 0x81, 0x33, 0x76, 0x66, 0xbd, 0xa0, 0x34,
-	0xbd, 0x33, 0xe8, 0x53, 0x94, 0x92, 0x53, 0x1d, 0xa6, 0x9a, 0xe8, 0x2c, 0x1d, 0xb4, 0xc6, 0xce,
-	0xac, 0x3f, 0x1f, 0xf9, 0x45, 0x1d, 0xaf, 0x6c, 0xf4, 0x83, 0x09, 0xfa, 0xeb, 0x6b, 0xc5, 0xd3,
-	0xc0, 0xa5, 0x55, 0xa7, 0xf7, 0x02, 0x5c, 0x95, 0xe0, 0x97, 0xeb, 0x90, 0x30, 0x96, 0xf0, 0x34,
-	0x1d, 0xec, 0x8d, 0x9d, 0x59, 0x77, 0x3e, 0xf2, 0x0b, 0x4d, 0x0b, 0xfb, 0xb3, 0xca, 0x31, 0x2f,
-	0x2d, 0x24, 0xe8, 0xa9, 0x8a, 0xe5, 0xcd, 0xe0, 0x48, 0x91, 0x84, 0x4b, 0x1d, 0xda, 0x94, 0x50,
-	0xb0, 0xc1, 0xff, 0x63, 0x67, 0xd6, 0x09, 0xfa, 0xd6, 0x6f, 0x29, 0x96, 0xcc, 0x7b, 0x02, 0xf7,
-	0x68, 0x24, 0x62, 0x56, 0x01, 0xb6, 0x0d, 0xd0, 0x35, 0xee, 0x12, 0x37, 0xfd, 0xda, 0x82, 0x5e,
-	0xa5, 0x03, 0xa9, 0x37, 0x84, 0xc3, 0xa2, 0xe6, 0x74, 0xe0, 0x8c, 0xf7, 0x66, 0xbd, 0xe0, 0xc6,
-	0xfe, 0x67, 0x9b, 0xf0, 0xa3, 0x05, 0xc3, 0x35, 0xa7, 0xd1, 0xca, 0x9e, 0xaa, 0x05, 0x7e, 0x96,
-	0x31, 0x12, 0x56, 0x9e, 0x8a, 0x11, 0x74, 0x76, 0x04, 0x8e, 0x21, 0x38, 0x64, 0xe5, 0x7f, 0xdc,
-	0x87, 0xfd, 0x4c, 0x8a, 0x3c, 0x92, 0xf7, 0xc2, 0x0d, 0xda, 0x99, 0x14, 0x4b, 0x96, 0x8b, 0xd4,
-	0x2a, 0x14, 0x32, 0xd5, 0x44, 0x52, 0x1e, 0x2a, 0xa2, 0x23, 0x53, 0x69, 0x27, 0xe8, 0x6b, 0xb5,
-	0x2c, 0xdc, 0x2b, 0xa2, 0x23, 0x6f, 0x01, 0xdd, 0x0a, 0xd2, 0x54, 0xd2, 0x9d, 0x4f, 0xfc, 0xda,
-	0x31, 0xaf, 0x88, 0x2b, 0x73, 0xdf, 0xfe, 0x17, 0xc0, 0x8e, 0xc9, 0x7b, 0x0f, 0x47, 0x5c, 0xa1,
-	0x0c, 0xab, 0x54, 0x6d, 0x43, 0xf5, 0xb8, 0x4e, 0xf5, 0x5a, 0xa1, 0x6c, 0xa6, 0xeb, 0xe7, 0x04,
-	0xeb, 0x1b, 0xca, 0x33, 0x0f, 0x8e, 0x4c, 0x66, 0x85, 0x72, 0xfa, 0xdd, 0x81, 0xe3, 0x05, 0x8f,
-	0xb9, 0xe6, 0x6f, 0xf8, 0x76, 0x85, 0x89, 0xbe, 0x9b, 0x1e, 0x3d, 0x82, 0xee, 0x86, 0x6f, 0x43,
-	0x85, 0x89, 0x2e, 0xa7, 0xed, 0x06, 0x9d, 0x8d, 0x95, 0xb0, 0x64, 0xd3, 0x6f, 0x0e, 0x78, 0x56,
-	0xd6, 0x9a, 0xa2, 0xbc, 0x23, 0x51, 0x0f, 0xe1, 0x90, 0xc4, 0x31, 0xd2, 0x9d, 0xa2, 0x03, 0x63,
-	0x2f, 0xd9, 0x34, 0x81, 0xe3, 0x73, 0x99, 0x2d, 0x25, 0x13, 0x94, 0x68, 0x81, 0xf2, 0x56, 0x82,
-	0x9e, 0x43, 0x1f, 0x65, 0x16, 0x8a, 0x9b, 0x2c, 0x23, 0xac, 0x3b, 0x7f, 0xe0, 0x97, 0x0f, 0x5a,
-	0x8d, 0x33, 0x70, 0xb1, 0x6a, 0x4e, 0x7f, 0x3a, 0x30, 0x69, 0x18, 0x6c, 0xc0, 0x3f, 0x65, 0x3c,
-	0xbd, 0x5d, 0x4b, 0x9a, 0x6a, 0x6f, 0x35, 0xd6, 0xde, 0x74, 0x07, 0xf7, 0xfe, 0x76, 0x07, 0x0b,
-	0x64, 0x7e, 0x3c, 0xf3, 0x09, 0x16, 0xcd, 0x72, 0xad, 0x7b, 0x85, 0x32, 0x1f, 0x62, 0x3e, 0x0e,
-	0x53, 0xbd, 0xbd, 0xa2, 0x6e, 0xd0, 0xce, 0xab, 0xab, 0x4e, 0x69, 0xbf, 0x32, 0xa5, 0xb3, 0x0b,
-	0x98, 0x60, 0xb2, 0x31, 0x8d, 0xa1, 0x98, 0x30, 0xbf, 0x58, 0x18, 0xb5, 0x85, 0x73, 0x71, 0xba,
-	0x11, 0x3a, 0xca, 0x2e, 0xf3, 0xc7, 0xe9, 0xa4, 0x44, 0x16, 0xab, 0xe5, 0x69, 0xb9, 0x68, 0x4e,
-	0x4f, 0x36, 0x58, 0x5f, 0x5e, 0x97, 0xfb, 0x26, 0xf6, 0xec, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff,
-	0xeb, 0x5f, 0xd8, 0xf3, 0xe2, 0x06, 0x00, 0x00,
+func init() { file_voltha_protos_inter_adapter_proto_init() }
+func file_voltha_protos_inter_adapter_proto_init() {
+	if File_voltha_protos_inter_adapter_proto != nil {
+		return
+	}
+	file_voltha_protos_inter_adapter_proto_msgTypes[2].OneofWrappers = []any{
+		(*TechProfileDownloadMessage_TpInstance)(nil),
+		(*TechProfileDownloadMessage_EponTpInstance)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: unsafe.Slice(unsafe.StringData(file_voltha_protos_inter_adapter_proto_rawDesc), len(file_voltha_protos_inter_adapter_proto_rawDesc)),
+			NumEnums:      0,
+			NumMessages:   7,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_voltha_protos_inter_adapter_proto_goTypes,
+		DependencyIndexes: file_voltha_protos_inter_adapter_proto_depIdxs,
+		MessageInfos:      file_voltha_protos_inter_adapter_proto_msgTypes,
+	}.Build()
+	File_voltha_protos_inter_adapter_proto = out.File
+	file_voltha_protos_inter_adapter_proto_goTypes = nil
+	file_voltha_protos_inter_adapter_proto_depIdxs = nil
 }
