diff --git a/go/core/core.pb.go b/go/core/core.pb.go
index dab601d..a2d1c9e 100644
--- a/go/core/core.pb.go
+++ b/go/core/core.pb.go
@@ -1,24 +1,25 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.36.11
+// 	protoc        v4.25.8
 // source: voltha_protos/core.proto
 
 package core
 
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	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)
+)
 
 // Transient State for devices
 type DeviceTransientState_Types int32
@@ -43,101 +44,167 @@
 	DeviceTransientState_REBOOT_IN_PROGRESS DeviceTransientState_Types = 7
 )
 
-var DeviceTransientState_Types_name = map[int32]string{
-	0: "NONE",
-	1: "ANY",
-	2: "FORCE_DELETING",
-	3: "DELETING_FROM_ADAPTER",
-	4: "DELETING_POST_ADAPTER_RESPONSE",
-	5: "DELETE_FAILED",
-	6: "RECONCILE_IN_PROGRESS",
-	7: "REBOOT_IN_PROGRESS",
-}
+// Enum value maps for DeviceTransientState_Types.
+var (
+	DeviceTransientState_Types_name = map[int32]string{
+		0: "NONE",
+		1: "ANY",
+		2: "FORCE_DELETING",
+		3: "DELETING_FROM_ADAPTER",
+		4: "DELETING_POST_ADAPTER_RESPONSE",
+		5: "DELETE_FAILED",
+		6: "RECONCILE_IN_PROGRESS",
+		7: "REBOOT_IN_PROGRESS",
+	}
+	DeviceTransientState_Types_value = map[string]int32{
+		"NONE":                           0,
+		"ANY":                            1,
+		"FORCE_DELETING":                 2,
+		"DELETING_FROM_ADAPTER":          3,
+		"DELETING_POST_ADAPTER_RESPONSE": 4,
+		"DELETE_FAILED":                  5,
+		"RECONCILE_IN_PROGRESS":          6,
+		"REBOOT_IN_PROGRESS":             7,
+	}
+)
 
-var DeviceTransientState_Types_value = map[string]int32{
-	"NONE":                           0,
-	"ANY":                            1,
-	"FORCE_DELETING":                 2,
-	"DELETING_FROM_ADAPTER":          3,
-	"DELETING_POST_ADAPTER_RESPONSE": 4,
-	"DELETE_FAILED":                  5,
-	"RECONCILE_IN_PROGRESS":          6,
-	"REBOOT_IN_PROGRESS":             7,
+func (x DeviceTransientState_Types) Enum() *DeviceTransientState_Types {
+	p := new(DeviceTransientState_Types)
+	*p = x
+	return p
 }
 
 func (x DeviceTransientState_Types) String() string {
-	return proto.EnumName(DeviceTransientState_Types_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
+func (DeviceTransientState_Types) Descriptor() protoreflect.EnumDescriptor {
+	return file_voltha_protos_core_proto_enumTypes[0].Descriptor()
+}
+
+func (DeviceTransientState_Types) Type() protoreflect.EnumType {
+	return &file_voltha_protos_core_proto_enumTypes[0]
+}
+
+func (x DeviceTransientState_Types) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DeviceTransientState_Types.Descriptor instead.
 func (DeviceTransientState_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_39634f15fb8a505e, []int{0, 0}
+	return file_voltha_protos_core_proto_rawDescGZIP(), []int{0, 0}
 }
 
 type DeviceTransientState struct {
-	TransientState       DeviceTransientState_Types `protobuf:"varint,1,opt,name=transient_state,json=transientState,proto3,enum=core.DeviceTransientState_Types" json:"transient_state,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
-	XXX_unrecognized     []byte                     `json:"-"`
-	XXX_sizecache        int32                      `json:"-"`
+	state          protoimpl.MessageState     `protogen:"open.v1"`
+	TransientState DeviceTransientState_Types `protobuf:"varint,1,opt,name=transient_state,json=transientState,proto3,enum=core.DeviceTransientState_Types" json:"transient_state,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *DeviceTransientState) Reset()         { *m = DeviceTransientState{} }
-func (m *DeviceTransientState) String() string { return proto.CompactTextString(m) }
-func (*DeviceTransientState) ProtoMessage()    {}
+func (x *DeviceTransientState) Reset() {
+	*x = DeviceTransientState{}
+	mi := &file_voltha_protos_core_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeviceTransientState) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeviceTransientState) ProtoMessage() {}
+
+func (x *DeviceTransientState) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_core_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 DeviceTransientState.ProtoReflect.Descriptor instead.
 func (*DeviceTransientState) Descriptor() ([]byte, []int) {
-	return fileDescriptor_39634f15fb8a505e, []int{0}
+	return file_voltha_protos_core_proto_rawDescGZIP(), []int{0}
 }
 
-func (m *DeviceTransientState) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeviceTransientState.Unmarshal(m, b)
-}
-func (m *DeviceTransientState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeviceTransientState.Marshal(b, m, deterministic)
-}
-func (m *DeviceTransientState) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeviceTransientState.Merge(m, src)
-}
-func (m *DeviceTransientState) XXX_Size() int {
-	return xxx_messageInfo_DeviceTransientState.Size(m)
-}
-func (m *DeviceTransientState) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeviceTransientState.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DeviceTransientState proto.InternalMessageInfo
-
-func (m *DeviceTransientState) GetTransientState() DeviceTransientState_Types {
-	if m != nil {
-		return m.TransientState
+func (x *DeviceTransientState) GetTransientState() DeviceTransientState_Types {
+	if x != nil {
+		return x.TransientState
 	}
 	return DeviceTransientState_NONE
 }
 
-func init() {
-	proto.RegisterEnum("core.DeviceTransientState_Types", DeviceTransientState_Types_name, DeviceTransientState_Types_value)
-	proto.RegisterType((*DeviceTransientState)(nil), "core.DeviceTransientState")
+var File_voltha_protos_core_proto protoreflect.FileDescriptor
+
+const file_voltha_protos_core_proto_rawDesc = "" +
+	"\n" +
+	"\x18voltha_protos/core.proto\x12\x04core\"\x97\x02\n" +
+	"\x14DeviceTransientState\x12I\n" +
+	"\x0ftransient_state\x18\x01 \x01(\x0e2 .core.DeviceTransientState.TypesR\x0etransientState\"\xb3\x01\n" +
+	"\x05Types\x12\b\n" +
+	"\x04NONE\x10\x00\x12\a\n" +
+	"\x03ANY\x10\x01\x12\x12\n" +
+	"\x0eFORCE_DELETING\x10\x02\x12\x19\n" +
+	"\x15DELETING_FROM_ADAPTER\x10\x03\x12\"\n" +
+	"\x1eDELETING_POST_ADAPTER_RESPONSE\x10\x04\x12\x11\n" +
+	"\rDELETE_FAILED\x10\x05\x12\x19\n" +
+	"\x15RECONCILE_IN_PROGRESS\x10\x06\x12\x16\n" +
+	"\x12REBOOT_IN_PROGRESS\x10\aBH\n" +
+	"\x18org.opencord.voltha.coreZ,github.com/opencord/voltha-protos/v5/go/coreb\x06proto3"
+
+var (
+	file_voltha_protos_core_proto_rawDescOnce sync.Once
+	file_voltha_protos_core_proto_rawDescData []byte
+)
+
+func file_voltha_protos_core_proto_rawDescGZIP() []byte {
+	file_voltha_protos_core_proto_rawDescOnce.Do(func() {
+		file_voltha_protos_core_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_core_proto_rawDesc), len(file_voltha_protos_core_proto_rawDesc)))
+	})
+	return file_voltha_protos_core_proto_rawDescData
 }
 
-func init() { proto.RegisterFile("voltha_protos/core.proto", fileDescriptor_39634f15fb8a505e) }
+var file_voltha_protos_core_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_voltha_protos_core_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_voltha_protos_core_proto_goTypes = []any{
+	(DeviceTransientState_Types)(0), // 0: core.DeviceTransientState.Types
+	(*DeviceTransientState)(nil),    // 1: core.DeviceTransientState
+}
+var file_voltha_protos_core_proto_depIdxs = []int32{
+	0, // 0: core.DeviceTransientState.transient_state:type_name -> core.DeviceTransientState.Types
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
 
-var fileDescriptor_39634f15fb8a505e = []byte{
-	// 299 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xcf, 0x4a, 0x33, 0x31,
-	0x14, 0xc5, 0xbf, 0xe9, 0xdf, 0x8f, 0x0b, 0xd6, 0x18, 0x54, 0xea, 0x46, 0x4a, 0x57, 0x2e, 0x74,
-	0x06, 0x14, 0x1f, 0x60, 0xda, 0xb9, 0xad, 0x03, 0x35, 0x19, 0x92, 0x6c, 0x74, 0x13, 0xda, 0x31,
-	0xb4, 0x05, 0x6d, 0xca, 0x4c, 0x2c, 0xf8, 0x24, 0x3e, 0x88, 0x2f, 0x28, 0x93, 0x3a, 0x42, 0xc1,
-	0xdd, 0xc9, 0xef, 0x9c, 0x1c, 0xb8, 0x07, 0xfa, 0x3b, 0xfb, 0xea, 0x56, 0x73, 0xbd, 0x2d, 0xac,
-	0xb3, 0x65, 0x94, 0xdb, 0xc2, 0x84, 0x5e, 0xd3, 0x56, 0xa5, 0x87, 0x9f, 0x0d, 0x38, 0x4d, 0xcc,
-	0x6e, 0x9d, 0x1b, 0x55, 0xcc, 0x37, 0xe5, 0xda, 0x6c, 0x9c, 0x74, 0x73, 0x67, 0x68, 0x0a, 0xc7,
-	0xae, 0x26, 0xba, 0xac, 0x50, 0x3f, 0x18, 0x04, 0x57, 0xbd, 0xdb, 0x41, 0xe8, 0x4b, 0xfe, 0xfa,
-	0x14, 0xaa, 0x8f, 0xad, 0x29, 0x45, 0xcf, 0x1d, 0xd0, 0xe1, 0x57, 0x00, 0x6d, 0xef, 0xd0, 0xff,
-	0xd0, 0x62, 0x9c, 0x21, 0xf9, 0x47, 0xbb, 0xd0, 0x8c, 0xd9, 0x13, 0x09, 0x28, 0x85, 0xde, 0x84,
-	0x8b, 0x31, 0xea, 0x04, 0x67, 0xa8, 0x52, 0x36, 0x25, 0x0d, 0x7a, 0x01, 0x67, 0xf5, 0x4b, 0x4f,
-	0x04, 0x7f, 0xd4, 0x71, 0x12, 0x67, 0x0a, 0x05, 0x69, 0xd2, 0x21, 0x5c, 0xfe, 0x5a, 0x19, 0x97,
-	0xaa, 0xb6, 0xb4, 0x40, 0x99, 0x71, 0x26, 0x91, 0xb4, 0xe8, 0x09, 0x1c, 0xf9, 0x0c, 0xea, 0x49,
-	0x9c, 0xce, 0x30, 0x21, 0xed, 0xaa, 0x51, 0xe0, 0x98, 0xb3, 0x71, 0x3a, 0x43, 0x9d, 0x32, 0x9d,
-	0x09, 0x3e, 0x15, 0x28, 0x25, 0xe9, 0xd0, 0x73, 0xa0, 0x02, 0x47, 0x9c, 0xab, 0x03, 0xde, 0x1d,
-	0x3d, 0x40, 0xdf, 0x16, 0xcb, 0xd0, 0x6e, 0xcd, 0x26, 0xb7, 0xc5, 0x4b, 0xb8, 0x1f, 0xd2, 0x1f,
-	0xff, 0x7c, 0xbd, 0x5c, 0xbb, 0xd5, 0xfb, 0x22, 0xcc, 0xed, 0x5b, 0x54, 0x07, 0xa2, 0x7d, 0xe0,
-	0xe6, 0x67, 0xe9, 0xdd, 0x7d, 0xb4, 0xb4, 0x7e, 0xef, 0x45, 0xc7, 0xa3, 0xbb, 0xef, 0x00, 0x00,
-	0x00, 0xff, 0xff, 0xfc, 0xd7, 0xdf, 0xa2, 0x8c, 0x01, 0x00, 0x00,
+func init() { file_voltha_protos_core_proto_init() }
+func file_voltha_protos_core_proto_init() {
+	if File_voltha_protos_core_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: unsafe.Slice(unsafe.StringData(file_voltha_protos_core_proto_rawDesc), len(file_voltha_protos_core_proto_rawDesc)),
+			NumEnums:      1,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_voltha_protos_core_proto_goTypes,
+		DependencyIndexes: file_voltha_protos_core_proto_depIdxs,
+		EnumInfos:         file_voltha_protos_core_proto_enumTypes,
+		MessageInfos:      file_voltha_protos_core_proto_msgTypes,
+	}.Build()
+	File_voltha_protos_core_proto = out.File
+	file_voltha_protos_core_proto_goTypes = nil
+	file_voltha_protos_core_proto_depIdxs = nil
 }
