diff --git a/go/voip_system_profile/voip_system_profile.pb.go b/go/voip_system_profile/voip_system_profile.pb.go
index b0aeb8e..5ddcfda 100644
--- a/go/voip_system_profile/voip_system_profile.pb.go
+++ b/go/voip_system_profile/voip_system_profile.pb.go
@@ -1,69 +1,89 @@
+// Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
+//
+// 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.
+
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.36.11
+// 	protoc        v4.25.8
 // source: voltha_protos/voip_system_profile.proto
 
 package voip_system_profile
 
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
 	_ "google.golang.org/genproto/googleapis/api/annotations"
-	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 VoipSystemProfileRequest struct {
-	Key                  string             `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
-	VoipSystemProfile    *VoipSystemProfile `protobuf:"bytes,2,opt,name=voipSystemProfile,proto3" json:"voipSystemProfile,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
+	state             protoimpl.MessageState `protogen:"open.v1"`
+	Key               string                 `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	VoipSystemProfile *VoipSystemProfile     `protobuf:"bytes,2,opt,name=voipSystemProfile,proto3" json:"voipSystemProfile,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
 }
 
-func (m *VoipSystemProfileRequest) Reset()         { *m = VoipSystemProfileRequest{} }
-func (m *VoipSystemProfileRequest) String() string { return proto.CompactTextString(m) }
-func (*VoipSystemProfileRequest) ProtoMessage()    {}
+func (x *VoipSystemProfileRequest) Reset() {
+	*x = VoipSystemProfileRequest{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipSystemProfileRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipSystemProfileRequest) ProtoMessage() {}
+
+func (x *VoipSystemProfileRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 VoipSystemProfileRequest.ProtoReflect.Descriptor instead.
 func (*VoipSystemProfileRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{0}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{0}
 }
 
-func (m *VoipSystemProfileRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipSystemProfileRequest.Unmarshal(m, b)
-}
-func (m *VoipSystemProfileRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipSystemProfileRequest.Marshal(b, m, deterministic)
-}
-func (m *VoipSystemProfileRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipSystemProfileRequest.Merge(m, src)
-}
-func (m *VoipSystemProfileRequest) XXX_Size() int {
-	return xxx_messageInfo_VoipSystemProfileRequest.Size(m)
-}
-func (m *VoipSystemProfileRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipSystemProfileRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipSystemProfileRequest proto.InternalMessageInfo
-
-func (m *VoipSystemProfileRequest) GetKey() string {
-	if m != nil {
-		return m.Key
+func (x *VoipSystemProfileRequest) GetKey() string {
+	if x != nil {
+		return x.Key
 	}
 	return ""
 }
 
-func (m *VoipSystemProfileRequest) GetVoipSystemProfile() *VoipSystemProfile {
-	if m != nil {
-		return m.VoipSystemProfile
+func (x *VoipSystemProfileRequest) GetVoipSystemProfile() *VoipSystemProfile {
+	if x != nil {
+		return x.VoipSystemProfile
 	}
 	return nil
 }
@@ -71,1624 +91,1799 @@
 // A system wide profile for voip service that can be stored into voltha KV anytime.
 // Designed based on G988-2017 (also designed flexible to be able to be modified later on)
 type VoipSystemProfile struct {
-	SipConfig            *SipConfig  `protobuf:"bytes,1,opt,name=sipConfig,proto3" json:"sipConfig,omitempty"`
-	VoipConfig           *VoipConfig `protobuf:"bytes,2,opt,name=voipConfig,proto3" json:"voipConfig,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
-	XXX_unrecognized     []byte      `json:"-"`
-	XXX_sizecache        int32       `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	SipConfig     *SipConfig             `protobuf:"bytes,1,opt,name=sipConfig,proto3" json:"sipConfig,omitempty"`
+	VoipConfig    *VoipConfig            `protobuf:"bytes,2,opt,name=voipConfig,proto3" json:"voipConfig,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *VoipSystemProfile) Reset()         { *m = VoipSystemProfile{} }
-func (m *VoipSystemProfile) String() string { return proto.CompactTextString(m) }
-func (*VoipSystemProfile) ProtoMessage()    {}
+func (x *VoipSystemProfile) Reset() {
+	*x = VoipSystemProfile{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipSystemProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipSystemProfile) ProtoMessage() {}
+
+func (x *VoipSystemProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 VoipSystemProfile.ProtoReflect.Descriptor instead.
 func (*VoipSystemProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{1}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{1}
 }
 
-func (m *VoipSystemProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipSystemProfile.Unmarshal(m, b)
-}
-func (m *VoipSystemProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipSystemProfile.Marshal(b, m, deterministic)
-}
-func (m *VoipSystemProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipSystemProfile.Merge(m, src)
-}
-func (m *VoipSystemProfile) XXX_Size() int {
-	return xxx_messageInfo_VoipSystemProfile.Size(m)
-}
-func (m *VoipSystemProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipSystemProfile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipSystemProfile proto.InternalMessageInfo
-
-func (m *VoipSystemProfile) GetSipConfig() *SipConfig {
-	if m != nil {
-		return m.SipConfig
+func (x *VoipSystemProfile) GetSipConfig() *SipConfig {
+	if x != nil {
+		return x.SipConfig
 	}
 	return nil
 }
 
-func (m *VoipSystemProfile) GetVoipConfig() *VoipConfig {
-	if m != nil {
-		return m.VoipConfig
+func (x *VoipSystemProfile) GetVoipConfig() *VoipConfig {
+	if x != nil {
+		return x.VoipConfig
 	}
 	return nil
 }
 
 // Common voip fields are grouped here
 type VoipConfig struct {
-	IpHostConfig         *IpHostConfig        `protobuf:"bytes,1,opt,name=ipHostConfig,proto3" json:"ipHostConfig,omitempty"`
-	TcpUdpConfig         *TcpUdpConfig        `protobuf:"bytes,2,opt,name=tcpUdpConfig,proto3" json:"tcpUdpConfig,omitempty"`
-	VoipVoiceCtp         *VoipVoiceCtp        `protobuf:"bytes,3,opt,name=voipVoiceCtp,proto3" json:"voipVoiceCtp,omitempty"`
-	VoipMediaProfile     *VoipMediaProfile    `protobuf:"bytes,4,opt,name=voipMediaProfile,proto3" json:"voipMediaProfile,omitempty"`
-	VoiceServiceProfile  *VoiceServiceProfile `protobuf:"bytes,5,opt,name=voiceServiceProfile,proto3" json:"voiceServiceProfile,omitempty"`
-	RtpProfile           *RtpProfile          `protobuf:"bytes,6,opt,name=rtpProfile,proto3" json:"rtpProfile,omitempty"`
-	PptpPotsUni          *PptpPotsUni         `protobuf:"bytes,7,opt,name=pptpPotsUni,proto3" json:"pptpPotsUni,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	IpHostConfig        *IpHostConfig          `protobuf:"bytes,1,opt,name=ipHostConfig,proto3" json:"ipHostConfig,omitempty"`
+	TcpUdpConfig        *TcpUdpConfig          `protobuf:"bytes,2,opt,name=tcpUdpConfig,proto3" json:"tcpUdpConfig,omitempty"`
+	VoipVoiceCtp        *VoipVoiceCtp          `protobuf:"bytes,3,opt,name=voipVoiceCtp,proto3" json:"voipVoiceCtp,omitempty"`
+	VoipMediaProfile    *VoipMediaProfile      `protobuf:"bytes,4,opt,name=voipMediaProfile,proto3" json:"voipMediaProfile,omitempty"`
+	VoiceServiceProfile *VoiceServiceProfile   `protobuf:"bytes,5,opt,name=voiceServiceProfile,proto3" json:"voiceServiceProfile,omitempty"`
+	RtpProfile          *RtpProfile            `protobuf:"bytes,6,opt,name=rtpProfile,proto3" json:"rtpProfile,omitempty"`
+	PptpPotsUni         *PptpPotsUni           `protobuf:"bytes,7,opt,name=pptpPotsUni,proto3" json:"pptpPotsUni,omitempty"`
+	unknownFields       protoimpl.UnknownFields
+	sizeCache           protoimpl.SizeCache
 }
 
-func (m *VoipConfig) Reset()         { *m = VoipConfig{} }
-func (m *VoipConfig) String() string { return proto.CompactTextString(m) }
-func (*VoipConfig) ProtoMessage()    {}
+func (x *VoipConfig) Reset() {
+	*x = VoipConfig{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipConfig) ProtoMessage() {}
+
+func (x *VoipConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 VoipConfig.ProtoReflect.Descriptor instead.
 func (*VoipConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{2}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{2}
 }
 
-func (m *VoipConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipConfig.Unmarshal(m, b)
-}
-func (m *VoipConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipConfig.Marshal(b, m, deterministic)
-}
-func (m *VoipConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipConfig.Merge(m, src)
-}
-func (m *VoipConfig) XXX_Size() int {
-	return xxx_messageInfo_VoipConfig.Size(m)
-}
-func (m *VoipConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipConfig proto.InternalMessageInfo
-
-func (m *VoipConfig) GetIpHostConfig() *IpHostConfig {
-	if m != nil {
-		return m.IpHostConfig
+func (x *VoipConfig) GetIpHostConfig() *IpHostConfig {
+	if x != nil {
+		return x.IpHostConfig
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetTcpUdpConfig() *TcpUdpConfig {
-	if m != nil {
-		return m.TcpUdpConfig
+func (x *VoipConfig) GetTcpUdpConfig() *TcpUdpConfig {
+	if x != nil {
+		return x.TcpUdpConfig
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetVoipVoiceCtp() *VoipVoiceCtp {
-	if m != nil {
-		return m.VoipVoiceCtp
+func (x *VoipConfig) GetVoipVoiceCtp() *VoipVoiceCtp {
+	if x != nil {
+		return x.VoipVoiceCtp
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetVoipMediaProfile() *VoipMediaProfile {
-	if m != nil {
-		return m.VoipMediaProfile
+func (x *VoipConfig) GetVoipMediaProfile() *VoipMediaProfile {
+	if x != nil {
+		return x.VoipMediaProfile
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetVoiceServiceProfile() *VoiceServiceProfile {
-	if m != nil {
-		return m.VoiceServiceProfile
+func (x *VoipConfig) GetVoiceServiceProfile() *VoiceServiceProfile {
+	if x != nil {
+		return x.VoiceServiceProfile
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetRtpProfile() *RtpProfile {
-	if m != nil {
-		return m.RtpProfile
+func (x *VoipConfig) GetRtpProfile() *RtpProfile {
+	if x != nil {
+		return x.RtpProfile
 	}
 	return nil
 }
 
-func (m *VoipConfig) GetPptpPotsUni() *PptpPotsUni {
-	if m != nil {
-		return m.PptpPotsUni
+func (x *VoipConfig) GetPptpPotsUni() *PptpPotsUni {
+	if x != nil {
+		return x.PptpPotsUni
 	}
 	return nil
 }
 
 type IpHostConfig struct {
-	IpOptions            uint32   `protobuf:"varint,1,opt,name=ipOptions,proto3" json:"ipOptions,omitempty"`
-	OnuIdentifier        string   `protobuf:"bytes,2,opt,name=onuIdentifier,proto3" json:"onuIdentifier,omitempty"`
-	IpAddress            string   `protobuf:"bytes,3,opt,name=ipAddress,proto3" json:"ipAddress,omitempty"`
-	Mask                 string   `protobuf:"bytes,4,opt,name=mask,proto3" json:"mask,omitempty"`
-	Gateway              string   `protobuf:"bytes,5,opt,name=gateway,proto3" json:"gateway,omitempty"`
-	PrimaryDns           string   `protobuf:"bytes,6,opt,name=primaryDns,proto3" json:"primaryDns,omitempty"`
-	SecondaryDns         string   `protobuf:"bytes,7,opt,name=secondaryDns,proto3" json:"secondaryDns,omitempty"`
-	RelayAgentOptions    string   `protobuf:"bytes,8,opt,name=relayAgentOptions,proto3" json:"relayAgentOptions,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state             protoimpl.MessageState `protogen:"open.v1"`
+	IpOptions         uint32                 `protobuf:"varint,1,opt,name=ipOptions,proto3" json:"ipOptions,omitempty"`
+	OnuIdentifier     string                 `protobuf:"bytes,2,opt,name=onuIdentifier,proto3" json:"onuIdentifier,omitempty"`
+	IpAddress         string                 `protobuf:"bytes,3,opt,name=ipAddress,proto3" json:"ipAddress,omitempty"`
+	Mask              string                 `protobuf:"bytes,4,opt,name=mask,proto3" json:"mask,omitempty"`
+	Gateway           string                 `protobuf:"bytes,5,opt,name=gateway,proto3" json:"gateway,omitempty"`
+	PrimaryDns        string                 `protobuf:"bytes,6,opt,name=primaryDns,proto3" json:"primaryDns,omitempty"`
+	SecondaryDns      string                 `protobuf:"bytes,7,opt,name=secondaryDns,proto3" json:"secondaryDns,omitempty"`
+	RelayAgentOptions string                 `protobuf:"bytes,8,opt,name=relayAgentOptions,proto3" json:"relayAgentOptions,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
 }
 
-func (m *IpHostConfig) Reset()         { *m = IpHostConfig{} }
-func (m *IpHostConfig) String() string { return proto.CompactTextString(m) }
-func (*IpHostConfig) ProtoMessage()    {}
+func (x *IpHostConfig) Reset() {
+	*x = IpHostConfig{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *IpHostConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IpHostConfig) ProtoMessage() {}
+
+func (x *IpHostConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 IpHostConfig.ProtoReflect.Descriptor instead.
 func (*IpHostConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{3}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{3}
 }
 
-func (m *IpHostConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IpHostConfig.Unmarshal(m, b)
-}
-func (m *IpHostConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IpHostConfig.Marshal(b, m, deterministic)
-}
-func (m *IpHostConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IpHostConfig.Merge(m, src)
-}
-func (m *IpHostConfig) XXX_Size() int {
-	return xxx_messageInfo_IpHostConfig.Size(m)
-}
-func (m *IpHostConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_IpHostConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_IpHostConfig proto.InternalMessageInfo
-
-func (m *IpHostConfig) GetIpOptions() uint32 {
-	if m != nil {
-		return m.IpOptions
+func (x *IpHostConfig) GetIpOptions() uint32 {
+	if x != nil {
+		return x.IpOptions
 	}
 	return 0
 }
 
-func (m *IpHostConfig) GetOnuIdentifier() string {
-	if m != nil {
-		return m.OnuIdentifier
+func (x *IpHostConfig) GetOnuIdentifier() string {
+	if x != nil {
+		return x.OnuIdentifier
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetIpAddress() string {
-	if m != nil {
-		return m.IpAddress
+func (x *IpHostConfig) GetIpAddress() string {
+	if x != nil {
+		return x.IpAddress
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetMask() string {
-	if m != nil {
-		return m.Mask
+func (x *IpHostConfig) GetMask() string {
+	if x != nil {
+		return x.Mask
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetGateway() string {
-	if m != nil {
-		return m.Gateway
+func (x *IpHostConfig) GetGateway() string {
+	if x != nil {
+		return x.Gateway
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetPrimaryDns() string {
-	if m != nil {
-		return m.PrimaryDns
+func (x *IpHostConfig) GetPrimaryDns() string {
+	if x != nil {
+		return x.PrimaryDns
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetSecondaryDns() string {
-	if m != nil {
-		return m.SecondaryDns
+func (x *IpHostConfig) GetSecondaryDns() string {
+	if x != nil {
+		return x.SecondaryDns
 	}
 	return ""
 }
 
-func (m *IpHostConfig) GetRelayAgentOptions() string {
-	if m != nil {
-		return m.RelayAgentOptions
+func (x *IpHostConfig) GetRelayAgentOptions() string {
+	if x != nil {
+		return x.RelayAgentOptions
 	}
 	return ""
 }
 
 type TcpUdpConfig struct {
-	Protocol             uint32   `protobuf:"varint,1,opt,name=protocol,proto3" json:"protocol,omitempty"`
-	TosField             string   `protobuf:"bytes,2,opt,name=tosField,proto3" json:"tosField,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Protocol      uint32                 `protobuf:"varint,1,opt,name=protocol,proto3" json:"protocol,omitempty"`
+	TosField      string                 `protobuf:"bytes,2,opt,name=tosField,proto3" json:"tosField,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
 }
 
-func (m *TcpUdpConfig) Reset()         { *m = TcpUdpConfig{} }
-func (m *TcpUdpConfig) String() string { return proto.CompactTextString(m) }
-func (*TcpUdpConfig) ProtoMessage()    {}
+func (x *TcpUdpConfig) Reset() {
+	*x = TcpUdpConfig{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *TcpUdpConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TcpUdpConfig) ProtoMessage() {}
+
+func (x *TcpUdpConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 TcpUdpConfig.ProtoReflect.Descriptor instead.
 func (*TcpUdpConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{4}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{4}
 }
 
-func (m *TcpUdpConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TcpUdpConfig.Unmarshal(m, b)
-}
-func (m *TcpUdpConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TcpUdpConfig.Marshal(b, m, deterministic)
-}
-func (m *TcpUdpConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TcpUdpConfig.Merge(m, src)
-}
-func (m *TcpUdpConfig) XXX_Size() int {
-	return xxx_messageInfo_TcpUdpConfig.Size(m)
-}
-func (m *TcpUdpConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_TcpUdpConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_TcpUdpConfig proto.InternalMessageInfo
-
-func (m *TcpUdpConfig) GetProtocol() uint32 {
-	if m != nil {
-		return m.Protocol
+func (x *TcpUdpConfig) GetProtocol() uint32 {
+	if x != nil {
+		return x.Protocol
 	}
 	return 0
 }
 
-func (m *TcpUdpConfig) GetTosField() string {
-	if m != nil {
-		return m.TosField
+func (x *TcpUdpConfig) GetTosField() string {
+	if x != nil {
+		return x.TosField
 	}
 	return ""
 }
 
 type VoipVoiceCtp struct {
-	SignallingCode       uint32   `protobuf:"varint,1,opt,name=signallingCode,proto3" json:"signallingCode,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	SignallingCode uint32                 `protobuf:"varint,1,opt,name=signallingCode,proto3" json:"signallingCode,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
 }
 
-func (m *VoipVoiceCtp) Reset()         { *m = VoipVoiceCtp{} }
-func (m *VoipVoiceCtp) String() string { return proto.CompactTextString(m) }
-func (*VoipVoiceCtp) ProtoMessage()    {}
+func (x *VoipVoiceCtp) Reset() {
+	*x = VoipVoiceCtp{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipVoiceCtp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipVoiceCtp) ProtoMessage() {}
+
+func (x *VoipVoiceCtp) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 VoipVoiceCtp.ProtoReflect.Descriptor instead.
 func (*VoipVoiceCtp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{5}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{5}
 }
 
-func (m *VoipVoiceCtp) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipVoiceCtp.Unmarshal(m, b)
-}
-func (m *VoipVoiceCtp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipVoiceCtp.Marshal(b, m, deterministic)
-}
-func (m *VoipVoiceCtp) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipVoiceCtp.Merge(m, src)
-}
-func (m *VoipVoiceCtp) XXX_Size() int {
-	return xxx_messageInfo_VoipVoiceCtp.Size(m)
-}
-func (m *VoipVoiceCtp) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipVoiceCtp.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipVoiceCtp proto.InternalMessageInfo
-
-func (m *VoipVoiceCtp) GetSignallingCode() uint32 {
-	if m != nil {
-		return m.SignallingCode
+func (x *VoipVoiceCtp) GetSignallingCode() uint32 {
+	if x != nil {
+		return x.SignallingCode
 	}
 	return 0
 }
 
 type VoipMediaProfile struct {
-	FaxMode                uint32   `protobuf:"varint,1,opt,name=faxMode,proto3" json:"faxMode,omitempty"`
-	CodecSelection1        uint32   `protobuf:"varint,2,opt,name=codecSelection1,proto3" json:"codecSelection1,omitempty"`
-	PacketPeriodSelection1 uint32   `protobuf:"varint,3,opt,name=packetPeriodSelection1,proto3" json:"packetPeriodSelection1,omitempty"`
-	SilenceSuppression1    uint32   `protobuf:"varint,4,opt,name=silenceSuppression1,proto3" json:"silenceSuppression1,omitempty"`
-	CodecSelection2        uint32   `protobuf:"varint,5,opt,name=codecSelection2,proto3" json:"codecSelection2,omitempty"`
-	PacketPeriodSelection2 uint32   `protobuf:"varint,6,opt,name=packetPeriodSelection2,proto3" json:"packetPeriodSelection2,omitempty"`
-	SilenceSuppression2    uint32   `protobuf:"varint,7,opt,name=silenceSuppression2,proto3" json:"silenceSuppression2,omitempty"`
-	CodecSelection3        uint32   `protobuf:"varint,8,opt,name=codecSelection3,proto3" json:"codecSelection3,omitempty"`
-	PacketPeriodSelection3 uint32   `protobuf:"varint,9,opt,name=packetPeriodSelection3,proto3" json:"packetPeriodSelection3,omitempty"`
-	SilenceSuppression3    uint32   `protobuf:"varint,10,opt,name=silenceSuppression3,proto3" json:"silenceSuppression3,omitempty"`
-	CodecSelection4        uint32   `protobuf:"varint,11,opt,name=codecSelection4,proto3" json:"codecSelection4,omitempty"`
-	PacketPeriodSelection4 uint32   `protobuf:"varint,12,opt,name=packetPeriodSelection4,proto3" json:"packetPeriodSelection4,omitempty"`
-	SilenceSuppression4    uint32   `protobuf:"varint,13,opt,name=silenceSuppression4,proto3" json:"silenceSuppression4,omitempty"`
-	OobDtmf                uint32   `protobuf:"varint,14,opt,name=oobDtmf,proto3" json:"oobDtmf,omitempty"`
-	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
-	XXX_unrecognized       []byte   `json:"-"`
-	XXX_sizecache          int32    `json:"-"`
+	state                  protoimpl.MessageState `protogen:"open.v1"`
+	FaxMode                uint32                 `protobuf:"varint,1,opt,name=faxMode,proto3" json:"faxMode,omitempty"`
+	CodecSelection1        uint32                 `protobuf:"varint,2,opt,name=codecSelection1,proto3" json:"codecSelection1,omitempty"`
+	PacketPeriodSelection1 uint32                 `protobuf:"varint,3,opt,name=packetPeriodSelection1,proto3" json:"packetPeriodSelection1,omitempty"`
+	SilenceSuppression1    uint32                 `protobuf:"varint,4,opt,name=silenceSuppression1,proto3" json:"silenceSuppression1,omitempty"`
+	CodecSelection2        uint32                 `protobuf:"varint,5,opt,name=codecSelection2,proto3" json:"codecSelection2,omitempty"`
+	PacketPeriodSelection2 uint32                 `protobuf:"varint,6,opt,name=packetPeriodSelection2,proto3" json:"packetPeriodSelection2,omitempty"`
+	SilenceSuppression2    uint32                 `protobuf:"varint,7,opt,name=silenceSuppression2,proto3" json:"silenceSuppression2,omitempty"`
+	CodecSelection3        uint32                 `protobuf:"varint,8,opt,name=codecSelection3,proto3" json:"codecSelection3,omitempty"`
+	PacketPeriodSelection3 uint32                 `protobuf:"varint,9,opt,name=packetPeriodSelection3,proto3" json:"packetPeriodSelection3,omitempty"`
+	SilenceSuppression3    uint32                 `protobuf:"varint,10,opt,name=silenceSuppression3,proto3" json:"silenceSuppression3,omitempty"`
+	CodecSelection4        uint32                 `protobuf:"varint,11,opt,name=codecSelection4,proto3" json:"codecSelection4,omitempty"`
+	PacketPeriodSelection4 uint32                 `protobuf:"varint,12,opt,name=packetPeriodSelection4,proto3" json:"packetPeriodSelection4,omitempty"`
+	SilenceSuppression4    uint32                 `protobuf:"varint,13,opt,name=silenceSuppression4,proto3" json:"silenceSuppression4,omitempty"`
+	OobDtmf                uint32                 `protobuf:"varint,14,opt,name=oobDtmf,proto3" json:"oobDtmf,omitempty"`
+	unknownFields          protoimpl.UnknownFields
+	sizeCache              protoimpl.SizeCache
 }
 
-func (m *VoipMediaProfile) Reset()         { *m = VoipMediaProfile{} }
-func (m *VoipMediaProfile) String() string { return proto.CompactTextString(m) }
-func (*VoipMediaProfile) ProtoMessage()    {}
+func (x *VoipMediaProfile) Reset() {
+	*x = VoipMediaProfile{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipMediaProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipMediaProfile) ProtoMessage() {}
+
+func (x *VoipMediaProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_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 VoipMediaProfile.ProtoReflect.Descriptor instead.
 func (*VoipMediaProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{6}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{6}
 }
 
-func (m *VoipMediaProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipMediaProfile.Unmarshal(m, b)
-}
-func (m *VoipMediaProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipMediaProfile.Marshal(b, m, deterministic)
-}
-func (m *VoipMediaProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipMediaProfile.Merge(m, src)
-}
-func (m *VoipMediaProfile) XXX_Size() int {
-	return xxx_messageInfo_VoipMediaProfile.Size(m)
-}
-func (m *VoipMediaProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipMediaProfile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipMediaProfile proto.InternalMessageInfo
-
-func (m *VoipMediaProfile) GetFaxMode() uint32 {
-	if m != nil {
-		return m.FaxMode
+func (x *VoipMediaProfile) GetFaxMode() uint32 {
+	if x != nil {
+		return x.FaxMode
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetCodecSelection1() uint32 {
-	if m != nil {
-		return m.CodecSelection1
+func (x *VoipMediaProfile) GetCodecSelection1() uint32 {
+	if x != nil {
+		return x.CodecSelection1
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetPacketPeriodSelection1() uint32 {
-	if m != nil {
-		return m.PacketPeriodSelection1
+func (x *VoipMediaProfile) GetPacketPeriodSelection1() uint32 {
+	if x != nil {
+		return x.PacketPeriodSelection1
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetSilenceSuppression1() uint32 {
-	if m != nil {
-		return m.SilenceSuppression1
+func (x *VoipMediaProfile) GetSilenceSuppression1() uint32 {
+	if x != nil {
+		return x.SilenceSuppression1
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetCodecSelection2() uint32 {
-	if m != nil {
-		return m.CodecSelection2
+func (x *VoipMediaProfile) GetCodecSelection2() uint32 {
+	if x != nil {
+		return x.CodecSelection2
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetPacketPeriodSelection2() uint32 {
-	if m != nil {
-		return m.PacketPeriodSelection2
+func (x *VoipMediaProfile) GetPacketPeriodSelection2() uint32 {
+	if x != nil {
+		return x.PacketPeriodSelection2
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetSilenceSuppression2() uint32 {
-	if m != nil {
-		return m.SilenceSuppression2
+func (x *VoipMediaProfile) GetSilenceSuppression2() uint32 {
+	if x != nil {
+		return x.SilenceSuppression2
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetCodecSelection3() uint32 {
-	if m != nil {
-		return m.CodecSelection3
+func (x *VoipMediaProfile) GetCodecSelection3() uint32 {
+	if x != nil {
+		return x.CodecSelection3
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetPacketPeriodSelection3() uint32 {
-	if m != nil {
-		return m.PacketPeriodSelection3
+func (x *VoipMediaProfile) GetPacketPeriodSelection3() uint32 {
+	if x != nil {
+		return x.PacketPeriodSelection3
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetSilenceSuppression3() uint32 {
-	if m != nil {
-		return m.SilenceSuppression3
+func (x *VoipMediaProfile) GetSilenceSuppression3() uint32 {
+	if x != nil {
+		return x.SilenceSuppression3
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetCodecSelection4() uint32 {
-	if m != nil {
-		return m.CodecSelection4
+func (x *VoipMediaProfile) GetCodecSelection4() uint32 {
+	if x != nil {
+		return x.CodecSelection4
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetPacketPeriodSelection4() uint32 {
-	if m != nil {
-		return m.PacketPeriodSelection4
+func (x *VoipMediaProfile) GetPacketPeriodSelection4() uint32 {
+	if x != nil {
+		return x.PacketPeriodSelection4
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetSilenceSuppression4() uint32 {
-	if m != nil {
-		return m.SilenceSuppression4
+func (x *VoipMediaProfile) GetSilenceSuppression4() uint32 {
+	if x != nil {
+		return x.SilenceSuppression4
 	}
 	return 0
 }
 
-func (m *VoipMediaProfile) GetOobDtmf() uint32 {
-	if m != nil {
-		return m.OobDtmf
+func (x *VoipMediaProfile) GetOobDtmf() uint32 {
+	if x != nil {
+		return x.OobDtmf
 	}
 	return 0
 }
 
 type VoiceServiceProfile struct {
-	AnnouncementType     uint32   `protobuf:"varint,1,opt,name=announcementType,proto3" json:"announcementType,omitempty"`
-	JitterTarget         uint32   `protobuf:"varint,2,opt,name=jitterTarget,proto3" json:"jitterTarget,omitempty"`
-	JitterBufferMax      uint32   `protobuf:"varint,3,opt,name=jitterBufferMax,proto3" json:"jitterBufferMax,omitempty"`
-	EchoCancelInd        bool     `protobuf:"varint,4,opt,name=echoCancelInd,proto3" json:"echoCancelInd,omitempty"`
-	PstnProtocolVariant  uint32   `protobuf:"varint,5,opt,name=pstnProtocolVariant,proto3" json:"pstnProtocolVariant,omitempty"`
-	DtmfDigitLevels      uint32   `protobuf:"varint,6,opt,name=dtmfDigitLevels,proto3" json:"dtmfDigitLevels,omitempty"`
-	DtmfDigitDuration    uint32   `protobuf:"varint,7,opt,name=dtmfDigitDuration,proto3" json:"dtmfDigitDuration,omitempty"`
-	HookFlashMinimumTime uint32   `protobuf:"varint,8,opt,name=hookFlashMinimumTime,proto3" json:"hookFlashMinimumTime,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state                protoimpl.MessageState `protogen:"open.v1"`
+	AnnouncementType     uint32                 `protobuf:"varint,1,opt,name=announcementType,proto3" json:"announcementType,omitempty"`
+	JitterTarget         uint32                 `protobuf:"varint,2,opt,name=jitterTarget,proto3" json:"jitterTarget,omitempty"`
+	JitterBufferMax      uint32                 `protobuf:"varint,3,opt,name=jitterBufferMax,proto3" json:"jitterBufferMax,omitempty"`
+	EchoCancelInd        bool                   `protobuf:"varint,4,opt,name=echoCancelInd,proto3" json:"echoCancelInd,omitempty"`
+	PstnProtocolVariant  uint32                 `protobuf:"varint,5,opt,name=pstnProtocolVariant,proto3" json:"pstnProtocolVariant,omitempty"`
+	DtmfDigitLevels      uint32                 `protobuf:"varint,6,opt,name=dtmfDigitLevels,proto3" json:"dtmfDigitLevels,omitempty"`
+	DtmfDigitDuration    uint32                 `protobuf:"varint,7,opt,name=dtmfDigitDuration,proto3" json:"dtmfDigitDuration,omitempty"`
+	HookFlashMinimumTime uint32                 `protobuf:"varint,8,opt,name=hookFlashMinimumTime,proto3" json:"hookFlashMinimumTime,omitempty"`
+	unknownFields        protoimpl.UnknownFields
+	sizeCache            protoimpl.SizeCache
 }
 
-func (m *VoiceServiceProfile) Reset()         { *m = VoiceServiceProfile{} }
-func (m *VoiceServiceProfile) String() string { return proto.CompactTextString(m) }
-func (*VoiceServiceProfile) ProtoMessage()    {}
+func (x *VoiceServiceProfile) Reset() {
+	*x = VoiceServiceProfile{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoiceServiceProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoiceServiceProfile) ProtoMessage() {}
+
+func (x *VoiceServiceProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[7]
+	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 VoiceServiceProfile.ProtoReflect.Descriptor instead.
 func (*VoiceServiceProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{7}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{7}
 }
 
-func (m *VoiceServiceProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoiceServiceProfile.Unmarshal(m, b)
-}
-func (m *VoiceServiceProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoiceServiceProfile.Marshal(b, m, deterministic)
-}
-func (m *VoiceServiceProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoiceServiceProfile.Merge(m, src)
-}
-func (m *VoiceServiceProfile) XXX_Size() int {
-	return xxx_messageInfo_VoiceServiceProfile.Size(m)
-}
-func (m *VoiceServiceProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoiceServiceProfile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoiceServiceProfile proto.InternalMessageInfo
-
-func (m *VoiceServiceProfile) GetAnnouncementType() uint32 {
-	if m != nil {
-		return m.AnnouncementType
+func (x *VoiceServiceProfile) GetAnnouncementType() uint32 {
+	if x != nil {
+		return x.AnnouncementType
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetJitterTarget() uint32 {
-	if m != nil {
-		return m.JitterTarget
+func (x *VoiceServiceProfile) GetJitterTarget() uint32 {
+	if x != nil {
+		return x.JitterTarget
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetJitterBufferMax() uint32 {
-	if m != nil {
-		return m.JitterBufferMax
+func (x *VoiceServiceProfile) GetJitterBufferMax() uint32 {
+	if x != nil {
+		return x.JitterBufferMax
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetEchoCancelInd() bool {
-	if m != nil {
-		return m.EchoCancelInd
+func (x *VoiceServiceProfile) GetEchoCancelInd() bool {
+	if x != nil {
+		return x.EchoCancelInd
 	}
 	return false
 }
 
-func (m *VoiceServiceProfile) GetPstnProtocolVariant() uint32 {
-	if m != nil {
-		return m.PstnProtocolVariant
+func (x *VoiceServiceProfile) GetPstnProtocolVariant() uint32 {
+	if x != nil {
+		return x.PstnProtocolVariant
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetDtmfDigitLevels() uint32 {
-	if m != nil {
-		return m.DtmfDigitLevels
+func (x *VoiceServiceProfile) GetDtmfDigitLevels() uint32 {
+	if x != nil {
+		return x.DtmfDigitLevels
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetDtmfDigitDuration() uint32 {
-	if m != nil {
-		return m.DtmfDigitDuration
+func (x *VoiceServiceProfile) GetDtmfDigitDuration() uint32 {
+	if x != nil {
+		return x.DtmfDigitDuration
 	}
 	return 0
 }
 
-func (m *VoiceServiceProfile) GetHookFlashMinimumTime() uint32 {
-	if m != nil {
-		return m.HookFlashMinimumTime
+func (x *VoiceServiceProfile) GetHookFlashMinimumTime() uint32 {
+	if x != nil {
+		return x.HookFlashMinimumTime
 	}
 	return 0
 }
 
 type RtpProfile struct {
-	LocalPortMin         uint32   `protobuf:"varint,1,opt,name=localPortMin,proto3" json:"localPortMin,omitempty"`
-	LocalPortMax         uint32   `protobuf:"varint,2,opt,name=localPortMax,proto3" json:"localPortMax,omitempty"`
-	DscpMark             string   `protobuf:"bytes,3,opt,name=dscpMark,proto3" json:"dscpMark,omitempty"`
-	PiggyBackEvents      uint32   `protobuf:"varint,4,opt,name=piggyBackEvents,proto3" json:"piggyBackEvents,omitempty"`
-	ToneEvents           uint32   `protobuf:"varint,5,opt,name=toneEvents,proto3" json:"toneEvents,omitempty"`
-	DtmfEvents           uint32   `protobuf:"varint,6,opt,name=dtmfEvents,proto3" json:"dtmfEvents,omitempty"`
-	CasEvents            uint32   `protobuf:"varint,7,opt,name=casEvents,proto3" json:"casEvents,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	LocalPortMin    uint32                 `protobuf:"varint,1,opt,name=localPortMin,proto3" json:"localPortMin,omitempty"`
+	LocalPortMax    uint32                 `protobuf:"varint,2,opt,name=localPortMax,proto3" json:"localPortMax,omitempty"`
+	DscpMark        string                 `protobuf:"bytes,3,opt,name=dscpMark,proto3" json:"dscpMark,omitempty"`
+	PiggyBackEvents uint32                 `protobuf:"varint,4,opt,name=piggyBackEvents,proto3" json:"piggyBackEvents,omitempty"`
+	ToneEvents      uint32                 `protobuf:"varint,5,opt,name=toneEvents,proto3" json:"toneEvents,omitempty"`
+	DtmfEvents      uint32                 `protobuf:"varint,6,opt,name=dtmfEvents,proto3" json:"dtmfEvents,omitempty"`
+	CasEvents       uint32                 `protobuf:"varint,7,opt,name=casEvents,proto3" json:"casEvents,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
 }
 
-func (m *RtpProfile) Reset()         { *m = RtpProfile{} }
-func (m *RtpProfile) String() string { return proto.CompactTextString(m) }
-func (*RtpProfile) ProtoMessage()    {}
+func (x *RtpProfile) Reset() {
+	*x = RtpProfile{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RtpProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RtpProfile) ProtoMessage() {}
+
+func (x *RtpProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[8]
+	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 RtpProfile.ProtoReflect.Descriptor instead.
 func (*RtpProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{8}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{8}
 }
 
-func (m *RtpProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RtpProfile.Unmarshal(m, b)
-}
-func (m *RtpProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RtpProfile.Marshal(b, m, deterministic)
-}
-func (m *RtpProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RtpProfile.Merge(m, src)
-}
-func (m *RtpProfile) XXX_Size() int {
-	return xxx_messageInfo_RtpProfile.Size(m)
-}
-func (m *RtpProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_RtpProfile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RtpProfile proto.InternalMessageInfo
-
-func (m *RtpProfile) GetLocalPortMin() uint32 {
-	if m != nil {
-		return m.LocalPortMin
+func (x *RtpProfile) GetLocalPortMin() uint32 {
+	if x != nil {
+		return x.LocalPortMin
 	}
 	return 0
 }
 
-func (m *RtpProfile) GetLocalPortMax() uint32 {
-	if m != nil {
-		return m.LocalPortMax
+func (x *RtpProfile) GetLocalPortMax() uint32 {
+	if x != nil {
+		return x.LocalPortMax
 	}
 	return 0
 }
 
-func (m *RtpProfile) GetDscpMark() string {
-	if m != nil {
-		return m.DscpMark
+func (x *RtpProfile) GetDscpMark() string {
+	if x != nil {
+		return x.DscpMark
 	}
 	return ""
 }
 
-func (m *RtpProfile) GetPiggyBackEvents() uint32 {
-	if m != nil {
-		return m.PiggyBackEvents
+func (x *RtpProfile) GetPiggyBackEvents() uint32 {
+	if x != nil {
+		return x.PiggyBackEvents
 	}
 	return 0
 }
 
-func (m *RtpProfile) GetToneEvents() uint32 {
-	if m != nil {
-		return m.ToneEvents
+func (x *RtpProfile) GetToneEvents() uint32 {
+	if x != nil {
+		return x.ToneEvents
 	}
 	return 0
 }
 
-func (m *RtpProfile) GetDtmfEvents() uint32 {
-	if m != nil {
-		return m.DtmfEvents
+func (x *RtpProfile) GetDtmfEvents() uint32 {
+	if x != nil {
+		return x.DtmfEvents
 	}
 	return 0
 }
 
-func (m *RtpProfile) GetCasEvents() uint32 {
-	if m != nil {
-		return m.CasEvents
+func (x *RtpProfile) GetCasEvents() uint32 {
+	if x != nil {
+		return x.CasEvents
 	}
 	return 0
 }
 
 type PptpPotsUni struct {
-	Arc                  string   `protobuf:"bytes,1,opt,name=arc,proto3" json:"arc,omitempty"`
-	ArcInterval          string   `protobuf:"bytes,2,opt,name=arcInterval,proto3" json:"arcInterval,omitempty"`
-	Impedance            uint32   `protobuf:"varint,3,opt,name=impedance,proto3" json:"impedance,omitempty"`
-	TransmissionPath     uint32   `protobuf:"varint,4,opt,name=transmissionPath,proto3" json:"transmissionPath,omitempty"`
-	RxGain               int32    `protobuf:"zigzag32,5,opt,name=rxGain,proto3" json:"rxGain,omitempty"`
-	TxGain               int32    `protobuf:"zigzag32,6,opt,name=txGain,proto3" json:"txGain,omitempty"`
-	PotsHoldOverTime     uint32   `protobuf:"varint,7,opt,name=potsHoldOverTime,proto3" json:"potsHoldOverTime,omitempty"`
-	NominalFeedVoltage   uint32   `protobuf:"varint,8,opt,name=nominalFeedVoltage,proto3" json:"nominalFeedVoltage,omitempty"`
-	LossOfSoftSwitch     uint32   `protobuf:"varint,9,opt,name=lossOfSoftSwitch,proto3" json:"lossOfSoftSwitch,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	Arc                string                 `protobuf:"bytes,1,opt,name=arc,proto3" json:"arc,omitempty"`
+	ArcInterval        string                 `protobuf:"bytes,2,opt,name=arcInterval,proto3" json:"arcInterval,omitempty"`
+	Impedance          uint32                 `protobuf:"varint,3,opt,name=impedance,proto3" json:"impedance,omitempty"`
+	TransmissionPath   uint32                 `protobuf:"varint,4,opt,name=transmissionPath,proto3" json:"transmissionPath,omitempty"`
+	RxGain             int32                  `protobuf:"zigzag32,5,opt,name=rxGain,proto3" json:"rxGain,omitempty"`
+	TxGain             int32                  `protobuf:"zigzag32,6,opt,name=txGain,proto3" json:"txGain,omitempty"`
+	PotsHoldOverTime   uint32                 `protobuf:"varint,7,opt,name=potsHoldOverTime,proto3" json:"potsHoldOverTime,omitempty"`
+	NominalFeedVoltage uint32                 `protobuf:"varint,8,opt,name=nominalFeedVoltage,proto3" json:"nominalFeedVoltage,omitempty"`
+	LossOfSoftSwitch   uint32                 `protobuf:"varint,9,opt,name=lossOfSoftSwitch,proto3" json:"lossOfSoftSwitch,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
 }
 
-func (m *PptpPotsUni) Reset()         { *m = PptpPotsUni{} }
-func (m *PptpPotsUni) String() string { return proto.CompactTextString(m) }
-func (*PptpPotsUni) ProtoMessage()    {}
+func (x *PptpPotsUni) Reset() {
+	*x = PptpPotsUni{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PptpPotsUni) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PptpPotsUni) ProtoMessage() {}
+
+func (x *PptpPotsUni) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[9]
+	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 PptpPotsUni.ProtoReflect.Descriptor instead.
 func (*PptpPotsUni) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{9}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{9}
 }
 
-func (m *PptpPotsUni) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PptpPotsUni.Unmarshal(m, b)
-}
-func (m *PptpPotsUni) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PptpPotsUni.Marshal(b, m, deterministic)
-}
-func (m *PptpPotsUni) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PptpPotsUni.Merge(m, src)
-}
-func (m *PptpPotsUni) XXX_Size() int {
-	return xxx_messageInfo_PptpPotsUni.Size(m)
-}
-func (m *PptpPotsUni) XXX_DiscardUnknown() {
-	xxx_messageInfo_PptpPotsUni.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PptpPotsUni proto.InternalMessageInfo
-
-func (m *PptpPotsUni) GetArc() string {
-	if m != nil {
-		return m.Arc
+func (x *PptpPotsUni) GetArc() string {
+	if x != nil {
+		return x.Arc
 	}
 	return ""
 }
 
-func (m *PptpPotsUni) GetArcInterval() string {
-	if m != nil {
-		return m.ArcInterval
+func (x *PptpPotsUni) GetArcInterval() string {
+	if x != nil {
+		return x.ArcInterval
 	}
 	return ""
 }
 
-func (m *PptpPotsUni) GetImpedance() uint32 {
-	if m != nil {
-		return m.Impedance
+func (x *PptpPotsUni) GetImpedance() uint32 {
+	if x != nil {
+		return x.Impedance
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetTransmissionPath() uint32 {
-	if m != nil {
-		return m.TransmissionPath
+func (x *PptpPotsUni) GetTransmissionPath() uint32 {
+	if x != nil {
+		return x.TransmissionPath
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetRxGain() int32 {
-	if m != nil {
-		return m.RxGain
+func (x *PptpPotsUni) GetRxGain() int32 {
+	if x != nil {
+		return x.RxGain
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetTxGain() int32 {
-	if m != nil {
-		return m.TxGain
+func (x *PptpPotsUni) GetTxGain() int32 {
+	if x != nil {
+		return x.TxGain
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetPotsHoldOverTime() uint32 {
-	if m != nil {
-		return m.PotsHoldOverTime
+func (x *PptpPotsUni) GetPotsHoldOverTime() uint32 {
+	if x != nil {
+		return x.PotsHoldOverTime
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetNominalFeedVoltage() uint32 {
-	if m != nil {
-		return m.NominalFeedVoltage
+func (x *PptpPotsUni) GetNominalFeedVoltage() uint32 {
+	if x != nil {
+		return x.NominalFeedVoltage
 	}
 	return 0
 }
 
-func (m *PptpPotsUni) GetLossOfSoftSwitch() uint32 {
-	if m != nil {
-		return m.LossOfSoftSwitch
+func (x *PptpPotsUni) GetLossOfSoftSwitch() uint32 {
+	if x != nil {
+		return x.LossOfSoftSwitch
 	}
 	return 0
 }
 
 // Sip specific fields are grouped here
 type SipConfig struct {
+	state                         protoimpl.MessageState         `protogen:"open.v1"`
 	SipUserData                   *SipUserData                   `protobuf:"bytes,1,opt,name=sipUserData,proto3" json:"sipUserData,omitempty"`
 	SipAgentConfig                *SipAgentConfig                `protobuf:"bytes,2,opt,name=sipAgentConfig,proto3" json:"sipAgentConfig,omitempty"`
 	NetworkDialPlan               *NetworkDialPlan               `protobuf:"bytes,3,opt,name=networkDialPlan,proto3" json:"networkDialPlan,omitempty"`
 	VoipFeatureAccessCodes        *VoipFeatureAccessCodes        `protobuf:"bytes,4,opt,name=voipFeatureAccessCodes,proto3" json:"voipFeatureAccessCodes,omitempty"`
 	VoipApplicationServiceProfile *VoipApplicationServiceProfile `protobuf:"bytes,5,opt,name=voipApplicationServiceProfile,proto3" json:"voipApplicationServiceProfile,omitempty"`
-	XXX_NoUnkeyedLiteral          struct{}                       `json:"-"`
-	XXX_unrecognized              []byte                         `json:"-"`
-	XXX_sizecache                 int32                          `json:"-"`
+	unknownFields                 protoimpl.UnknownFields
+	sizeCache                     protoimpl.SizeCache
 }
 
-func (m *SipConfig) Reset()         { *m = SipConfig{} }
-func (m *SipConfig) String() string { return proto.CompactTextString(m) }
-func (*SipConfig) ProtoMessage()    {}
+func (x *SipConfig) Reset() {
+	*x = SipConfig{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SipConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SipConfig) ProtoMessage() {}
+
+func (x *SipConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[10]
+	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 SipConfig.ProtoReflect.Descriptor instead.
 func (*SipConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{10}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{10}
 }
 
-func (m *SipConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SipConfig.Unmarshal(m, b)
-}
-func (m *SipConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SipConfig.Marshal(b, m, deterministic)
-}
-func (m *SipConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SipConfig.Merge(m, src)
-}
-func (m *SipConfig) XXX_Size() int {
-	return xxx_messageInfo_SipConfig.Size(m)
-}
-func (m *SipConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SipConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SipConfig proto.InternalMessageInfo
-
-func (m *SipConfig) GetSipUserData() *SipUserData {
-	if m != nil {
-		return m.SipUserData
+func (x *SipConfig) GetSipUserData() *SipUserData {
+	if x != nil {
+		return x.SipUserData
 	}
 	return nil
 }
 
-func (m *SipConfig) GetSipAgentConfig() *SipAgentConfig {
-	if m != nil {
-		return m.SipAgentConfig
+func (x *SipConfig) GetSipAgentConfig() *SipAgentConfig {
+	if x != nil {
+		return x.SipAgentConfig
 	}
 	return nil
 }
 
-func (m *SipConfig) GetNetworkDialPlan() *NetworkDialPlan {
-	if m != nil {
-		return m.NetworkDialPlan
+func (x *SipConfig) GetNetworkDialPlan() *NetworkDialPlan {
+	if x != nil {
+		return x.NetworkDialPlan
 	}
 	return nil
 }
 
-func (m *SipConfig) GetVoipFeatureAccessCodes() *VoipFeatureAccessCodes {
-	if m != nil {
-		return m.VoipFeatureAccessCodes
+func (x *SipConfig) GetVoipFeatureAccessCodes() *VoipFeatureAccessCodes {
+	if x != nil {
+		return x.VoipFeatureAccessCodes
 	}
 	return nil
 }
 
-func (m *SipConfig) GetVoipApplicationServiceProfile() *VoipApplicationServiceProfile {
-	if m != nil {
-		return m.VoipApplicationServiceProfile
+func (x *SipConfig) GetVoipApplicationServiceProfile() *VoipApplicationServiceProfile {
+	if x != nil {
+		return x.VoipApplicationServiceProfile
 	}
 	return nil
 }
 
 type SipUserData struct {
-	UserPartAor                         string               `protobuf:"bytes,1,opt,name=userPartAor,proto3" json:"userPartAor,omitempty"`
-	UsernameAndPassword                 *UsernameAndPassword `protobuf:"bytes,2,opt,name=usernameAndPassword,proto3" json:"usernameAndPassword,omitempty"`
-	VoicemailServerSipUri               string               `protobuf:"bytes,3,opt,name=voicemailServerSipUri,proto3" json:"voicemailServerSipUri,omitempty"`
-	VoicemailSubscriptionExpirationTime int32                `protobuf:"varint,4,opt,name=voicemailSubscriptionExpirationTime,proto3" json:"voicemailSubscriptionExpirationTime,omitempty"`
-	ReleaseTimer                        int32                `protobuf:"varint,5,opt,name=releaseTimer,proto3" json:"releaseTimer,omitempty"`
-	RohTimer                            int32                `protobuf:"varint,6,opt,name=rohTimer,proto3" json:"rohTimer,omitempty"`
-	XXX_NoUnkeyedLiteral                struct{}             `json:"-"`
-	XXX_unrecognized                    []byte               `json:"-"`
-	XXX_sizecache                       int32                `json:"-"`
+	state                               protoimpl.MessageState `protogen:"open.v1"`
+	UserPartAor                         string                 `protobuf:"bytes,1,opt,name=userPartAor,proto3" json:"userPartAor,omitempty"`
+	UsernameAndPassword                 *UsernameAndPassword   `protobuf:"bytes,2,opt,name=usernameAndPassword,proto3" json:"usernameAndPassword,omitempty"`
+	VoicemailServerSipUri               string                 `protobuf:"bytes,3,opt,name=voicemailServerSipUri,proto3" json:"voicemailServerSipUri,omitempty"`
+	VoicemailSubscriptionExpirationTime int32                  `protobuf:"varint,4,opt,name=voicemailSubscriptionExpirationTime,proto3" json:"voicemailSubscriptionExpirationTime,omitempty"`
+	ReleaseTimer                        int32                  `protobuf:"varint,5,opt,name=releaseTimer,proto3" json:"releaseTimer,omitempty"`
+	RohTimer                            int32                  `protobuf:"varint,6,opt,name=rohTimer,proto3" json:"rohTimer,omitempty"`
+	unknownFields                       protoimpl.UnknownFields
+	sizeCache                           protoimpl.SizeCache
 }
 
-func (m *SipUserData) Reset()         { *m = SipUserData{} }
-func (m *SipUserData) String() string { return proto.CompactTextString(m) }
-func (*SipUserData) ProtoMessage()    {}
+func (x *SipUserData) Reset() {
+	*x = SipUserData{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SipUserData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SipUserData) ProtoMessage() {}
+
+func (x *SipUserData) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[11]
+	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 SipUserData.ProtoReflect.Descriptor instead.
 func (*SipUserData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{11}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{11}
 }
 
-func (m *SipUserData) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SipUserData.Unmarshal(m, b)
-}
-func (m *SipUserData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SipUserData.Marshal(b, m, deterministic)
-}
-func (m *SipUserData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SipUserData.Merge(m, src)
-}
-func (m *SipUserData) XXX_Size() int {
-	return xxx_messageInfo_SipUserData.Size(m)
-}
-func (m *SipUserData) XXX_DiscardUnknown() {
-	xxx_messageInfo_SipUserData.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SipUserData proto.InternalMessageInfo
-
-func (m *SipUserData) GetUserPartAor() string {
-	if m != nil {
-		return m.UserPartAor
+func (x *SipUserData) GetUserPartAor() string {
+	if x != nil {
+		return x.UserPartAor
 	}
 	return ""
 }
 
-func (m *SipUserData) GetUsernameAndPassword() *UsernameAndPassword {
-	if m != nil {
-		return m.UsernameAndPassword
+func (x *SipUserData) GetUsernameAndPassword() *UsernameAndPassword {
+	if x != nil {
+		return x.UsernameAndPassword
 	}
 	return nil
 }
 
-func (m *SipUserData) GetVoicemailServerSipUri() string {
-	if m != nil {
-		return m.VoicemailServerSipUri
+func (x *SipUserData) GetVoicemailServerSipUri() string {
+	if x != nil {
+		return x.VoicemailServerSipUri
 	}
 	return ""
 }
 
-func (m *SipUserData) GetVoicemailSubscriptionExpirationTime() int32 {
-	if m != nil {
-		return m.VoicemailSubscriptionExpirationTime
+func (x *SipUserData) GetVoicemailSubscriptionExpirationTime() int32 {
+	if x != nil {
+		return x.VoicemailSubscriptionExpirationTime
 	}
 	return 0
 }
 
-func (m *SipUserData) GetReleaseTimer() int32 {
-	if m != nil {
-		return m.ReleaseTimer
+func (x *SipUserData) GetReleaseTimer() int32 {
+	if x != nil {
+		return x.ReleaseTimer
 	}
 	return 0
 }
 
-func (m *SipUserData) GetRohTimer() int32 {
-	if m != nil {
-		return m.RohTimer
+func (x *SipUserData) GetRohTimer() int32 {
+	if x != nil {
+		return x.RohTimer
 	}
 	return 0
 }
 
 type SipAgentConfig struct {
-	OutboundProxyAddress     string            `protobuf:"bytes,1,opt,name=outboundProxyAddress,proto3" json:"outboundProxyAddress,omitempty"`
-	PrimarySipDns            string            `protobuf:"bytes,2,opt,name=primarySipDns,proto3" json:"primarySipDns,omitempty"`
-	SecondarySipDns          string            `protobuf:"bytes,3,opt,name=secondarySipDns,proto3" json:"secondarySipDns,omitempty"`
-	SipRegExpTime            int32             `protobuf:"varint,4,opt,name=sipRegExpTime,proto3" json:"sipRegExpTime,omitempty"`
-	SipReregHeadStartTime    int32             `protobuf:"varint,5,opt,name=sipReregHeadStartTime,proto3" json:"sipReregHeadStartTime,omitempty"`
-	SipRegistrar             string            `protobuf:"bytes,6,opt,name=SipRegistrar,proto3" json:"SipRegistrar,omitempty"`
-	SoftSwitch               string            `protobuf:"bytes,7,opt,name=softSwitch,proto3" json:"softSwitch,omitempty"`
-	SipResponseTable         *SipResponseTable `protobuf:"bytes,8,opt,name=sipResponseTable,proto3" json:"sipResponseTable,omitempty"`
-	SipOptionTransmitControl bool              `protobuf:"varint,9,opt,name=sipOptionTransmitControl,proto3" json:"sipOptionTransmitControl,omitempty"`
-	SipUriFormat             string            `protobuf:"bytes,10,opt,name=sipUriFormat,proto3" json:"sipUriFormat,omitempty"`
-	RedundantSipAgentPointer string            `protobuf:"bytes,11,opt,name=redundantSipAgentPointer,proto3" json:"redundantSipAgentPointer,omitempty"`
-	XXX_NoUnkeyedLiteral     struct{}          `json:"-"`
-	XXX_unrecognized         []byte            `json:"-"`
-	XXX_sizecache            int32             `json:"-"`
+	state                    protoimpl.MessageState `protogen:"open.v1"`
+	OutboundProxyAddress     string                 `protobuf:"bytes,1,opt,name=outboundProxyAddress,proto3" json:"outboundProxyAddress,omitempty"`
+	PrimarySipDns            string                 `protobuf:"bytes,2,opt,name=primarySipDns,proto3" json:"primarySipDns,omitempty"`
+	SecondarySipDns          string                 `protobuf:"bytes,3,opt,name=secondarySipDns,proto3" json:"secondarySipDns,omitempty"`
+	SipRegExpTime            int32                  `protobuf:"varint,4,opt,name=sipRegExpTime,proto3" json:"sipRegExpTime,omitempty"`
+	SipReregHeadStartTime    int32                  `protobuf:"varint,5,opt,name=sipReregHeadStartTime,proto3" json:"sipReregHeadStartTime,omitempty"`
+	SipRegistrar             string                 `protobuf:"bytes,6,opt,name=SipRegistrar,proto3" json:"SipRegistrar,omitempty"`
+	SoftSwitch               string                 `protobuf:"bytes,7,opt,name=softSwitch,proto3" json:"softSwitch,omitempty"`
+	SipResponseTable         *SipResponseTable      `protobuf:"bytes,8,opt,name=sipResponseTable,proto3" json:"sipResponseTable,omitempty"`
+	SipOptionTransmitControl bool                   `protobuf:"varint,9,opt,name=sipOptionTransmitControl,proto3" json:"sipOptionTransmitControl,omitempty"`
+	SipUriFormat             string                 `protobuf:"bytes,10,opt,name=sipUriFormat,proto3" json:"sipUriFormat,omitempty"`
+	RedundantSipAgentPointer string                 `protobuf:"bytes,11,opt,name=redundantSipAgentPointer,proto3" json:"redundantSipAgentPointer,omitempty"`
+	unknownFields            protoimpl.UnknownFields
+	sizeCache                protoimpl.SizeCache
 }
 
-func (m *SipAgentConfig) Reset()         { *m = SipAgentConfig{} }
-func (m *SipAgentConfig) String() string { return proto.CompactTextString(m) }
-func (*SipAgentConfig) ProtoMessage()    {}
+func (x *SipAgentConfig) Reset() {
+	*x = SipAgentConfig{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SipAgentConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SipAgentConfig) ProtoMessage() {}
+
+func (x *SipAgentConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[12]
+	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 SipAgentConfig.ProtoReflect.Descriptor instead.
 func (*SipAgentConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{12}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{12}
 }
 
-func (m *SipAgentConfig) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SipAgentConfig.Unmarshal(m, b)
-}
-func (m *SipAgentConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SipAgentConfig.Marshal(b, m, deterministic)
-}
-func (m *SipAgentConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SipAgentConfig.Merge(m, src)
-}
-func (m *SipAgentConfig) XXX_Size() int {
-	return xxx_messageInfo_SipAgentConfig.Size(m)
-}
-func (m *SipAgentConfig) XXX_DiscardUnknown() {
-	xxx_messageInfo_SipAgentConfig.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SipAgentConfig proto.InternalMessageInfo
-
-func (m *SipAgentConfig) GetOutboundProxyAddress() string {
-	if m != nil {
-		return m.OutboundProxyAddress
+func (x *SipAgentConfig) GetOutboundProxyAddress() string {
+	if x != nil {
+		return x.OutboundProxyAddress
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetPrimarySipDns() string {
-	if m != nil {
-		return m.PrimarySipDns
+func (x *SipAgentConfig) GetPrimarySipDns() string {
+	if x != nil {
+		return x.PrimarySipDns
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetSecondarySipDns() string {
-	if m != nil {
-		return m.SecondarySipDns
+func (x *SipAgentConfig) GetSecondarySipDns() string {
+	if x != nil {
+		return x.SecondarySipDns
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetSipRegExpTime() int32 {
-	if m != nil {
-		return m.SipRegExpTime
+func (x *SipAgentConfig) GetSipRegExpTime() int32 {
+	if x != nil {
+		return x.SipRegExpTime
 	}
 	return 0
 }
 
-func (m *SipAgentConfig) GetSipReregHeadStartTime() int32 {
-	if m != nil {
-		return m.SipReregHeadStartTime
+func (x *SipAgentConfig) GetSipReregHeadStartTime() int32 {
+	if x != nil {
+		return x.SipReregHeadStartTime
 	}
 	return 0
 }
 
-func (m *SipAgentConfig) GetSipRegistrar() string {
-	if m != nil {
-		return m.SipRegistrar
+func (x *SipAgentConfig) GetSipRegistrar() string {
+	if x != nil {
+		return x.SipRegistrar
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetSoftSwitch() string {
-	if m != nil {
-		return m.SoftSwitch
+func (x *SipAgentConfig) GetSoftSwitch() string {
+	if x != nil {
+		return x.SoftSwitch
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetSipResponseTable() *SipResponseTable {
-	if m != nil {
-		return m.SipResponseTable
+func (x *SipAgentConfig) GetSipResponseTable() *SipResponseTable {
+	if x != nil {
+		return x.SipResponseTable
 	}
 	return nil
 }
 
-func (m *SipAgentConfig) GetSipOptionTransmitControl() bool {
-	if m != nil {
-		return m.SipOptionTransmitControl
+func (x *SipAgentConfig) GetSipOptionTransmitControl() bool {
+	if x != nil {
+		return x.SipOptionTransmitControl
 	}
 	return false
 }
 
-func (m *SipAgentConfig) GetSipUriFormat() string {
-	if m != nil {
-		return m.SipUriFormat
+func (x *SipAgentConfig) GetSipUriFormat() string {
+	if x != nil {
+		return x.SipUriFormat
 	}
 	return ""
 }
 
-func (m *SipAgentConfig) GetRedundantSipAgentPointer() string {
-	if m != nil {
-		return m.RedundantSipAgentPointer
+func (x *SipAgentConfig) GetRedundantSipAgentPointer() string {
+	if x != nil {
+		return x.RedundantSipAgentPointer
 	}
 	return ""
 }
 
 type NetworkDialPlan struct {
-	CriticalDialTimeout  uint32         `protobuf:"varint,1,opt,name=criticalDialTimeout,proto3" json:"criticalDialTimeout,omitempty"`
-	PartialDialTimeout   uint32         `protobuf:"varint,2,opt,name=partialDialTimeout,proto3" json:"partialDialTimeout,omitempty"`
-	DialPlanFormat       uint32         `protobuf:"varint,3,opt,name=dialPlanFormat,proto3" json:"dialPlanFormat,omitempty"`
-	DialPlanTable        *DialPlanTable `protobuf:"bytes,4,opt,name=dialPlanTable,proto3" json:"dialPlanTable,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	CriticalDialTimeout uint32                 `protobuf:"varint,1,opt,name=criticalDialTimeout,proto3" json:"criticalDialTimeout,omitempty"`
+	PartialDialTimeout  uint32                 `protobuf:"varint,2,opt,name=partialDialTimeout,proto3" json:"partialDialTimeout,omitempty"`
+	DialPlanFormat      uint32                 `protobuf:"varint,3,opt,name=dialPlanFormat,proto3" json:"dialPlanFormat,omitempty"`
+	DialPlanTable       *DialPlanTable         `protobuf:"bytes,4,opt,name=dialPlanTable,proto3" json:"dialPlanTable,omitempty"`
+	unknownFields       protoimpl.UnknownFields
+	sizeCache           protoimpl.SizeCache
 }
 
-func (m *NetworkDialPlan) Reset()         { *m = NetworkDialPlan{} }
-func (m *NetworkDialPlan) String() string { return proto.CompactTextString(m) }
-func (*NetworkDialPlan) ProtoMessage()    {}
+func (x *NetworkDialPlan) Reset() {
+	*x = NetworkDialPlan{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *NetworkDialPlan) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NetworkDialPlan) ProtoMessage() {}
+
+func (x *NetworkDialPlan) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[13]
+	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 NetworkDialPlan.ProtoReflect.Descriptor instead.
 func (*NetworkDialPlan) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{13}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{13}
 }
 
-func (m *NetworkDialPlan) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_NetworkDialPlan.Unmarshal(m, b)
-}
-func (m *NetworkDialPlan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_NetworkDialPlan.Marshal(b, m, deterministic)
-}
-func (m *NetworkDialPlan) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NetworkDialPlan.Merge(m, src)
-}
-func (m *NetworkDialPlan) XXX_Size() int {
-	return xxx_messageInfo_NetworkDialPlan.Size(m)
-}
-func (m *NetworkDialPlan) XXX_DiscardUnknown() {
-	xxx_messageInfo_NetworkDialPlan.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_NetworkDialPlan proto.InternalMessageInfo
-
-func (m *NetworkDialPlan) GetCriticalDialTimeout() uint32 {
-	if m != nil {
-		return m.CriticalDialTimeout
+func (x *NetworkDialPlan) GetCriticalDialTimeout() uint32 {
+	if x != nil {
+		return x.CriticalDialTimeout
 	}
 	return 0
 }
 
-func (m *NetworkDialPlan) GetPartialDialTimeout() uint32 {
-	if m != nil {
-		return m.PartialDialTimeout
+func (x *NetworkDialPlan) GetPartialDialTimeout() uint32 {
+	if x != nil {
+		return x.PartialDialTimeout
 	}
 	return 0
 }
 
-func (m *NetworkDialPlan) GetDialPlanFormat() uint32 {
-	if m != nil {
-		return m.DialPlanFormat
+func (x *NetworkDialPlan) GetDialPlanFormat() uint32 {
+	if x != nil {
+		return x.DialPlanFormat
 	}
 	return 0
 }
 
-func (m *NetworkDialPlan) GetDialPlanTable() *DialPlanTable {
-	if m != nil {
-		return m.DialPlanTable
+func (x *NetworkDialPlan) GetDialPlanTable() *DialPlanTable {
+	if x != nil {
+		return x.DialPlanTable
 	}
 	return nil
 }
 
 type UsernameAndPassword struct {
-	ValidationScheme     int32    `protobuf:"varint,1,opt,name=validationScheme,proto3" json:"validationScheme,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state            protoimpl.MessageState `protogen:"open.v1"`
+	ValidationScheme int32                  `protobuf:"varint,1,opt,name=validationScheme,proto3" json:"validationScheme,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
 }
 
-func (m *UsernameAndPassword) Reset()         { *m = UsernameAndPassword{} }
-func (m *UsernameAndPassword) String() string { return proto.CompactTextString(m) }
-func (*UsernameAndPassword) ProtoMessage()    {}
+func (x *UsernameAndPassword) Reset() {
+	*x = UsernameAndPassword{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UsernameAndPassword) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UsernameAndPassword) ProtoMessage() {}
+
+func (x *UsernameAndPassword) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[14]
+	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 UsernameAndPassword.ProtoReflect.Descriptor instead.
 func (*UsernameAndPassword) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{14}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{14}
 }
 
-func (m *UsernameAndPassword) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UsernameAndPassword.Unmarshal(m, b)
-}
-func (m *UsernameAndPassword) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UsernameAndPassword.Marshal(b, m, deterministic)
-}
-func (m *UsernameAndPassword) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UsernameAndPassword.Merge(m, src)
-}
-func (m *UsernameAndPassword) XXX_Size() int {
-	return xxx_messageInfo_UsernameAndPassword.Size(m)
-}
-func (m *UsernameAndPassword) XXX_DiscardUnknown() {
-	xxx_messageInfo_UsernameAndPassword.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_UsernameAndPassword proto.InternalMessageInfo
-
-func (m *UsernameAndPassword) GetValidationScheme() int32 {
-	if m != nil {
-		return m.ValidationScheme
+func (x *UsernameAndPassword) GetValidationScheme() int32 {
+	if x != nil {
+		return x.ValidationScheme
 	}
 	return 0
 }
 
 type SipResponseTable struct {
-	SipResponseCode      string   `protobuf:"bytes,1,opt,name=sipResponseCode,proto3" json:"sipResponseCode,omitempty"`
-	Tone                 string   `protobuf:"bytes,2,opt,name=tone,proto3" json:"tone,omitempty"`
-	TextMessage          string   `protobuf:"bytes,3,opt,name=textMessage,proto3" json:"textMessage,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	SipResponseCode string                 `protobuf:"bytes,1,opt,name=sipResponseCode,proto3" json:"sipResponseCode,omitempty"`
+	Tone            string                 `protobuf:"bytes,2,opt,name=tone,proto3" json:"tone,omitempty"`
+	TextMessage     string                 `protobuf:"bytes,3,opt,name=textMessage,proto3" json:"textMessage,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
 }
 
-func (m *SipResponseTable) Reset()         { *m = SipResponseTable{} }
-func (m *SipResponseTable) String() string { return proto.CompactTextString(m) }
-func (*SipResponseTable) ProtoMessage()    {}
+func (x *SipResponseTable) Reset() {
+	*x = SipResponseTable{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SipResponseTable) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SipResponseTable) ProtoMessage() {}
+
+func (x *SipResponseTable) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[15]
+	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 SipResponseTable.ProtoReflect.Descriptor instead.
 func (*SipResponseTable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{15}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{15}
 }
 
-func (m *SipResponseTable) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SipResponseTable.Unmarshal(m, b)
-}
-func (m *SipResponseTable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SipResponseTable.Marshal(b, m, deterministic)
-}
-func (m *SipResponseTable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SipResponseTable.Merge(m, src)
-}
-func (m *SipResponseTable) XXX_Size() int {
-	return xxx_messageInfo_SipResponseTable.Size(m)
-}
-func (m *SipResponseTable) XXX_DiscardUnknown() {
-	xxx_messageInfo_SipResponseTable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_SipResponseTable proto.InternalMessageInfo
-
-func (m *SipResponseTable) GetSipResponseCode() string {
-	if m != nil {
-		return m.SipResponseCode
+func (x *SipResponseTable) GetSipResponseCode() string {
+	if x != nil {
+		return x.SipResponseCode
 	}
 	return ""
 }
 
-func (m *SipResponseTable) GetTone() string {
-	if m != nil {
-		return m.Tone
+func (x *SipResponseTable) GetTone() string {
+	if x != nil {
+		return x.Tone
 	}
 	return ""
 }
 
-func (m *SipResponseTable) GetTextMessage() string {
-	if m != nil {
-		return m.TextMessage
+func (x *SipResponseTable) GetTextMessage() string {
+	if x != nil {
+		return x.TextMessage
 	}
 	return ""
 }
 
 type DialPlanTable struct {
-	DialPlanId           uint32   `protobuf:"varint,1,opt,name=dialPlanId,proto3" json:"dialPlanId,omitempty"`
-	Action               uint32   `protobuf:"varint,2,opt,name=action,proto3" json:"action,omitempty"`
-	DialPlanToken        string   `protobuf:"bytes,3,opt,name=dialPlanToken,proto3" json:"dialPlanToken,omitempty"`
-	DialPlanTableMaxSize uint32   `protobuf:"varint,4,opt,name=dialPlanTableMaxSize,proto3" json:"dialPlanTableMaxSize,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	state                protoimpl.MessageState `protogen:"open.v1"`
+	DialPlanId           uint32                 `protobuf:"varint,1,opt,name=dialPlanId,proto3" json:"dialPlanId,omitempty"`
+	Action               uint32                 `protobuf:"varint,2,opt,name=action,proto3" json:"action,omitempty"`
+	DialPlanToken        string                 `protobuf:"bytes,3,opt,name=dialPlanToken,proto3" json:"dialPlanToken,omitempty"`
+	DialPlanTableMaxSize uint32                 `protobuf:"varint,4,opt,name=dialPlanTableMaxSize,proto3" json:"dialPlanTableMaxSize,omitempty"`
+	unknownFields        protoimpl.UnknownFields
+	sizeCache            protoimpl.SizeCache
 }
 
-func (m *DialPlanTable) Reset()         { *m = DialPlanTable{} }
-func (m *DialPlanTable) String() string { return proto.CompactTextString(m) }
-func (*DialPlanTable) ProtoMessage()    {}
+func (x *DialPlanTable) Reset() {
+	*x = DialPlanTable{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DialPlanTable) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DialPlanTable) ProtoMessage() {}
+
+func (x *DialPlanTable) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[16]
+	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 DialPlanTable.ProtoReflect.Descriptor instead.
 func (*DialPlanTable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{16}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{16}
 }
 
-func (m *DialPlanTable) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DialPlanTable.Unmarshal(m, b)
-}
-func (m *DialPlanTable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DialPlanTable.Marshal(b, m, deterministic)
-}
-func (m *DialPlanTable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DialPlanTable.Merge(m, src)
-}
-func (m *DialPlanTable) XXX_Size() int {
-	return xxx_messageInfo_DialPlanTable.Size(m)
-}
-func (m *DialPlanTable) XXX_DiscardUnknown() {
-	xxx_messageInfo_DialPlanTable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_DialPlanTable proto.InternalMessageInfo
-
-func (m *DialPlanTable) GetDialPlanId() uint32 {
-	if m != nil {
-		return m.DialPlanId
+func (x *DialPlanTable) GetDialPlanId() uint32 {
+	if x != nil {
+		return x.DialPlanId
 	}
 	return 0
 }
 
-func (m *DialPlanTable) GetAction() uint32 {
-	if m != nil {
-		return m.Action
+func (x *DialPlanTable) GetAction() uint32 {
+	if x != nil {
+		return x.Action
 	}
 	return 0
 }
 
-func (m *DialPlanTable) GetDialPlanToken() string {
-	if m != nil {
-		return m.DialPlanToken
+func (x *DialPlanTable) GetDialPlanToken() string {
+	if x != nil {
+		return x.DialPlanToken
 	}
 	return ""
 }
 
-func (m *DialPlanTable) GetDialPlanTableMaxSize() uint32 {
-	if m != nil {
-		return m.DialPlanTableMaxSize
+func (x *DialPlanTable) GetDialPlanTableMaxSize() uint32 {
+	if x != nil {
+		return x.DialPlanTableMaxSize
 	}
 	return 0
 }
 
 type VoipFeatureAccessCodes struct {
-	CancelCallWaiting        string   `protobuf:"bytes,1,opt,name=cancelCallWaiting,proto3" json:"cancelCallWaiting,omitempty"`
-	CallHold                 string   `protobuf:"bytes,2,opt,name=callHold,proto3" json:"callHold,omitempty"`
-	CallPark                 string   `protobuf:"bytes,3,opt,name=callPark,proto3" json:"callPark,omitempty"`
-	CallerIdActivate         string   `protobuf:"bytes,4,opt,name=callerIdActivate,proto3" json:"callerIdActivate,omitempty"`
-	CallerIdDeactivate       string   `protobuf:"bytes,5,opt,name=callerIdDeactivate,proto3" json:"callerIdDeactivate,omitempty"`
-	DoNotDisturbActivation   string   `protobuf:"bytes,6,opt,name=doNotDisturbActivation,proto3" json:"doNotDisturbActivation,omitempty"`
-	DoNotDisturbDeactivation string   `protobuf:"bytes,7,opt,name=doNotDisturbDeactivation,proto3" json:"doNotDisturbDeactivation,omitempty"`
-	DoNotDisturbPinChange    string   `protobuf:"bytes,8,opt,name=doNotDisturbPinChange,proto3" json:"doNotDisturbPinChange,omitempty"`
-	EmergencyServiceNumber   string   `protobuf:"bytes,9,opt,name=emergencyServiceNumber,proto3" json:"emergencyServiceNumber,omitempty"`
-	IntercomService          string   `protobuf:"bytes,10,opt,name=intercomService,proto3" json:"intercomService,omitempty"`
-	UnattendedCallTransfer   string   `protobuf:"bytes,11,opt,name=unattendedCallTransfer,proto3" json:"unattendedCallTransfer,omitempty"`
-	AttendedCallTransfer     string   `protobuf:"bytes,12,opt,name=attendedCallTransfer,proto3" json:"attendedCallTransfer,omitempty"`
-	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
-	XXX_unrecognized         []byte   `json:"-"`
-	XXX_sizecache            int32    `json:"-"`
+	state                    protoimpl.MessageState `protogen:"open.v1"`
+	CancelCallWaiting        string                 `protobuf:"bytes,1,opt,name=cancelCallWaiting,proto3" json:"cancelCallWaiting,omitempty"`
+	CallHold                 string                 `protobuf:"bytes,2,opt,name=callHold,proto3" json:"callHold,omitempty"`
+	CallPark                 string                 `protobuf:"bytes,3,opt,name=callPark,proto3" json:"callPark,omitempty"`
+	CallerIdActivate         string                 `protobuf:"bytes,4,opt,name=callerIdActivate,proto3" json:"callerIdActivate,omitempty"`
+	CallerIdDeactivate       string                 `protobuf:"bytes,5,opt,name=callerIdDeactivate,proto3" json:"callerIdDeactivate,omitempty"`
+	DoNotDisturbActivation   string                 `protobuf:"bytes,6,opt,name=doNotDisturbActivation,proto3" json:"doNotDisturbActivation,omitempty"`
+	DoNotDisturbDeactivation string                 `protobuf:"bytes,7,opt,name=doNotDisturbDeactivation,proto3" json:"doNotDisturbDeactivation,omitempty"`
+	DoNotDisturbPinChange    string                 `protobuf:"bytes,8,opt,name=doNotDisturbPinChange,proto3" json:"doNotDisturbPinChange,omitempty"`
+	EmergencyServiceNumber   string                 `protobuf:"bytes,9,opt,name=emergencyServiceNumber,proto3" json:"emergencyServiceNumber,omitempty"`
+	IntercomService          string                 `protobuf:"bytes,10,opt,name=intercomService,proto3" json:"intercomService,omitempty"`
+	UnattendedCallTransfer   string                 `protobuf:"bytes,11,opt,name=unattendedCallTransfer,proto3" json:"unattendedCallTransfer,omitempty"`
+	AttendedCallTransfer     string                 `protobuf:"bytes,12,opt,name=attendedCallTransfer,proto3" json:"attendedCallTransfer,omitempty"`
+	unknownFields            protoimpl.UnknownFields
+	sizeCache                protoimpl.SizeCache
 }
 
-func (m *VoipFeatureAccessCodes) Reset()         { *m = VoipFeatureAccessCodes{} }
-func (m *VoipFeatureAccessCodes) String() string { return proto.CompactTextString(m) }
-func (*VoipFeatureAccessCodes) ProtoMessage()    {}
+func (x *VoipFeatureAccessCodes) Reset() {
+	*x = VoipFeatureAccessCodes{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipFeatureAccessCodes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipFeatureAccessCodes) ProtoMessage() {}
+
+func (x *VoipFeatureAccessCodes) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[17]
+	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 VoipFeatureAccessCodes.ProtoReflect.Descriptor instead.
 func (*VoipFeatureAccessCodes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{17}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{17}
 }
 
-func (m *VoipFeatureAccessCodes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipFeatureAccessCodes.Unmarshal(m, b)
-}
-func (m *VoipFeatureAccessCodes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipFeatureAccessCodes.Marshal(b, m, deterministic)
-}
-func (m *VoipFeatureAccessCodes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipFeatureAccessCodes.Merge(m, src)
-}
-func (m *VoipFeatureAccessCodes) XXX_Size() int {
-	return xxx_messageInfo_VoipFeatureAccessCodes.Size(m)
-}
-func (m *VoipFeatureAccessCodes) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipFeatureAccessCodes.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipFeatureAccessCodes proto.InternalMessageInfo
-
-func (m *VoipFeatureAccessCodes) GetCancelCallWaiting() string {
-	if m != nil {
-		return m.CancelCallWaiting
+func (x *VoipFeatureAccessCodes) GetCancelCallWaiting() string {
+	if x != nil {
+		return x.CancelCallWaiting
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetCallHold() string {
-	if m != nil {
-		return m.CallHold
+func (x *VoipFeatureAccessCodes) GetCallHold() string {
+	if x != nil {
+		return x.CallHold
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetCallPark() string {
-	if m != nil {
-		return m.CallPark
+func (x *VoipFeatureAccessCodes) GetCallPark() string {
+	if x != nil {
+		return x.CallPark
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetCallerIdActivate() string {
-	if m != nil {
-		return m.CallerIdActivate
+func (x *VoipFeatureAccessCodes) GetCallerIdActivate() string {
+	if x != nil {
+		return x.CallerIdActivate
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetCallerIdDeactivate() string {
-	if m != nil {
-		return m.CallerIdDeactivate
+func (x *VoipFeatureAccessCodes) GetCallerIdDeactivate() string {
+	if x != nil {
+		return x.CallerIdDeactivate
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetDoNotDisturbActivation() string {
-	if m != nil {
-		return m.DoNotDisturbActivation
+func (x *VoipFeatureAccessCodes) GetDoNotDisturbActivation() string {
+	if x != nil {
+		return x.DoNotDisturbActivation
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetDoNotDisturbDeactivation() string {
-	if m != nil {
-		return m.DoNotDisturbDeactivation
+func (x *VoipFeatureAccessCodes) GetDoNotDisturbDeactivation() string {
+	if x != nil {
+		return x.DoNotDisturbDeactivation
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetDoNotDisturbPinChange() string {
-	if m != nil {
-		return m.DoNotDisturbPinChange
+func (x *VoipFeatureAccessCodes) GetDoNotDisturbPinChange() string {
+	if x != nil {
+		return x.DoNotDisturbPinChange
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetEmergencyServiceNumber() string {
-	if m != nil {
-		return m.EmergencyServiceNumber
+func (x *VoipFeatureAccessCodes) GetEmergencyServiceNumber() string {
+	if x != nil {
+		return x.EmergencyServiceNumber
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetIntercomService() string {
-	if m != nil {
-		return m.IntercomService
+func (x *VoipFeatureAccessCodes) GetIntercomService() string {
+	if x != nil {
+		return x.IntercomService
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetUnattendedCallTransfer() string {
-	if m != nil {
-		return m.UnattendedCallTransfer
+func (x *VoipFeatureAccessCodes) GetUnattendedCallTransfer() string {
+	if x != nil {
+		return x.UnattendedCallTransfer
 	}
 	return ""
 }
 
-func (m *VoipFeatureAccessCodes) GetAttendedCallTransfer() string {
-	if m != nil {
-		return m.AttendedCallTransfer
+func (x *VoipFeatureAccessCodes) GetAttendedCallTransfer() string {
+	if x != nil {
+		return x.AttendedCallTransfer
 	}
 	return ""
 }
 
 type VoipApplicationServiceProfile struct {
-	CidFeatures                    uint32   `protobuf:"varint,1,opt,name=cidFeatures,proto3" json:"cidFeatures,omitempty"`
-	CallWaitingFeatures            uint32   `protobuf:"varint,2,opt,name=callWaitingFeatures,proto3" json:"callWaitingFeatures,omitempty"`
-	CallProgressOrTransferFeatures uint32   `protobuf:"varint,3,opt,name=callProgressOrTransferFeatures,proto3" json:"callProgressOrTransferFeatures,omitempty"`
-	CallPresentationFeatures       uint32   `protobuf:"varint,4,opt,name=callPresentationFeatures,proto3" json:"callPresentationFeatures,omitempty"`
-	DirectConnectFeature           uint32   `protobuf:"varint,5,opt,name=directConnectFeature,proto3" json:"directConnectFeature,omitempty"`
-	DirectConnectUriPointer        string   `protobuf:"bytes,6,opt,name=directConnectUriPointer,proto3" json:"directConnectUriPointer,omitempty"`
-	BridgedLineAgentUriPointer     string   `protobuf:"bytes,7,opt,name=bridgedLineAgentUriPointer,proto3" json:"bridgedLineAgentUriPointer,omitempty"`
-	ConferenceFactoryUriPointer    string   `protobuf:"bytes,8,opt,name=conferenceFactoryUriPointer,proto3" json:"conferenceFactoryUriPointer,omitempty"`
-	DialToneDelayTimer             uint32   `protobuf:"varint,9,opt,name=dialToneDelayTimer,proto3" json:"dialToneDelayTimer,omitempty"`
-	XXX_NoUnkeyedLiteral           struct{} `json:"-"`
-	XXX_unrecognized               []byte   `json:"-"`
-	XXX_sizecache                  int32    `json:"-"`
+	state                          protoimpl.MessageState `protogen:"open.v1"`
+	CidFeatures                    uint32                 `protobuf:"varint,1,opt,name=cidFeatures,proto3" json:"cidFeatures,omitempty"`
+	CallWaitingFeatures            uint32                 `protobuf:"varint,2,opt,name=callWaitingFeatures,proto3" json:"callWaitingFeatures,omitempty"`
+	CallProgressOrTransferFeatures uint32                 `protobuf:"varint,3,opt,name=callProgressOrTransferFeatures,proto3" json:"callProgressOrTransferFeatures,omitempty"`
+	CallPresentationFeatures       uint32                 `protobuf:"varint,4,opt,name=callPresentationFeatures,proto3" json:"callPresentationFeatures,omitempty"`
+	DirectConnectFeature           uint32                 `protobuf:"varint,5,opt,name=directConnectFeature,proto3" json:"directConnectFeature,omitempty"`
+	DirectConnectUriPointer        string                 `protobuf:"bytes,6,opt,name=directConnectUriPointer,proto3" json:"directConnectUriPointer,omitempty"`
+	BridgedLineAgentUriPointer     string                 `protobuf:"bytes,7,opt,name=bridgedLineAgentUriPointer,proto3" json:"bridgedLineAgentUriPointer,omitempty"`
+	ConferenceFactoryUriPointer    string                 `protobuf:"bytes,8,opt,name=conferenceFactoryUriPointer,proto3" json:"conferenceFactoryUriPointer,omitempty"`
+	DialToneDelayTimer             uint32                 `protobuf:"varint,9,opt,name=dialToneDelayTimer,proto3" json:"dialToneDelayTimer,omitempty"`
+	unknownFields                  protoimpl.UnknownFields
+	sizeCache                      protoimpl.SizeCache
 }
 
-func (m *VoipApplicationServiceProfile) Reset()         { *m = VoipApplicationServiceProfile{} }
-func (m *VoipApplicationServiceProfile) String() string { return proto.CompactTextString(m) }
-func (*VoipApplicationServiceProfile) ProtoMessage()    {}
+func (x *VoipApplicationServiceProfile) Reset() {
+	*x = VoipApplicationServiceProfile{}
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *VoipApplicationServiceProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*VoipApplicationServiceProfile) ProtoMessage() {}
+
+func (x *VoipApplicationServiceProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_voltha_protos_voip_system_profile_proto_msgTypes[18]
+	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 VoipApplicationServiceProfile.ProtoReflect.Descriptor instead.
 func (*VoipApplicationServiceProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_02a00a136081bca5, []int{18}
+	return file_voltha_protos_voip_system_profile_proto_rawDescGZIP(), []int{18}
 }
 
-func (m *VoipApplicationServiceProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_VoipApplicationServiceProfile.Unmarshal(m, b)
-}
-func (m *VoipApplicationServiceProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_VoipApplicationServiceProfile.Marshal(b, m, deterministic)
-}
-func (m *VoipApplicationServiceProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VoipApplicationServiceProfile.Merge(m, src)
-}
-func (m *VoipApplicationServiceProfile) XXX_Size() int {
-	return xxx_messageInfo_VoipApplicationServiceProfile.Size(m)
-}
-func (m *VoipApplicationServiceProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_VoipApplicationServiceProfile.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_VoipApplicationServiceProfile proto.InternalMessageInfo
-
-func (m *VoipApplicationServiceProfile) GetCidFeatures() uint32 {
-	if m != nil {
-		return m.CidFeatures
+func (x *VoipApplicationServiceProfile) GetCidFeatures() uint32 {
+	if x != nil {
+		return x.CidFeatures
 	}
 	return 0
 }
 
-func (m *VoipApplicationServiceProfile) GetCallWaitingFeatures() uint32 {
-	if m != nil {
-		return m.CallWaitingFeatures
+func (x *VoipApplicationServiceProfile) GetCallWaitingFeatures() uint32 {
+	if x != nil {
+		return x.CallWaitingFeatures
 	}
 	return 0
 }
 
-func (m *VoipApplicationServiceProfile) GetCallProgressOrTransferFeatures() uint32 {
-	if m != nil {
-		return m.CallProgressOrTransferFeatures
+func (x *VoipApplicationServiceProfile) GetCallProgressOrTransferFeatures() uint32 {
+	if x != nil {
+		return x.CallProgressOrTransferFeatures
 	}
 	return 0
 }
 
-func (m *VoipApplicationServiceProfile) GetCallPresentationFeatures() uint32 {
-	if m != nil {
-		return m.CallPresentationFeatures
+func (x *VoipApplicationServiceProfile) GetCallPresentationFeatures() uint32 {
+	if x != nil {
+		return x.CallPresentationFeatures
 	}
 	return 0
 }
 
-func (m *VoipApplicationServiceProfile) GetDirectConnectFeature() uint32 {
-	if m != nil {
-		return m.DirectConnectFeature
+func (x *VoipApplicationServiceProfile) GetDirectConnectFeature() uint32 {
+	if x != nil {
+		return x.DirectConnectFeature
 	}
 	return 0
 }
 
-func (m *VoipApplicationServiceProfile) GetDirectConnectUriPointer() string {
-	if m != nil {
-		return m.DirectConnectUriPointer
+func (x *VoipApplicationServiceProfile) GetDirectConnectUriPointer() string {
+	if x != nil {
+		return x.DirectConnectUriPointer
 	}
 	return ""
 }
 
-func (m *VoipApplicationServiceProfile) GetBridgedLineAgentUriPointer() string {
-	if m != nil {
-		return m.BridgedLineAgentUriPointer
+func (x *VoipApplicationServiceProfile) GetBridgedLineAgentUriPointer() string {
+	if x != nil {
+		return x.BridgedLineAgentUriPointer
 	}
 	return ""
 }
 
-func (m *VoipApplicationServiceProfile) GetConferenceFactoryUriPointer() string {
-	if m != nil {
-		return m.ConferenceFactoryUriPointer
+func (x *VoipApplicationServiceProfile) GetConferenceFactoryUriPointer() string {
+	if x != nil {
+		return x.ConferenceFactoryUriPointer
 	}
 	return ""
 }
 
-func (m *VoipApplicationServiceProfile) GetDialToneDelayTimer() uint32 {
-	if m != nil {
-		return m.DialToneDelayTimer
+func (x *VoipApplicationServiceProfile) GetDialToneDelayTimer() uint32 {
+	if x != nil {
+		return x.DialToneDelayTimer
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*VoipSystemProfileRequest)(nil), "voip_system_profile.VoipSystemProfileRequest")
-	proto.RegisterType((*VoipSystemProfile)(nil), "voip_system_profile.VoipSystemProfile")
-	proto.RegisterType((*VoipConfig)(nil), "voip_system_profile.VoipConfig")
-	proto.RegisterType((*IpHostConfig)(nil), "voip_system_profile.IpHostConfig")
-	proto.RegisterType((*TcpUdpConfig)(nil), "voip_system_profile.TcpUdpConfig")
-	proto.RegisterType((*VoipVoiceCtp)(nil), "voip_system_profile.VoipVoiceCtp")
-	proto.RegisterType((*VoipMediaProfile)(nil), "voip_system_profile.VoipMediaProfile")
-	proto.RegisterType((*VoiceServiceProfile)(nil), "voip_system_profile.VoiceServiceProfile")
-	proto.RegisterType((*RtpProfile)(nil), "voip_system_profile.RtpProfile")
-	proto.RegisterType((*PptpPotsUni)(nil), "voip_system_profile.PptpPotsUni")
-	proto.RegisterType((*SipConfig)(nil), "voip_system_profile.SipConfig")
-	proto.RegisterType((*SipUserData)(nil), "voip_system_profile.SipUserData")
-	proto.RegisterType((*SipAgentConfig)(nil), "voip_system_profile.SipAgentConfig")
-	proto.RegisterType((*NetworkDialPlan)(nil), "voip_system_profile.NetworkDialPlan")
-	proto.RegisterType((*UsernameAndPassword)(nil), "voip_system_profile.UsernameAndPassword")
-	proto.RegisterType((*SipResponseTable)(nil), "voip_system_profile.SipResponseTable")
-	proto.RegisterType((*DialPlanTable)(nil), "voip_system_profile.DialPlanTable")
-	proto.RegisterType((*VoipFeatureAccessCodes)(nil), "voip_system_profile.VoipFeatureAccessCodes")
-	proto.RegisterType((*VoipApplicationServiceProfile)(nil), "voip_system_profile.VoipApplicationServiceProfile")
+var File_voltha_protos_voip_system_profile_proto protoreflect.FileDescriptor
+
+const file_voltha_protos_voip_system_profile_proto_rawDesc = "" +
+	"\n" +
+	"'voltha_protos/voip_system_profile.proto\x12\x13voip_system_profile\x1a\x1cgoogle/api/annotations.proto\"\x82\x01\n" +
+	"\x18VoipSystemProfileRequest\x12\x10\n" +
+	"\x03key\x18\x01 \x01(\tR\x03key\x12T\n" +
+	"\x11voipSystemProfile\x18\x02 \x01(\v2&.voip_system_profile.VoipSystemProfileR\x11voipSystemProfile\"\x92\x01\n" +
+	"\x11VoipSystemProfile\x12<\n" +
+	"\tsipConfig\x18\x01 \x01(\v2\x1e.voip_system_profile.SipConfigR\tsipConfig\x12?\n" +
+	"\n" +
+	"voipConfig\x18\x02 \x01(\v2\x1f.voip_system_profile.VoipConfigR\n" +
+	"voipConfig\"\x95\x04\n" +
+	"\n" +
+	"VoipConfig\x12E\n" +
+	"\fipHostConfig\x18\x01 \x01(\v2!.voip_system_profile.IpHostConfigR\fipHostConfig\x12E\n" +
+	"\ftcpUdpConfig\x18\x02 \x01(\v2!.voip_system_profile.TcpUdpConfigR\ftcpUdpConfig\x12E\n" +
+	"\fvoipVoiceCtp\x18\x03 \x01(\v2!.voip_system_profile.VoipVoiceCtpR\fvoipVoiceCtp\x12Q\n" +
+	"\x10voipMediaProfile\x18\x04 \x01(\v2%.voip_system_profile.VoipMediaProfileR\x10voipMediaProfile\x12Z\n" +
+	"\x13voiceServiceProfile\x18\x05 \x01(\v2(.voip_system_profile.VoiceServiceProfileR\x13voiceServiceProfile\x12?\n" +
+	"\n" +
+	"rtpProfile\x18\x06 \x01(\v2\x1f.voip_system_profile.RtpProfileR\n" +
+	"rtpProfile\x12B\n" +
+	"\vpptpPotsUni\x18\a \x01(\v2 .voip_system_profile.PptpPotsUniR\vpptpPotsUni\"\x90\x02\n" +
+	"\fIpHostConfig\x12\x1c\n" +
+	"\tipOptions\x18\x01 \x01(\rR\tipOptions\x12$\n" +
+	"\ronuIdentifier\x18\x02 \x01(\tR\ronuIdentifier\x12\x1c\n" +
+	"\tipAddress\x18\x03 \x01(\tR\tipAddress\x12\x12\n" +
+	"\x04mask\x18\x04 \x01(\tR\x04mask\x12\x18\n" +
+	"\agateway\x18\x05 \x01(\tR\agateway\x12\x1e\n" +
+	"\n" +
+	"primaryDns\x18\x06 \x01(\tR\n" +
+	"primaryDns\x12\"\n" +
+	"\fsecondaryDns\x18\a \x01(\tR\fsecondaryDns\x12,\n" +
+	"\x11relayAgentOptions\x18\b \x01(\tR\x11relayAgentOptions\"F\n" +
+	"\fTcpUdpConfig\x12\x1a\n" +
+	"\bprotocol\x18\x01 \x01(\rR\bprotocol\x12\x1a\n" +
+	"\btosField\x18\x02 \x01(\tR\btosField\"6\n" +
+	"\fVoipVoiceCtp\x12&\n" +
+	"\x0esignallingCode\x18\x01 \x01(\rR\x0esignallingCode\"\x96\x05\n" +
+	"\x10VoipMediaProfile\x12\x18\n" +
+	"\afaxMode\x18\x01 \x01(\rR\afaxMode\x12(\n" +
+	"\x0fcodecSelection1\x18\x02 \x01(\rR\x0fcodecSelection1\x126\n" +
+	"\x16packetPeriodSelection1\x18\x03 \x01(\rR\x16packetPeriodSelection1\x120\n" +
+	"\x13silenceSuppression1\x18\x04 \x01(\rR\x13silenceSuppression1\x12(\n" +
+	"\x0fcodecSelection2\x18\x05 \x01(\rR\x0fcodecSelection2\x126\n" +
+	"\x16packetPeriodSelection2\x18\x06 \x01(\rR\x16packetPeriodSelection2\x120\n" +
+	"\x13silenceSuppression2\x18\a \x01(\rR\x13silenceSuppression2\x12(\n" +
+	"\x0fcodecSelection3\x18\b \x01(\rR\x0fcodecSelection3\x126\n" +
+	"\x16packetPeriodSelection3\x18\t \x01(\rR\x16packetPeriodSelection3\x120\n" +
+	"\x13silenceSuppression3\x18\n" +
+	" \x01(\rR\x13silenceSuppression3\x12(\n" +
+	"\x0fcodecSelection4\x18\v \x01(\rR\x0fcodecSelection4\x126\n" +
+	"\x16packetPeriodSelection4\x18\f \x01(\rR\x16packetPeriodSelection4\x120\n" +
+	"\x13silenceSuppression4\x18\r \x01(\rR\x13silenceSuppression4\x12\x18\n" +
+	"\aoobDtmf\x18\x0e \x01(\rR\aoobDtmf\"\xf3\x02\n" +
+	"\x13VoiceServiceProfile\x12*\n" +
+	"\x10announcementType\x18\x01 \x01(\rR\x10announcementType\x12\"\n" +
+	"\fjitterTarget\x18\x02 \x01(\rR\fjitterTarget\x12(\n" +
+	"\x0fjitterBufferMax\x18\x03 \x01(\rR\x0fjitterBufferMax\x12$\n" +
+	"\rechoCancelInd\x18\x04 \x01(\bR\rechoCancelInd\x120\n" +
+	"\x13pstnProtocolVariant\x18\x05 \x01(\rR\x13pstnProtocolVariant\x12(\n" +
+	"\x0fdtmfDigitLevels\x18\x06 \x01(\rR\x0fdtmfDigitLevels\x12,\n" +
+	"\x11dtmfDigitDuration\x18\a \x01(\rR\x11dtmfDigitDuration\x122\n" +
+	"\x14hookFlashMinimumTime\x18\b \x01(\rR\x14hookFlashMinimumTime\"\xf8\x01\n" +
+	"\n" +
+	"RtpProfile\x12\"\n" +
+	"\flocalPortMin\x18\x01 \x01(\rR\flocalPortMin\x12\"\n" +
+	"\flocalPortMax\x18\x02 \x01(\rR\flocalPortMax\x12\x1a\n" +
+	"\bdscpMark\x18\x03 \x01(\tR\bdscpMark\x12(\n" +
+	"\x0fpiggyBackEvents\x18\x04 \x01(\rR\x0fpiggyBackEvents\x12\x1e\n" +
+	"\n" +
+	"toneEvents\x18\x05 \x01(\rR\n" +
+	"toneEvents\x12\x1e\n" +
+	"\n" +
+	"dtmfEvents\x18\x06 \x01(\rR\n" +
+	"dtmfEvents\x12\x1c\n" +
+	"\tcasEvents\x18\a \x01(\rR\tcasEvents\"\xc3\x02\n" +
+	"\vPptpPotsUni\x12\x10\n" +
+	"\x03arc\x18\x01 \x01(\tR\x03arc\x12 \n" +
+	"\varcInterval\x18\x02 \x01(\tR\varcInterval\x12\x1c\n" +
+	"\timpedance\x18\x03 \x01(\rR\timpedance\x12*\n" +
+	"\x10transmissionPath\x18\x04 \x01(\rR\x10transmissionPath\x12\x16\n" +
+	"\x06rxGain\x18\x05 \x01(\x11R\x06rxGain\x12\x16\n" +
+	"\x06txGain\x18\x06 \x01(\x11R\x06txGain\x12*\n" +
+	"\x10potsHoldOverTime\x18\a \x01(\rR\x10potsHoldOverTime\x12.\n" +
+	"\x12nominalFeedVoltage\x18\b \x01(\rR\x12nominalFeedVoltage\x12*\n" +
+	"\x10lossOfSoftSwitch\x18\t \x01(\rR\x10lossOfSoftSwitch\"\xcb\x03\n" +
+	"\tSipConfig\x12B\n" +
+	"\vsipUserData\x18\x01 \x01(\v2 .voip_system_profile.SipUserDataR\vsipUserData\x12K\n" +
+	"\x0esipAgentConfig\x18\x02 \x01(\v2#.voip_system_profile.SipAgentConfigR\x0esipAgentConfig\x12N\n" +
+	"\x0fnetworkDialPlan\x18\x03 \x01(\v2$.voip_system_profile.NetworkDialPlanR\x0fnetworkDialPlan\x12c\n" +
+	"\x16voipFeatureAccessCodes\x18\x04 \x01(\v2+.voip_system_profile.VoipFeatureAccessCodesR\x16voipFeatureAccessCodes\x12x\n" +
+	"\x1dvoipApplicationServiceProfile\x18\x05 \x01(\v22.voip_system_profile.VoipApplicationServiceProfileR\x1dvoipApplicationServiceProfile\"\xd3\x02\n" +
+	"\vSipUserData\x12 \n" +
+	"\vuserPartAor\x18\x01 \x01(\tR\vuserPartAor\x12Z\n" +
+	"\x13usernameAndPassword\x18\x02 \x01(\v2(.voip_system_profile.UsernameAndPasswordR\x13usernameAndPassword\x124\n" +
+	"\x15voicemailServerSipUri\x18\x03 \x01(\tR\x15voicemailServerSipUri\x12P\n" +
+	"#voicemailSubscriptionExpirationTime\x18\x04 \x01(\x05R#voicemailSubscriptionExpirationTime\x12\"\n" +
+	"\freleaseTimer\x18\x05 \x01(\x05R\freleaseTimer\x12\x1a\n" +
+	"\brohTimer\x18\x06 \x01(\x05R\brohTimer\"\xa3\x04\n" +
+	"\x0eSipAgentConfig\x122\n" +
+	"\x14outboundProxyAddress\x18\x01 \x01(\tR\x14outboundProxyAddress\x12$\n" +
+	"\rprimarySipDns\x18\x02 \x01(\tR\rprimarySipDns\x12(\n" +
+	"\x0fsecondarySipDns\x18\x03 \x01(\tR\x0fsecondarySipDns\x12$\n" +
+	"\rsipRegExpTime\x18\x04 \x01(\x05R\rsipRegExpTime\x124\n" +
+	"\x15sipReregHeadStartTime\x18\x05 \x01(\x05R\x15sipReregHeadStartTime\x12\"\n" +
+	"\fSipRegistrar\x18\x06 \x01(\tR\fSipRegistrar\x12\x1e\n" +
+	"\n" +
+	"softSwitch\x18\a \x01(\tR\n" +
+	"softSwitch\x12Q\n" +
+	"\x10sipResponseTable\x18\b \x01(\v2%.voip_system_profile.SipResponseTableR\x10sipResponseTable\x12:\n" +
+	"\x18sipOptionTransmitControl\x18\t \x01(\bR\x18sipOptionTransmitControl\x12\"\n" +
+	"\fsipUriFormat\x18\n" +
+	" \x01(\tR\fsipUriFormat\x12:\n" +
+	"\x18redundantSipAgentPointer\x18\v \x01(\tR\x18redundantSipAgentPointer\"\xe5\x01\n" +
+	"\x0fNetworkDialPlan\x120\n" +
+	"\x13criticalDialTimeout\x18\x01 \x01(\rR\x13criticalDialTimeout\x12.\n" +
+	"\x12partialDialTimeout\x18\x02 \x01(\rR\x12partialDialTimeout\x12&\n" +
+	"\x0edialPlanFormat\x18\x03 \x01(\rR\x0edialPlanFormat\x12H\n" +
+	"\rdialPlanTable\x18\x04 \x01(\v2\".voip_system_profile.DialPlanTableR\rdialPlanTable\"A\n" +
+	"\x13UsernameAndPassword\x12*\n" +
+	"\x10validationScheme\x18\x01 \x01(\x05R\x10validationScheme\"r\n" +
+	"\x10SipResponseTable\x12(\n" +
+	"\x0fsipResponseCode\x18\x01 \x01(\tR\x0fsipResponseCode\x12\x12\n" +
+	"\x04tone\x18\x02 \x01(\tR\x04tone\x12 \n" +
+	"\vtextMessage\x18\x03 \x01(\tR\vtextMessage\"\xa1\x01\n" +
+	"\rDialPlanTable\x12\x1e\n" +
+	"\n" +
+	"dialPlanId\x18\x01 \x01(\rR\n" +
+	"dialPlanId\x12\x16\n" +
+	"\x06action\x18\x02 \x01(\rR\x06action\x12$\n" +
+	"\rdialPlanToken\x18\x03 \x01(\tR\rdialPlanToken\x122\n" +
+	"\x14dialPlanTableMaxSize\x18\x04 \x01(\rR\x14dialPlanTableMaxSize\"\xd2\x04\n" +
+	"\x16VoipFeatureAccessCodes\x12,\n" +
+	"\x11cancelCallWaiting\x18\x01 \x01(\tR\x11cancelCallWaiting\x12\x1a\n" +
+	"\bcallHold\x18\x02 \x01(\tR\bcallHold\x12\x1a\n" +
+	"\bcallPark\x18\x03 \x01(\tR\bcallPark\x12*\n" +
+	"\x10callerIdActivate\x18\x04 \x01(\tR\x10callerIdActivate\x12.\n" +
+	"\x12callerIdDeactivate\x18\x05 \x01(\tR\x12callerIdDeactivate\x126\n" +
+	"\x16doNotDisturbActivation\x18\x06 \x01(\tR\x16doNotDisturbActivation\x12:\n" +
+	"\x18doNotDisturbDeactivation\x18\a \x01(\tR\x18doNotDisturbDeactivation\x124\n" +
+	"\x15doNotDisturbPinChange\x18\b \x01(\tR\x15doNotDisturbPinChange\x126\n" +
+	"\x16emergencyServiceNumber\x18\t \x01(\tR\x16emergencyServiceNumber\x12(\n" +
+	"\x0fintercomService\x18\n" +
+	" \x01(\tR\x0fintercomService\x126\n" +
+	"\x16unattendedCallTransfer\x18\v \x01(\tR\x16unattendedCallTransfer\x122\n" +
+	"\x14attendedCallTransfer\x18\f \x01(\tR\x14attendedCallTransfer\"\x97\x04\n" +
+	"\x1dVoipApplicationServiceProfile\x12 \n" +
+	"\vcidFeatures\x18\x01 \x01(\rR\vcidFeatures\x120\n" +
+	"\x13callWaitingFeatures\x18\x02 \x01(\rR\x13callWaitingFeatures\x12F\n" +
+	"\x1ecallProgressOrTransferFeatures\x18\x03 \x01(\rR\x1ecallProgressOrTransferFeatures\x12:\n" +
+	"\x18callPresentationFeatures\x18\x04 \x01(\rR\x18callPresentationFeatures\x122\n" +
+	"\x14directConnectFeature\x18\x05 \x01(\rR\x14directConnectFeature\x128\n" +
+	"\x17directConnectUriPointer\x18\x06 \x01(\tR\x17directConnectUriPointer\x12>\n" +
+	"\x1abridgedLineAgentUriPointer\x18\a \x01(\tR\x1abridgedLineAgentUriPointer\x12@\n" +
+	"\x1bconferenceFactoryUriPointer\x18\b \x01(\tR\x1bconferenceFactoryUriPointer\x12.\n" +
+	"\x12dialToneDelayTimer\x18\t \x01(\rR\x12dialToneDelayTimerBf\n" +
+	"'org.opencord.voltha.voip_system_profileZ;github.com/opencord/voltha-protos/v5/go/voip_system_profileb\x06proto3"
+
+var (
+	file_voltha_protos_voip_system_profile_proto_rawDescOnce sync.Once
+	file_voltha_protos_voip_system_profile_proto_rawDescData []byte
+)
+
+func file_voltha_protos_voip_system_profile_proto_rawDescGZIP() []byte {
+	file_voltha_protos_voip_system_profile_proto_rawDescOnce.Do(func() {
+		file_voltha_protos_voip_system_profile_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_voip_system_profile_proto_rawDesc), len(file_voltha_protos_voip_system_profile_proto_rawDesc)))
+	})
+	return file_voltha_protos_voip_system_profile_proto_rawDescData
 }
 
-func init() {
-	proto.RegisterFile("voltha_protos/voip_system_profile.proto", fileDescriptor_02a00a136081bca5)
+var file_voltha_protos_voip_system_profile_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
+var file_voltha_protos_voip_system_profile_proto_goTypes = []any{
+	(*VoipSystemProfileRequest)(nil),      // 0: voip_system_profile.VoipSystemProfileRequest
+	(*VoipSystemProfile)(nil),             // 1: voip_system_profile.VoipSystemProfile
+	(*VoipConfig)(nil),                    // 2: voip_system_profile.VoipConfig
+	(*IpHostConfig)(nil),                  // 3: voip_system_profile.IpHostConfig
+	(*TcpUdpConfig)(nil),                  // 4: voip_system_profile.TcpUdpConfig
+	(*VoipVoiceCtp)(nil),                  // 5: voip_system_profile.VoipVoiceCtp
+	(*VoipMediaProfile)(nil),              // 6: voip_system_profile.VoipMediaProfile
+	(*VoiceServiceProfile)(nil),           // 7: voip_system_profile.VoiceServiceProfile
+	(*RtpProfile)(nil),                    // 8: voip_system_profile.RtpProfile
+	(*PptpPotsUni)(nil),                   // 9: voip_system_profile.PptpPotsUni
+	(*SipConfig)(nil),                     // 10: voip_system_profile.SipConfig
+	(*SipUserData)(nil),                   // 11: voip_system_profile.SipUserData
+	(*SipAgentConfig)(nil),                // 12: voip_system_profile.SipAgentConfig
+	(*NetworkDialPlan)(nil),               // 13: voip_system_profile.NetworkDialPlan
+	(*UsernameAndPassword)(nil),           // 14: voip_system_profile.UsernameAndPassword
+	(*SipResponseTable)(nil),              // 15: voip_system_profile.SipResponseTable
+	(*DialPlanTable)(nil),                 // 16: voip_system_profile.DialPlanTable
+	(*VoipFeatureAccessCodes)(nil),        // 17: voip_system_profile.VoipFeatureAccessCodes
+	(*VoipApplicationServiceProfile)(nil), // 18: voip_system_profile.VoipApplicationServiceProfile
+}
+var file_voltha_protos_voip_system_profile_proto_depIdxs = []int32{
+	1,  // 0: voip_system_profile.VoipSystemProfileRequest.voipSystemProfile:type_name -> voip_system_profile.VoipSystemProfile
+	10, // 1: voip_system_profile.VoipSystemProfile.sipConfig:type_name -> voip_system_profile.SipConfig
+	2,  // 2: voip_system_profile.VoipSystemProfile.voipConfig:type_name -> voip_system_profile.VoipConfig
+	3,  // 3: voip_system_profile.VoipConfig.ipHostConfig:type_name -> voip_system_profile.IpHostConfig
+	4,  // 4: voip_system_profile.VoipConfig.tcpUdpConfig:type_name -> voip_system_profile.TcpUdpConfig
+	5,  // 5: voip_system_profile.VoipConfig.voipVoiceCtp:type_name -> voip_system_profile.VoipVoiceCtp
+	6,  // 6: voip_system_profile.VoipConfig.voipMediaProfile:type_name -> voip_system_profile.VoipMediaProfile
+	7,  // 7: voip_system_profile.VoipConfig.voiceServiceProfile:type_name -> voip_system_profile.VoiceServiceProfile
+	8,  // 8: voip_system_profile.VoipConfig.rtpProfile:type_name -> voip_system_profile.RtpProfile
+	9,  // 9: voip_system_profile.VoipConfig.pptpPotsUni:type_name -> voip_system_profile.PptpPotsUni
+	11, // 10: voip_system_profile.SipConfig.sipUserData:type_name -> voip_system_profile.SipUserData
+	12, // 11: voip_system_profile.SipConfig.sipAgentConfig:type_name -> voip_system_profile.SipAgentConfig
+	13, // 12: voip_system_profile.SipConfig.networkDialPlan:type_name -> voip_system_profile.NetworkDialPlan
+	17, // 13: voip_system_profile.SipConfig.voipFeatureAccessCodes:type_name -> voip_system_profile.VoipFeatureAccessCodes
+	18, // 14: voip_system_profile.SipConfig.voipApplicationServiceProfile:type_name -> voip_system_profile.VoipApplicationServiceProfile
+	14, // 15: voip_system_profile.SipUserData.usernameAndPassword:type_name -> voip_system_profile.UsernameAndPassword
+	15, // 16: voip_system_profile.SipAgentConfig.sipResponseTable:type_name -> voip_system_profile.SipResponseTable
+	16, // 17: voip_system_profile.NetworkDialPlan.dialPlanTable:type_name -> voip_system_profile.DialPlanTable
+	18, // [18:18] is the sub-list for method output_type
+	18, // [18:18] is the sub-list for method input_type
+	18, // [18:18] is the sub-list for extension type_name
+	18, // [18:18] is the sub-list for extension extendee
+	0,  // [0:18] is the sub-list for field type_name
 }
 
-var fileDescriptor_02a00a136081bca5 = []byte{
-	// 2057 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0x5f, 0x73, 0x1b, 0x49,
-	0x11, 0x2f, 0x3b, 0x4e, 0x2e, 0x1a, 0xdb, 0xf9, 0x33, 0x81, 0xa0, 0x0a, 0x77, 0x21, 0xec, 0x1d,
-	0x77, 0x29, 0xfe, 0xd8, 0x60, 0x9b, 0x2b, 0x0a, 0x28, 0xc0, 0xb1, 0x62, 0xe2, 0xe2, 0x9c, 0x88,
-	0x95, 0x63, 0xaa, 0xee, 0xe5, 0x6a, 0x3c, 0xdb, 0x5a, 0x0d, 0xde, 0x9d, 0x59, 0x66, 0x46, 0x8a,
-	0xc4, 0x23, 0x9f, 0x80, 0xa2, 0x0a, 0x78, 0xa6, 0xf8, 0x28, 0x3c, 0xf2, 0x06, 0x9f, 0x81, 0x4f,
-	0xc0, 0x0b, 0x8f, 0x54, 0xcf, 0xcc, 0x4a, 0xbb, 0xda, 0x5d, 0xc3, 0x9b, 0xe6, 0xf7, 0xeb, 0x6e,
-	0xb5, 0xba, 0x7b, 0xba, 0x7b, 0x44, 0x3e, 0x99, 0xa9, 0xcc, 0x4e, 0xd8, 0x17, 0x85, 0x56, 0x56,
-	0x99, 0xfd, 0x99, 0x12, 0xc5, 0x17, 0x66, 0x61, 0x2c, 0xe4, 0x08, 0x8d, 0x45, 0x06, 0x7b, 0x8e,
-	0xa2, 0x8f, 0x5a, 0xa8, 0x27, 0xef, 0xa7, 0x4a, 0xa5, 0x19, 0xec, 0xb3, 0x42, 0xec, 0x33, 0x29,
-	0x95, 0x65, 0x56, 0x28, 0x69, 0xbc, 0x4a, 0xf4, 0xbb, 0x0d, 0xd2, 0xbf, 0x54, 0xa2, 0x18, 0x39,
-	0xa5, 0xa1, 0xd7, 0x89, 0xe1, 0x37, 0x53, 0x30, 0x96, 0x3e, 0x20, 0xb7, 0xae, 0x61, 0xd1, 0xdf,
-	0x78, 0xb6, 0xf1, 0xbc, 0x17, 0xe3, 0x47, 0x7a, 0x41, 0x1e, 0xce, 0xd6, 0xa5, 0xfb, 0x9b, 0xcf,
-	0x36, 0x9e, 0x6f, 0x1f, 0x7c, 0xbc, 0xd7, 0xe6, 0x58, 0xd3, 0x76, 0xd3, 0x40, 0xf4, 0x87, 0x0d,
-	0xf2, 0xb0, 0x21, 0x48, 0x7f, 0x4c, 0x7a, 0x46, 0x14, 0x27, 0x4a, 0x8e, 0x45, 0xea, 0x7c, 0xd8,
-	0x3e, 0x78, 0xda, 0xfa, 0x1d, 0xa3, 0x52, 0x2a, 0x5e, 0x29, 0xd0, 0x9f, 0x12, 0x82, 0xb2, 0x41,
-	0xdd, 0xbb, 0xf8, 0xb5, 0x4e, 0x17, 0x83, 0x7e, 0x45, 0x25, 0xfa, 0xe3, 0x16, 0x21, 0x2b, 0x8a,
-	0xbe, 0x24, 0x3b, 0xa2, 0x78, 0xa5, 0x8c, 0xad, 0x39, 0xf4, 0xf5, 0x56, 0x8b, 0x67, 0x15, 0xc1,
-	0xb8, 0xa6, 0x86, 0x66, 0x2c, 0x2f, 0xde, 0x26, 0x75, 0xc7, 0xda, 0xcd, 0x5c, 0x54, 0x04, 0xe3,
-	0x9a, 0x1a, 0x9a, 0x41, 0x8d, 0x4b, 0x25, 0x38, 0x9c, 0xd8, 0xa2, 0x7f, 0xeb, 0x06, 0x33, 0x97,
-	0x15, 0xc1, 0xb8, 0xa6, 0x46, 0x7f, 0x49, 0x1e, 0xe0, 0xf9, 0x1c, 0x12, 0xc1, 0xca, 0x6c, 0x6e,
-	0x39, 0x53, 0xdf, 0xe8, 0x34, 0x55, 0x15, 0x8e, 0x1b, 0xea, 0xf4, 0x73, 0x82, 0x55, 0xc8, 0x61,
-	0x04, 0x7a, 0x26, 0x38, 0x94, 0x56, 0x6f, 0x3b, 0xab, 0xcf, 0xbb, 0xac, 0xae, 0xcb, 0xc7, 0x6d,
-	0x46, 0x30, 0xa7, 0xda, 0x16, 0xa5, 0xc9, 0x3b, 0x37, 0xe4, 0x34, 0x5e, 0x8a, 0xc5, 0x15, 0x15,
-	0xfa, 0x82, 0x6c, 0x17, 0x85, 0x2d, 0x86, 0xca, 0x9a, 0xb7, 0x52, 0xf4, 0xdf, 0x73, 0x16, 0x9e,
-	0xb5, 0x5a, 0x18, 0xae, 0xe4, 0xe2, 0xaa, 0x52, 0xf4, 0xfb, 0x4d, 0xb2, 0x53, 0x4d, 0x30, 0x7d,
-	0x9f, 0xf4, 0x44, 0xf1, 0xa6, 0x70, 0xb7, 0xca, 0x95, 0xc5, 0x6e, 0xbc, 0x02, 0xe8, 0x47, 0x64,
-	0x57, 0xc9, 0xe9, 0x59, 0x02, 0xd2, 0x8a, 0xb1, 0x00, 0xed, 0x32, 0xde, 0x8b, 0xeb, 0xa0, 0xb7,
-	0x71, 0x9c, 0x24, 0x1a, 0x8c, 0x71, 0xc9, 0xec, 0xc5, 0x2b, 0x80, 0x52, 0xb2, 0x95, 0x33, 0x73,
-	0xed, 0x52, 0xd3, 0x8b, 0xdd, 0x67, 0xda, 0x27, 0xef, 0xa5, 0xcc, 0xc2, 0x3b, 0xb6, 0x70, 0xb1,
-	0xed, 0xc5, 0xe5, 0x91, 0x3e, 0x25, 0xa4, 0xd0, 0x22, 0x67, 0x7a, 0x31, 0x90, 0xc6, 0x45, 0xa9,
-	0x17, 0x57, 0x10, 0x1a, 0x91, 0x1d, 0x03, 0x5c, 0xc9, 0x24, 0x48, 0xbc, 0xe7, 0x24, 0x6a, 0x18,
-	0xfd, 0x36, 0x79, 0xa8, 0x21, 0x63, 0x8b, 0xe3, 0x14, 0xa4, 0x2d, 0x7f, 0xdb, 0x5d, 0x27, 0xd8,
-	0x24, 0xa2, 0x53, 0xb2, 0x53, 0xad, 0x55, 0xfa, 0x84, 0xdc, 0x75, 0xdd, 0x85, 0xab, 0x2c, 0x04,
-	0x64, 0x79, 0x46, 0xce, 0x2a, 0x73, 0x2a, 0x20, 0x4b, 0x42, 0x28, 0x96, 0xe7, 0xe8, 0x53, 0xb2,
-	0x53, 0x2d, 0x56, 0xfa, 0x31, 0xb9, 0x67, 0x44, 0x2a, 0x59, 0x96, 0x09, 0x99, 0x9e, 0xa8, 0x04,
-	0x82, 0xb5, 0x35, 0x34, 0xfa, 0xd3, 0x6d, 0xf2, 0x60, 0xbd, 0x34, 0x31, 0x40, 0x63, 0x36, 0x3f,
-	0x5f, 0x69, 0x95, 0x47, 0xfa, 0x9c, 0xdc, 0xe7, 0x2a, 0x01, 0x3e, 0x82, 0x0c, 0x38, 0xfe, 0x82,
-	0xef, 0x39, 0x4f, 0x76, 0xe3, 0x75, 0x98, 0x7e, 0x4a, 0x1e, 0x17, 0x8c, 0x5f, 0x83, 0x1d, 0x82,
-	0x16, 0x2a, 0xa9, 0x28, 0xdc, 0x72, 0x0a, 0x1d, 0x2c, 0xfd, 0x2e, 0x79, 0x64, 0x44, 0x06, 0x92,
-	0xc3, 0x68, 0x5a, 0x14, 0x98, 0x43, 0xa7, 0xb4, 0xe5, 0x94, 0xda, 0xa8, 0xa6, 0x4f, 0x07, 0x2e,
-	0xad, 0x0d, 0x9f, 0x0e, 0x3a, 0x7d, 0x3a, 0x70, 0xa9, 0xee, 0xf2, 0xe9, 0xa0, 0xdd, 0xa7, 0x03,
-	0x97, 0xfd, 0x56, 0x9f, 0x0e, 0x9a, 0x3e, 0x1d, 0xba, 0x12, 0x68, 0xf8, 0x74, 0xd8, 0xe9, 0xd3,
-	0x61, 0xbf, 0x77, 0x83, 0x4f, 0x87, 0xed, 0x3e, 0x1d, 0xf6, 0x49, 0x97, 0x4f, 0x87, 0x4d, 0x9f,
-	0x8e, 0xfa, 0xdb, 0x6d, 0x3e, 0x1d, 0x75, 0xfa, 0x74, 0xd4, 0xdf, 0xb9, 0xc1, 0xa7, 0xa3, 0x76,
-	0x9f, 0x8e, 0xfa, 0xbb, 0x5d, 0x3e, 0x1d, 0x61, 0xa5, 0x29, 0x75, 0x35, 0xb0, 0xf9, 0xb8, 0x7f,
-	0xcf, 0x57, 0x5a, 0x38, 0x46, 0xff, 0xde, 0x24, 0x8f, 0x5a, 0xba, 0x1b, 0xfd, 0x26, 0x79, 0x80,
-	0xa3, 0x78, 0x2a, 0x39, 0xe4, 0x20, 0xed, 0xc5, 0xa2, 0x28, 0x8b, 0xb4, 0x81, 0xe3, 0x75, 0xfd,
-	0xb5, 0xb0, 0x16, 0xf4, 0x05, 0xd3, 0x29, 0xd8, 0x50, 0xaa, 0x35, 0x0c, 0xa3, 0xe2, 0xcf, 0x2f,
-	0xa6, 0xe3, 0x31, 0xe8, 0x73, 0x36, 0x0f, 0x05, 0xba, 0x0e, 0x63, 0x3b, 0x02, 0x3e, 0x51, 0x27,
-	0x4c, 0x72, 0xc8, 0xce, 0x64, 0xe2, 0x6a, 0xf2, 0x6e, 0x5c, 0x07, 0x31, 0x06, 0x85, 0xb1, 0x72,
-	0x18, 0x2e, 0xed, 0x25, 0xd3, 0x82, 0x49, 0x1b, 0x2a, 0xb2, 0x8d, 0x42, 0x0f, 0x12, 0x9b, 0x8f,
-	0x07, 0x22, 0x15, 0xf6, 0x33, 0x98, 0x41, 0x66, 0x42, 0x39, 0xae, 0xc3, 0xd8, 0x5a, 0x96, 0xd0,
-	0x60, 0xaa, 0xdd, 0x36, 0x12, 0xaa, 0xb0, 0x49, 0xd0, 0x03, 0xf2, 0xa5, 0x89, 0x52, 0xd7, 0xa7,
-	0x19, 0x33, 0x93, 0x73, 0x21, 0x45, 0x3e, 0xcd, 0x2f, 0x44, 0x0e, 0xa1, 0x10, 0x5b, 0xb9, 0xe8,
-	0x3f, 0x1b, 0x84, 0xac, 0x06, 0x00, 0x06, 0x30, 0x53, 0x9c, 0x65, 0x43, 0xa5, 0xed, 0xb9, 0x90,
-	0x21, 0xd0, 0x35, 0xac, 0x2e, 0xc3, 0xe6, 0x65, 0x90, 0xab, 0x18, 0x76, 0xae, 0xc4, 0xf0, 0xe2,
-	0x9c, 0xe9, 0xeb, 0xd0, 0xa2, 0x97, 0x67, 0xfc, 0xf9, 0x85, 0x48, 0xd3, 0xc5, 0x0b, 0xc6, 0xaf,
-	0x5f, 0xce, 0x40, 0x5a, 0x13, 0x2e, 0xfb, 0x3a, 0x8c, 0xdd, 0xd9, 0x2a, 0x09, 0x41, 0xc8, 0x47,
-	0xb4, 0x82, 0x20, 0x8f, 0x51, 0x08, 0xbc, 0x8f, 0x61, 0x05, 0xc1, 0x49, 0xc1, 0x99, 0x09, 0xb4,
-	0x0f, 0xdb, 0x0a, 0x88, 0xfe, 0xb6, 0x49, 0xb6, 0x2b, 0x93, 0x0b, 0x37, 0x38, 0xa6, 0x79, 0xb9,
-	0xc1, 0x31, 0xcd, 0xe9, 0x33, 0xb2, 0xcd, 0x34, 0x3f, 0x93, 0x16, 0xf4, 0x8c, 0x65, 0xa1, 0x05,
-	0x57, 0x21, 0x37, 0x8b, 0xf2, 0x02, 0x12, 0xac, 0x86, 0x50, 0x46, 0x2b, 0x00, 0x4b, 0xd7, 0x6a,
-	0x26, 0x4d, 0x2e, 0x5c, 0xf5, 0x0f, 0x99, 0x9d, 0x84, 0x9f, 0xda, 0xc0, 0xe9, 0x63, 0x72, 0x47,
-	0xcf, 0x7f, 0xce, 0x84, 0x74, 0xbf, 0xf3, 0x61, 0x1c, 0x4e, 0x88, 0x5b, 0x8f, 0xdf, 0xf1, 0xb8,
-	0x3f, 0xa1, 0xed, 0x42, 0x59, 0xf3, 0x4a, 0x65, 0xc9, 0x9b, 0x19, 0x68, 0x97, 0x68, 0xff, 0x13,
-	0x1b, 0x38, 0xdd, 0x23, 0x54, 0xaa, 0x5c, 0x48, 0x96, 0x9d, 0x02, 0x24, 0x97, 0x2a, 0xb3, 0x2c,
-	0x2d, 0xcb, 0xa2, 0x85, 0x41, 0xdb, 0x99, 0x32, 0xe6, 0xcd, 0x78, 0xa4, 0xc6, 0x76, 0xf4, 0x4e,
-	0x58, 0x3e, 0x09, 0xcd, 0xa9, 0x81, 0x47, 0x7f, 0xbf, 0x45, 0x7a, 0xcb, 0xa5, 0x12, 0x97, 0x06,
-	0x23, 0x8a, 0xb7, 0x06, 0xf4, 0x80, 0x59, 0x16, 0x16, 0xbf, 0x67, 0x5d, 0x9b, 0x68, 0x29, 0x17,
-	0x57, 0x95, 0xe8, 0x2f, 0x70, 0x92, 0x15, 0x6e, 0x68, 0xd6, 0x16, 0xbf, 0x0f, 0xbb, 0xcc, 0x54,
-	0x44, 0xe3, 0x35, 0x55, 0xfa, 0x9a, 0xdc, 0x97, 0x60, 0xdf, 0x29, 0x7d, 0x3d, 0x10, 0x2c, 0x1b,
-	0x66, 0x4c, 0x86, 0xfd, 0xef, 0xa3, 0x56, 0x6b, 0xaf, 0xeb, 0xb2, 0xf1, 0xba, 0x32, 0xe5, 0xe4,
-	0x31, 0xea, 0x9d, 0x02, 0xb3, 0x53, 0x0d, 0xc7, 0x9c, 0x83, 0x31, 0x38, 0x57, 0x4d, 0xd8, 0x05,
-	0xbf, 0xd5, 0xb9, 0x0b, 0x36, 0x55, 0xe2, 0x0e, 0x53, 0x74, 0x4e, 0x3e, 0x40, 0xe6, 0xb8, 0x28,
-	0x32, 0xc1, 0xdd, 0xdd, 0x6e, 0xdd, 0x10, 0x0f, 0x3a, 0xbf, 0xab, 0x53, 0x33, 0xbe, 0xd9, 0x70,
-	0xf4, 0xcf, 0x4d, 0xb2, 0x5d, 0x49, 0x0c, 0xde, 0x80, 0xa9, 0x01, 0x3d, 0x64, 0xda, 0x1e, 0x2b,
-	0x1d, 0xee, 0x46, 0x15, 0xc2, 0x1d, 0x16, 0x8f, 0x92, 0xe5, 0x70, 0x2c, 0x93, 0x21, 0x33, 0xe6,
-	0x9d, 0xd2, 0x49, 0x48, 0x59, 0xfb, 0x0e, 0xfb, 0xb6, 0x29, 0x1f, 0xb7, 0x19, 0xa1, 0x47, 0xe4,
-	0xcb, 0x6e, 0xb5, 0xcd, 0x99, 0xc8, 0xd0, 0x51, 0xd0, 0xe8, 0x9b, 0x16, 0xa1, 0xa5, 0xb4, 0x93,
-	0x74, 0x48, 0x3e, 0x5c, 0x11, 0xd3, 0x2b, 0xc3, 0xb5, 0x70, 0xbb, 0xd7, 0xcb, 0x79, 0x21, 0x7c,
-	0xa7, 0x74, 0x97, 0x05, 0xf3, 0x75, 0x3b, 0xfe, 0x7f, 0x44, 0xb1, 0xe3, 0x69, 0xc8, 0x80, 0x19,
-	0xc0, 0xa3, 0x76, 0xe1, 0xbf, 0x1d, 0xd7, 0x30, 0xec, 0x78, 0x5a, 0x4d, 0x3c, 0x7f, 0xc7, 0xf1,
-	0xcb, 0x73, 0xf4, 0xd7, 0x2d, 0x72, 0xaf, 0x5e, 0xa7, 0xd8, 0xab, 0xd5, 0xd4, 0x5e, 0xa9, 0xa9,
-	0x4c, 0x86, 0x5a, 0xcd, 0x17, 0xe5, 0x3e, 0xeb, 0x23, 0xdc, 0xca, 0xe1, 0x3c, 0x0a, 0xab, 0xe9,
-	0x48, 0x14, 0xb8, 0x8d, 0x86, 0xf5, 0xb8, 0x06, 0x62, 0x7b, 0x5d, 0xae, 0xa7, 0x41, 0xce, 0x87,
-	0x6b, 0x1d, 0x46, 0x7b, 0x46, 0x14, 0x31, 0xa4, 0x2f, 0xe7, 0x45, 0x25, 0x24, 0x75, 0x10, 0x93,
-	0xe0, 0x00, 0x0d, 0xe9, 0x2b, 0x60, 0xc9, 0xc8, 0x32, 0x6d, 0x9d, 0xb4, 0x8f, 0x42, 0x3b, 0x89,
-	0x21, 0x1b, 0x39, 0x33, 0xc2, 0x58, 0xcd, 0x74, 0x58, 0xad, 0x6b, 0x18, 0xb6, 0x6f, 0xb3, 0x6a,
-	0x30, 0x7e, 0xb5, 0xae, 0x20, 0xf8, 0xe2, 0x72, 0xc6, 0x4d, 0xa1, 0xa4, 0x81, 0x0b, 0x76, 0x95,
-	0xf9, 0xa6, 0xd5, 0xf5, 0xe2, 0x1a, 0xad, 0x09, 0xc7, 0x0d, 0x75, 0xfa, 0x43, 0xd2, 0x37, 0xe5,
-	0x7b, 0xe3, 0xc2, 0xb7, 0x60, 0xcc, 0x88, 0xd5, 0x2a, 0x73, 0x1d, 0xee, 0x6e, 0xdc, 0xc9, 0xbb,
-	0xb7, 0x80, 0xab, 0xb0, 0x53, 0xa5, 0x73, 0x66, 0xdd, 0xe6, 0x85, 0x6f, 0x81, 0x0a, 0x86, 0xf6,
-	0x35, 0x24, 0x53, 0x99, 0x30, 0x69, 0xcb, 0x8c, 0x0f, 0x95, 0xc0, 0x71, 0xe1, 0x76, 0xaf, 0x5e,
-	0xdc, 0xc9, 0x47, 0xff, 0xda, 0x20, 0xf7, 0xd7, 0xfa, 0x0f, 0x2e, 0x17, 0x5c, 0x0b, 0x2b, 0x38,
-	0xcb, 0x10, 0xc3, 0xd0, 0xaa, 0xa9, 0x0d, 0x63, 0xb9, 0x8d, 0xc2, 0x5e, 0x5f, 0x30, 0x6d, 0x45,
-	0x5d, 0xc1, 0xcf, 0xe8, 0x16, 0x06, 0xdf, 0x0d, 0x49, 0xf8, 0xb6, 0xf0, 0xbb, 0xfc, 0x18, 0x5b,
-	0x43, 0xe9, 0x2b, 0xb2, 0x5b, 0x22, 0x3e, 0x13, 0xbe, 0xdf, 0x45, 0xad, 0x99, 0x18, 0x54, 0x25,
-	0xe3, 0xba, 0x62, 0x74, 0x4c, 0x1e, 0xb5, 0x74, 0x00, 0x1c, 0x3a, 0x33, 0x96, 0x89, 0xc4, 0xb7,
-	0x25, 0x3e, 0x81, 0xdc, 0xef, 0x79, 0xb7, 0xe3, 0x06, 0x1e, 0x69, 0xf2, 0x60, 0x3d, 0xd9, 0xae,
-	0xee, 0x57, 0xd8, 0xf2, 0x05, 0x84, 0x75, 0x5f, 0x87, 0xf1, 0x89, 0x88, 0x4b, 0x44, 0xb8, 0x3e,
-	0xee, 0x33, 0x36, 0x3a, 0x0b, 0x73, 0x7b, 0x0e, 0xc6, 0xe0, 0x6c, 0xf4, 0x37, 0xa6, 0x0a, 0x45,
-	0x7f, 0xd9, 0x20, 0xbb, 0xb5, 0xdf, 0xe5, 0xd6, 0x8f, 0x00, 0x9c, 0x25, 0x21, 0x27, 0x15, 0x04,
-	0x47, 0x37, 0x73, 0x8b, 0x72, 0x08, 0x7f, 0x38, 0xe1, 0xbd, 0x5b, 0x46, 0x44, 0x5d, 0x83, 0x0c,
-	0xdf, 0x56, 0x07, 0xb1, 0x43, 0xd4, 0xe2, 0x76, 0xce, 0xe6, 0x23, 0xf1, 0x5b, 0x08, 0x0b, 0x44,
-	0x2b, 0x17, 0xfd, 0x63, 0x8b, 0x3c, 0x6e, 0x9f, 0x35, 0xb8, 0x4a, 0x72, 0xb7, 0xb3, 0x9e, 0xb0,
-	0x2c, 0xfb, 0x15, 0x13, 0x56, 0xc8, 0x34, 0x04, 0xa8, 0x49, 0x60, 0x37, 0xe3, 0x2c, 0xcb, 0x70,
-	0x8b, 0x28, 0x5f, 0x9e, 0xe5, 0xb9, 0xe4, 0x86, 0x95, 0xdd, 0xae, 0x3c, 0x63, 0x12, 0xf1, 0x33,
-	0xe8, 0xb3, 0xe4, 0x98, 0x5b, 0x31, 0x63, 0x16, 0xc2, 0x4b, 0xbc, 0x81, 0x63, 0xa5, 0x96, 0xd8,
-	0x00, 0x58, 0x29, 0xed, 0x1f, 0xe8, 0x2d, 0x0c, 0x3e, 0x52, 0x12, 0xf5, 0x5a, 0xd9, 0x81, 0x30,
-	0x76, 0xaa, 0xaf, 0x82, 0x1d, 0x0c, 0xaf, 0x6f, 0x2e, 0x1d, 0x2c, 0xde, 0xc9, 0x2a, 0xb3, 0xb4,
-	0x58, 0xee, 0xd2, 0xbd, 0xb8, 0x93, 0xc7, 0xe6, 0x57, 0xe5, 0x86, 0x42, 0x9e, 0x4c, 0x98, 0x0c,
-	0xcb, 0x53, 0x2f, 0x6e, 0x27, 0xd1, 0x53, 0xc8, 0x41, 0xa7, 0x20, 0xf9, 0x22, 0x0c, 0xd8, 0xd7,
-	0xd3, 0xfc, 0x0a, 0xb4, 0xeb, 0x31, 0xbd, 0xb8, 0x83, 0xc5, 0x12, 0x76, 0xad, 0x80, 0xab, 0x3c,
-	0x10, 0xa1, 0xc9, 0xac, 0xc3, 0xf8, 0x0d, 0x53, 0xc9, 0xac, 0x05, 0x99, 0x40, 0x82, 0x89, 0x73,
-	0xcd, 0x6a, 0xbc, 0xec, 0x32, 0x1d, 0x2c, 0x16, 0x55, 0xab, 0xd6, 0x8e, 0x1f, 0x3b, 0x6d, 0x5c,
-	0xf4, 0xe7, 0x2d, 0xf2, 0xc1, 0x8d, 0x4b, 0x05, 0x5e, 0x1e, 0x2e, 0x92, 0x50, 0x74, 0xe5, 0xff,
-	0x3a, 0x55, 0xc8, 0xf5, 0xb1, 0x55, 0x79, 0x2d, 0x25, 0x37, 0x43, 0x1f, 0x6b, 0x52, 0xf4, 0x94,
-	0x3c, 0x75, 0x55, 0xa5, 0x55, 0x8a, 0xc3, 0xef, 0x8d, 0x2e, 0xfd, 0x59, 0x2a, 0xfb, 0x3e, 0xf5,
-	0x3f, 0xa4, 0x30, 0xfb, 0x5e, 0x02, 0x0c, 0x48, 0xff, 0x7f, 0xee, 0xd2, 0x82, 0xbf, 0x4a, 0x9d,
-	0xbc, 0xbf, 0x82, 0x1a, 0x38, 0x8e, 0x00, 0x09, 0xdc, 0x06, 0x22, 0xbc, 0x44, 0x5a, 0x39, 0xfa,
-	0x03, 0xf2, 0x95, 0x1a, 0xfe, 0x56, 0x8b, 0x72, 0x00, 0xf8, 0x32, 0xed, 0xa2, 0xe9, 0x4f, 0xc8,
-	0x93, 0x2b, 0x2d, 0x92, 0x14, 0x92, 0xcf, 0x84, 0x04, 0x37, 0x1a, 0x2a, 0xca, 0xbe, 0x52, 0x6f,
-	0x90, 0xa0, 0x3f, 0x23, 0x5f, 0xe5, 0x4a, 0x8e, 0x41, 0xe3, 0xa3, 0xfb, 0x94, 0x71, 0xab, 0xf4,
-	0xa2, 0x62, 0xc0, 0x57, 0xec, 0x4d, 0x22, 0x78, 0x23, 0xb1, 0xad, 0x5c, 0x28, 0x09, 0x03, 0xc8,
-	0xd8, 0xc2, 0x6f, 0x33, 0x7e, 0xf3, 0x6f, 0x61, 0x5e, 0x8c, 0xc9, 0x27, 0x4a, 0xa7, 0x7b, 0xaa,
-	0x00, 0xc9, 0x95, 0x4e, 0xf6, 0xfc, 0x7f, 0xef, 0x6d, 0x13, 0xe1, 0xf3, 0x1f, 0xa5, 0xc2, 0x4e,
-	0xa6, 0x57, 0x7b, 0x5c, 0xe5, 0xfb, 0xa5, 0xfc, 0xbe, 0x97, 0xff, 0x4e, 0xf9, 0x5f, 0xfd, 0xf7,
-	0xf7, 0x53, 0xd5, 0xf6, 0x8f, 0xfd, 0xd5, 0x1d, 0x27, 0x71, 0xf8, 0xdf, 0x00, 0x00, 0x00, 0xff,
-	0xff, 0xac, 0x32, 0x52, 0x2e, 0xdd, 0x17, 0x00, 0x00,
+func init() { file_voltha_protos_voip_system_profile_proto_init() }
+func file_voltha_protos_voip_system_profile_proto_init() {
+	if File_voltha_protos_voip_system_profile_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_voip_system_profile_proto_rawDesc), len(file_voltha_protos_voip_system_profile_proto_rawDesc)),
+			NumEnums:      0,
+			NumMessages:   19,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_voltha_protos_voip_system_profile_proto_goTypes,
+		DependencyIndexes: file_voltha_protos_voip_system_profile_proto_depIdxs,
+		MessageInfos:      file_voltha_protos_voip_system_profile_proto_msgTypes,
+	}.Build()
+	File_voltha_protos_voip_system_profile_proto = out.File
+	file_voltha_protos_voip_system_profile_proto_goTypes = nil
+	file_voltha_protos_voip_system_profile_proto_depIdxs = nil
 }
