diff --git a/api/go/gosdn/core/core.pb.go b/api/go/gosdn/core/core.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..562655fc9c3001e2e5992ff509111d1a7c06ea27
--- /dev/null
+++ b/api/go/gosdn/core/core.pb.go
@@ -0,0 +1,843 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
+// source: gosdn/core/core.proto
+
+package core
+
+import (
+	pnd "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+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 Status int32
+
+const (
+	Status_STATUS_UNSPECIFIED Status = 0
+	Status_STATUS_OK          Status = 1
+	Status_STATUS_ERROR       Status = 2
+)
+
+// Enum value maps for Status.
+var (
+	Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
+	}
+	Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
+	}
+)
+
+func (x Status) Enum() *Status {
+	p := new(Status)
+	*p = x
+	return p
+}
+
+func (x Status) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Status) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_core_core_proto_enumTypes[0].Descriptor()
+}
+
+func (Status) Type() protoreflect.EnumType {
+	return &file_gosdn_core_core_proto_enumTypes[0]
+}
+
+func (x Status) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Status.Descriptor instead.
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{0}
+}
+
+type GetPndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+}
+
+func (x *GetPndListRequest) Reset() {
+	*x = GetPndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPndListRequest) ProtoMessage() {}
+
+func (x *GetPndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPndListRequest.ProtoReflect.Descriptor instead.
+func (*GetPndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetPndListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+type GetPndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       []string `protobuf:"bytes,3,rep,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetPndRequest) Reset() {
+	*x = GetPndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPndRequest) ProtoMessage() {}
+
+func (x *GetPndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPndRequest.ProtoReflect.Descriptor instead.
+func (*GetPndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetPndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPndRequest) GetPid() []string {
+	if x != nil {
+		return x.Pid
+	}
+	return nil
+}
+
+type GetPndListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64                         `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pnd       []*pnd.PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
+}
+
+func (x *GetPndListResponse) Reset() {
+	*x = GetPndListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPndListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPndListResponse) ProtoMessage() {}
+
+func (x *GetPndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPndListResponse.ProtoReflect.Descriptor instead.
+func (*GetPndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetPndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPndListResponse) GetPnd() []*pnd.PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+type GetPndResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64                         `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pnd       []*pnd.PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
+}
+
+func (x *GetPndResponse) Reset() {
+	*x = GetPndResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPndResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPndResponse) ProtoMessage() {}
+
+func (x *GetPndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPndResponse.ProtoReflect.Descriptor instead.
+func (*GetPndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetPndResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPndResponse) GetPnd() []*pnd.PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+type CreatePndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64                  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pnd       []*PndCreateProperties `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
+}
+
+func (x *CreatePndListRequest) Reset() {
+	*x = CreatePndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreatePndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePndListRequest) ProtoMessage() {}
+
+func (x *CreatePndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePndListRequest.ProtoReflect.Descriptor instead.
+func (*CreatePndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *CreatePndListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreatePndListRequest) GetPnd() []*PndCreateProperties {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+type PndCreateProperties struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name        string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	Sbi         string `protobuf:"bytes,3,opt,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *PndCreateProperties) Reset() {
+	*x = PndCreateProperties{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PndCreateProperties) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PndCreateProperties) ProtoMessage() {}
+
+func (x *PndCreateProperties) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PndCreateProperties.ProtoReflect.Descriptor instead.
+func (*PndCreateProperties) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *PndCreateProperties) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *PndCreateProperties) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+func (x *PndCreateProperties) GetSbi() string {
+	if x != nil {
+		return x.Sbi
+	}
+	return ""
+}
+
+type CreatePndListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.core.Status" json:"status,omitempty"`
+}
+
+func (x *CreatePndListResponse) Reset() {
+	*x = CreatePndListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreatePndListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePndListResponse) ProtoMessage() {}
+
+func (x *CreatePndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePndListResponse.ProtoReflect.Descriptor instead.
+func (*CreatePndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreatePndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreatePndListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+type DeletePndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *DeletePndRequest) Reset() {
+	*x = DeletePndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeletePndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeletePndRequest) ProtoMessage() {}
+
+func (x *DeletePndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeletePndRequest.ProtoReflect.Descriptor instead.
+func (*DeletePndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DeletePndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeletePndRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type DeletePndResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.core.Status" json:"status,omitempty"`
+}
+
+func (x *DeletePndResponse) Reset() {
+	*x = DeletePndResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeletePndResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeletePndResponse) ProtoMessage() {}
+
+func (x *DeletePndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeletePndResponse.ProtoReflect.Descriptor instead.
+func (*DeletePndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *DeletePndResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeletePndResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+var File_gosdn_core_core_proto protoreflect.FileDescriptor
+
+var file_gosdn_core_core_proto_rawDesc = []byte{
+	0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x1a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70, 0x6e, 0x64,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x31, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74,
+	0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x12, 0x47, 0x65,
+	0x74, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33,
+	0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61,
+	0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03,
+	0x70, 0x6e, 0x64, 0x22, 0x63, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69,
+	0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x22, 0x67, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31,
+	0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x03, 0x70, 0x6e,
+	0x64, 0x22, 0x5d, 0x0a, 0x13, 0x50, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72,
+	0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10,
+	0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x62, 0x69,
+	0x22, 0x61, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x22, 0x42, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6e, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x5d, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55,
+	0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x32, 0x85, 0x03, 0x0a, 0x0b, 0x43, 0x6f,
+	0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x53, 0x0a, 0x06, 0x47, 0x65, 0x74,
+	0x50, 0x6e, 0x64, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93,
+	0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x12, 0x5a,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x12, 0x66, 0x0a, 0x0d, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
+	0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x12, 0x5d, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x12,
+	0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3,
+	0xe4, 0x93, 0x02, 0x0d, 0x2a, 0x0b, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64,
+	0x7d, 0x42, 0x30, 0x5a, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d,
+	0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63,
+	0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_core_core_proto_rawDescOnce sync.Once
+	file_gosdn_core_core_proto_rawDescData = file_gosdn_core_core_proto_rawDesc
+)
+
+func file_gosdn_core_core_proto_rawDescGZIP() []byte {
+	file_gosdn_core_core_proto_rawDescOnce.Do(func() {
+		file_gosdn_core_core_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_core_core_proto_rawDescData)
+	})
+	return file_gosdn_core_core_proto_rawDescData
+}
+
+var file_gosdn_core_core_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_gosdn_core_core_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_gosdn_core_core_proto_goTypes = []interface{}{
+	(Status)(0),                        // 0: gosdn.core.Status
+	(*GetPndListRequest)(nil),          // 1: gosdn.core.GetPndListRequest
+	(*GetPndRequest)(nil),              // 2: gosdn.core.GetPndRequest
+	(*GetPndListResponse)(nil),         // 3: gosdn.core.GetPndListResponse
+	(*GetPndResponse)(nil),             // 4: gosdn.core.GetPndResponse
+	(*CreatePndListRequest)(nil),       // 5: gosdn.core.CreatePndListRequest
+	(*PndCreateProperties)(nil),        // 6: gosdn.core.PndCreateProperties
+	(*CreatePndListResponse)(nil),      // 7: gosdn.core.CreatePndListResponse
+	(*DeletePndRequest)(nil),           // 8: gosdn.core.DeletePndRequest
+	(*DeletePndResponse)(nil),          // 9: gosdn.core.DeletePndResponse
+	(*pnd.PrincipalNetworkDomain)(nil), // 10: gosdn.pnd.PrincipalNetworkDomain
+}
+var file_gosdn_core_core_proto_depIdxs = []int32{
+	10, // 0: gosdn.core.GetPndListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	10, // 1: gosdn.core.GetPndResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	6,  // 2: gosdn.core.CreatePndListRequest.pnd:type_name -> gosdn.core.PndCreateProperties
+	0,  // 3: gosdn.core.CreatePndListResponse.status:type_name -> gosdn.core.Status
+	0,  // 4: gosdn.core.DeletePndResponse.status:type_name -> gosdn.core.Status
+	2,  // 5: gosdn.core.CoreService.GetPnd:input_type -> gosdn.core.GetPndRequest
+	1,  // 6: gosdn.core.CoreService.GetPndList:input_type -> gosdn.core.GetPndListRequest
+	5,  // 7: gosdn.core.CoreService.CreatePndList:input_type -> gosdn.core.CreatePndListRequest
+	8,  // 8: gosdn.core.CoreService.DeletePnd:input_type -> gosdn.core.DeletePndRequest
+	4,  // 9: gosdn.core.CoreService.GetPnd:output_type -> gosdn.core.GetPndResponse
+	3,  // 10: gosdn.core.CoreService.GetPndList:output_type -> gosdn.core.GetPndListResponse
+	7,  // 11: gosdn.core.CoreService.CreatePndList:output_type -> gosdn.core.CreatePndListResponse
+	9,  // 12: gosdn.core.CoreService.DeletePnd:output_type -> gosdn.core.DeletePndResponse
+	9,  // [9:13] is the sub-list for method output_type
+	5,  // [5:9] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_core_core_proto_init() }
+func file_gosdn_core_core_proto_init() {
+	if File_gosdn_core_core_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_core_core_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPndResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreatePndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PndCreateProperties); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreatePndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeletePndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeletePndResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_core_core_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_gosdn_core_core_proto_goTypes,
+		DependencyIndexes: file_gosdn_core_core_proto_depIdxs,
+		EnumInfos:         file_gosdn_core_core_proto_enumTypes,
+		MessageInfos:      file_gosdn_core_core_proto_msgTypes,
+	}.Build()
+	File_gosdn_core_core_proto = out.File
+	file_gosdn_core_core_proto_rawDesc = nil
+	file_gosdn_core_core_proto_goTypes = nil
+	file_gosdn_core_core_proto_depIdxs = nil
+}
diff --git a/api/go/gosdn/core/core.pb.gw.go b/api/go/gosdn/core/core.pb.gw.go
new file mode 100644
index 0000000000000000000000000000000000000000..f20b6b3fcf07850e55869757651a55ebdeccda38
--- /dev/null
+++ b/api/go/gosdn/core/core.pb.gw.go
@@ -0,0 +1,484 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: gosdn/core/core.proto
+
+/*
+Package core is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package core
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/metadata"
+	"google.golang.org/grpc/status"
+	"google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+var (
+	filter_CoreService_GetPnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_CoreService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_CoreService_GetPndList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
+)
+
+func request_CoreService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndListRequest
+	var metadata runtime.ServerMetadata
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndListRequest
+	var metadata runtime.ServerMetadata
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_CoreService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq CreatePndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.CreatePndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq CreatePndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.CreatePndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_CoreService_DeletePnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_CoreService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeletePndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_DeletePnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.DeletePnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeletePndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_DeletePnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.DeletePnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+// RegisterCoreServiceHandlerServer registers the http handlers for service CoreService to "mux".
+// UnaryRPC     :call CoreServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterCoreServiceHandlerFromEndpoint instead.
+func RegisterCoreServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server CoreServiceServer) error {
+
+	mux.Handle("GET", pattern_CoreService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_GetPnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_CoreService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/GetPndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_GetPndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_CoreService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/CreatePndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_CreatePndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_CreatePndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_CoreService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_DeletePnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_DeletePnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+// RegisterCoreServiceHandlerFromEndpoint is same as RegisterCoreServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterCoreServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterCoreServiceHandler(ctx, mux, conn)
+}
+
+// RegisterCoreServiceHandler registers the http handlers for service CoreService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterCoreServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterCoreServiceHandlerClient(ctx, mux, NewCoreServiceClient(conn))
+}
+
+// RegisterCoreServiceHandlerClient registers the http handlers for service CoreService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "CoreServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "CoreServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "CoreServiceClient" to call the correct interceptors.
+func RegisterCoreServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client CoreServiceClient) error {
+
+	mux.Handle("GET", pattern_CoreService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_GetPnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_CoreService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/GetPndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_GetPndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_CoreService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/CreatePndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_CreatePndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_CreatePndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_CoreService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_DeletePnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_DeletePnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_CoreService_GetPnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnd", "pid"}, ""))
+
+	pattern_CoreService_GetPndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, ""))
+
+	pattern_CoreService_CreatePndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, ""))
+
+	pattern_CoreService_DeletePnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnds", "pid"}, ""))
+)
+
+var (
+	forward_CoreService_GetPnd_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_GetPndList_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_CreatePndList_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_DeletePnd_0 = runtime.ForwardResponseMessage
+)
diff --git a/api/go/gosdn/core/core_grpc.pb.go b/api/go/gosdn/core/core_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..700014550c269e4c75b5f8f5cca584ba3fe15a7b
--- /dev/null
+++ b/api/go/gosdn/core/core_grpc.pb.go
@@ -0,0 +1,217 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package core
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// CoreServiceClient is the client API for CoreService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type CoreServiceClient interface {
+	// Allows to request a specific Principal Network Domain.
+	GetPnd(ctx context.Context, in *GetPndRequest, opts ...grpc.CallOption) (*GetPndResponse, error)
+	// Allows to request all Principal Network Domains.
+	GetPndList(ctx context.Context, in *GetPndListRequest, opts ...grpc.CallOption) (*GetPndListResponse, error)
+	// Allows create a Principal Network Domain.
+	CreatePndList(ctx context.Context, in *CreatePndListRequest, opts ...grpc.CallOption) (*CreatePndListResponse, error)
+	// Allows to delete a specific Principal Network Domain.
+	DeletePnd(ctx context.Context, in *DeletePndRequest, opts ...grpc.CallOption) (*DeletePndResponse, error)
+}
+
+type coreServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCoreServiceClient(cc grpc.ClientConnInterface) CoreServiceClient {
+	return &coreServiceClient{cc}
+}
+
+func (c *coreServiceClient) GetPnd(ctx context.Context, in *GetPndRequest, opts ...grpc.CallOption) (*GetPndResponse, error) {
+	out := new(GetPndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/GetPnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *coreServiceClient) GetPndList(ctx context.Context, in *GetPndListRequest, opts ...grpc.CallOption) (*GetPndListResponse, error) {
+	out := new(GetPndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/GetPndList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *coreServiceClient) CreatePndList(ctx context.Context, in *CreatePndListRequest, opts ...grpc.CallOption) (*CreatePndListResponse, error) {
+	out := new(CreatePndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/CreatePndList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *coreServiceClient) DeletePnd(ctx context.Context, in *DeletePndRequest, opts ...grpc.CallOption) (*DeletePndResponse, error) {
+	out := new(DeletePndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/DeletePnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CoreServiceServer is the server API for CoreService service.
+// All implementations must embed UnimplementedCoreServiceServer
+// for forward compatibility
+type CoreServiceServer interface {
+	// Allows to request a specific Principal Network Domain.
+	GetPnd(context.Context, *GetPndRequest) (*GetPndResponse, error)
+	// Allows to request all Principal Network Domains.
+	GetPndList(context.Context, *GetPndListRequest) (*GetPndListResponse, error)
+	// Allows create a Principal Network Domain.
+	CreatePndList(context.Context, *CreatePndListRequest) (*CreatePndListResponse, error)
+	// Allows to delete a specific Principal Network Domain.
+	DeletePnd(context.Context, *DeletePndRequest) (*DeletePndResponse, error)
+	mustEmbedUnimplementedCoreServiceServer()
+}
+
+// UnimplementedCoreServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedCoreServiceServer struct {
+}
+
+func (UnimplementedCoreServiceServer) GetPnd(context.Context, *GetPndRequest) (*GetPndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPnd not implemented")
+}
+func (UnimplementedCoreServiceServer) GetPndList(context.Context, *GetPndListRequest) (*GetPndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPndList not implemented")
+}
+func (UnimplementedCoreServiceServer) CreatePndList(context.Context, *CreatePndListRequest) (*CreatePndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreatePndList not implemented")
+}
+func (UnimplementedCoreServiceServer) DeletePnd(context.Context, *DeletePndRequest) (*DeletePndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeletePnd not implemented")
+}
+func (UnimplementedCoreServiceServer) mustEmbedUnimplementedCoreServiceServer() {}
+
+// UnsafeCoreServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CoreServiceServer will
+// result in compilation errors.
+type UnsafeCoreServiceServer interface {
+	mustEmbedUnimplementedCoreServiceServer()
+}
+
+func RegisterCoreServiceServer(s grpc.ServiceRegistrar, srv CoreServiceServer) {
+	s.RegisterService(&CoreService_ServiceDesc, srv)
+}
+
+func _CoreService_GetPnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).GetPnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/GetPnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).GetPnd(ctx, req.(*GetPndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CoreService_GetPndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).GetPndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/GetPndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).GetPndList(ctx, req.(*GetPndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CoreService_CreatePndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreatePndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).CreatePndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/CreatePndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).CreatePndList(ctx, req.(*CreatePndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CoreService_DeletePnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeletePndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).DeletePnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/DeletePnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).DeletePnd(ctx, req.(*DeletePndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// CoreService_ServiceDesc is the grpc.ServiceDesc for CoreService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var CoreService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.core.CoreService",
+	HandlerType: (*CoreServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetPnd",
+			Handler:    _CoreService_GetPnd_Handler,
+		},
+		{
+			MethodName: "GetPndList",
+			Handler:    _CoreService_GetPndList_Handler,
+		},
+		{
+			MethodName: "CreatePndList",
+			Handler:    _CoreService_CreatePndList_Handler,
+		},
+		{
+			MethodName: "DeletePnd",
+			Handler:    _CoreService_DeletePnd_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "gosdn/core/core.proto",
+}
diff --git a/api/go/gosdn/csbi/csbi.pb.go b/api/go/gosdn/csbi/csbi.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..d6507cd6c0edf8ebb722613f06269a0edf51e344
--- /dev/null
+++ b/api/go/gosdn/csbi/csbi.pb.go
@@ -0,0 +1,1010 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
+// source: gosdn/csbi/csbi.proto
+
+package csbi
+
+import (
+	transport "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+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 State int32
+
+const (
+	State_STATE_UNSPECIFIED    State = 0
+	State_STATE_ANNOUNCED      State = 1
+	State_STATE_BUILT          State = 2
+	State_STATE_DEPLOYED       State = 3
+	State_STATE_RUNNING        State = 4
+	State_STATE_DECOMMISSIONED State = 5
+)
+
+// Enum value maps for State.
+var (
+	State_name = map[int32]string{
+		0: "STATE_UNSPECIFIED",
+		1: "STATE_ANNOUNCED",
+		2: "STATE_BUILT",
+		3: "STATE_DEPLOYED",
+		4: "STATE_RUNNING",
+		5: "STATE_DECOMMISSIONED",
+	}
+	State_value = map[string]int32{
+		"STATE_UNSPECIFIED":    0,
+		"STATE_ANNOUNCED":      1,
+		"STATE_BUILT":          2,
+		"STATE_DEPLOYED":       3,
+		"STATE_RUNNING":        4,
+		"STATE_DECOMMISSIONED": 5,
+	}
+)
+
+func (x State) Enum() *State {
+	p := new(State)
+	*p = x
+	return p
+}
+
+func (x State) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (State) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_csbi_csbi_proto_enumTypes[0].Descriptor()
+}
+
+func (State) Type() protoreflect.EnumType {
+	return &file_gosdn_csbi_csbi_proto_enumTypes[0]
+}
+
+func (x State) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use State.Descriptor instead.
+func (State) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{0}
+}
+
+type DeleteResponse_Status int32
+
+const (
+	DeleteResponse_STATUS_UNSPECIFIED DeleteResponse_Status = 0
+	DeleteResponse_STATUS_OK          DeleteResponse_Status = 1
+	DeleteResponse_STATUS_ERROR       DeleteResponse_Status = 2
+)
+
+// Enum value maps for DeleteResponse_Status.
+var (
+	DeleteResponse_Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
+	}
+	DeleteResponse_Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
+	}
+)
+
+func (x DeleteResponse_Status) Enum() *DeleteResponse_Status {
+	p := new(DeleteResponse_Status)
+	*p = x
+	return p
+}
+
+func (x DeleteResponse_Status) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DeleteResponse_Status) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_csbi_csbi_proto_enumTypes[1].Descriptor()
+}
+
+func (DeleteResponse_Status) Type() protoreflect.EnumType {
+	return &file_gosdn_csbi_csbi_proto_enumTypes[1]
+}
+
+func (x DeleteResponse_Status) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use DeleteResponse_Status.Descriptor instead.
+func (DeleteResponse_Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{9, 0}
+}
+
+type Syn struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Id        string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
+	Address   string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
+}
+
+func (x *Syn) Reset() {
+	*x = Syn{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Syn) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Syn) ProtoMessage() {}
+
+func (x *Syn) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Syn.ProtoReflect.Descriptor instead.
+func (*Syn) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Syn) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *Syn) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Syn) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+type Ack struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp       int64                      `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	TransportOption *transport.TransportOption `protobuf:"bytes,2,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
+}
+
+func (x *Ack) Reset() {
+	*x = Ack{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Ack) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Ack) ProtoMessage() {}
+
+func (x *Ack) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Ack.ProtoReflect.Descriptor instead.
+func (*Ack) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Ack) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *Ack) GetTransportOption() *transport.TransportOption {
+	if x != nil {
+		return x.TransportOption
+	}
+	return nil
+}
+
+type GetRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	All       bool     `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"`
+	Did       []string `protobuf:"bytes,3,rep,name=did,proto3" json:"did,omitempty"`
+}
+
+func (x *GetRequest) Reset() {
+	*x = GetRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetRequest) ProtoMessage() {}
+
+func (x *GetRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
+func (*GetRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetRequest) GetAll() bool {
+	if x != nil {
+		return x.All
+	}
+	return false
+}
+
+func (x *GetRequest) GetDid() []string {
+	if x != nil {
+		return x.Did
+	}
+	return nil
+}
+
+type GetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp   int64         `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"`
+}
+
+func (x *GetResponse) Reset() {
+	*x = GetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetResponse) ProtoMessage() {}
+
+func (x *GetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
+func (*GetResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetResponse) GetDeployments() []*Deployment {
+	if x != nil {
+		return x.Deployments
+	}
+	return nil
+}
+
+type Deployment struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id    string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name  string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	State State  `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.csbi.State" json:"state,omitempty"`
+}
+
+func (x *Deployment) Reset() {
+	*x = Deployment{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Deployment) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Deployment) ProtoMessage() {}
+
+func (x *Deployment) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Deployment.ProtoReflect.Descriptor instead.
+func (*Deployment) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *Deployment) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Deployment) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Deployment) GetState() State {
+	if x != nil {
+		return x.State
+	}
+	return State_STATE_UNSPECIFIED
+}
+
+type CreateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp       int64                        `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	TransportOption []*transport.TransportOption `protobuf:"bytes,2,rep,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
+}
+
+func (x *CreateRequest) Reset() {
+	*x = CreateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateRequest) ProtoMessage() {}
+
+func (x *CreateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead.
+func (*CreateRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *CreateRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreateRequest) GetTransportOption() []*transport.TransportOption {
+	if x != nil {
+		return x.TransportOption
+	}
+	return nil
+}
+
+type CreateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp   int64         `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Deployments []*Deployment `protobuf:"bytes,2,rep,name=deployments,proto3" json:"deployments,omitempty"`
+}
+
+func (x *CreateResponse) Reset() {
+	*x = CreateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateResponse) ProtoMessage() {}
+
+func (x *CreateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead.
+func (*CreateResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreateResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreateResponse) GetDeployments() []*Deployment {
+	if x != nil {
+		return x.Deployments
+	}
+	return nil
+}
+
+type Payload struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"`
+}
+
+func (x *Payload) Reset() {
+	*x = Payload{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Payload) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Payload) ProtoMessage() {}
+
+func (x *Payload) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Payload.ProtoReflect.Descriptor instead.
+func (*Payload) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *Payload) GetChunk() []byte {
+	if x != nil {
+		return x.Chunk
+	}
+	return nil
+}
+
+type DeleteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Did       []string `protobuf:"bytes,2,rep,name=did,proto3" json:"did,omitempty"`
+}
+
+func (x *DeleteRequest) Reset() {
+	*x = DeleteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteRequest) ProtoMessage() {}
+
+func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
+func (*DeleteRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *DeleteRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeleteRequest) GetDid() []string {
+	if x != nil {
+		return x.Did
+	}
+	return nil
+}
+
+type DeleteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64                 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    DeleteResponse_Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.csbi.DeleteResponse_Status" json:"status,omitempty"`
+}
+
+func (x *DeleteResponse) Reset() {
+	*x = DeleteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteResponse) ProtoMessage() {}
+
+func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead.
+func (*DeleteResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *DeleteResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeleteResponse) GetStatus() DeleteResponse_Status {
+	if x != nil {
+		return x.Status
+	}
+	return DeleteResponse_STATUS_UNSPECIFIED
+}
+
+var File_gosdn_csbi_csbi_proto protoreflect.FileDescriptor
+
+var file_gosdn_csbi_csbi_proto_rawDesc = []byte{
+	0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x73, 0x62, 0x69, 0x2f, 0x63, 0x73, 0x62,
+	0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
+	0x73, 0x62, 0x69, 0x1a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4d, 0x0a, 0x03, 0x53, 0x79, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x22, 0x70, 0x0a, 0x03, 0x41, 0x63, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03,
+	0x61, 0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+	0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x59, 0x0a, 0x0a,
+	0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27,
+	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x7a, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e,
+	0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74,
+	0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1f, 0x0a,
+	0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e,
+	0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x3f,
+	0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a,
+	0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x22,
+	0xac, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, 0x0a, 0x06, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a,
+	0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x85,
+	0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54,
+	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43,
+	0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x55,
+	0x49, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44,
+	0x45, 0x50, 0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41,
+	0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14,
+	0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x53, 0x53, 0x49,
+	0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x32, 0xb2, 0x03, 0x0a, 0x0b, 0x43, 0x73, 0x62, 0x69, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73,
+	0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c,
+	0x0a, 0x0b, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x16, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73,
+	0x62, 0x69, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x0b,
+	0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69,
+	0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x06, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62,
+	0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73,
+	0x62, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05,
+	0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x0f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73,
+	0x62, 0x69, 0x2e, 0x53, 0x79, 0x6e, 0x1a, 0x0f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
+	0x73, 0x62, 0x69, 0x2e, 0x41, 0x63, 0x6b, 0x12, 0x42, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x47, 0x6f, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62,
+	0x69, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x63,
+	0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f,
+	0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x73, 0x62, 0x69, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_csbi_csbi_proto_rawDescOnce sync.Once
+	file_gosdn_csbi_csbi_proto_rawDescData = file_gosdn_csbi_csbi_proto_rawDesc
+)
+
+func file_gosdn_csbi_csbi_proto_rawDescGZIP() []byte {
+	file_gosdn_csbi_csbi_proto_rawDescOnce.Do(func() {
+		file_gosdn_csbi_csbi_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_csbi_csbi_proto_rawDescData)
+	})
+	return file_gosdn_csbi_csbi_proto_rawDescData
+}
+
+var file_gosdn_csbi_csbi_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_gosdn_csbi_csbi_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_gosdn_csbi_csbi_proto_goTypes = []interface{}{
+	(State)(0),                        // 0: gosdn.csbi.State
+	(DeleteResponse_Status)(0),        // 1: gosdn.csbi.DeleteResponse.Status
+	(*Syn)(nil),                       // 2: gosdn.csbi.Syn
+	(*Ack)(nil),                       // 3: gosdn.csbi.Ack
+	(*GetRequest)(nil),                // 4: gosdn.csbi.GetRequest
+	(*GetResponse)(nil),               // 5: gosdn.csbi.GetResponse
+	(*Deployment)(nil),                // 6: gosdn.csbi.Deployment
+	(*CreateRequest)(nil),             // 7: gosdn.csbi.CreateRequest
+	(*CreateResponse)(nil),            // 8: gosdn.csbi.CreateResponse
+	(*Payload)(nil),                   // 9: gosdn.csbi.Payload
+	(*DeleteRequest)(nil),             // 10: gosdn.csbi.DeleteRequest
+	(*DeleteResponse)(nil),            // 11: gosdn.csbi.DeleteResponse
+	(*transport.TransportOption)(nil), // 12: gosdn.transport.TransportOption
+}
+var file_gosdn_csbi_csbi_proto_depIdxs = []int32{
+	12, // 0: gosdn.csbi.Ack.transport_option:type_name -> gosdn.transport.TransportOption
+	6,  // 1: gosdn.csbi.GetResponse.deployments:type_name -> gosdn.csbi.Deployment
+	0,  // 2: gosdn.csbi.Deployment.state:type_name -> gosdn.csbi.State
+	12, // 3: gosdn.csbi.CreateRequest.transport_option:type_name -> gosdn.transport.TransportOption
+	6,  // 4: gosdn.csbi.CreateResponse.deployments:type_name -> gosdn.csbi.Deployment
+	1,  // 5: gosdn.csbi.DeleteResponse.status:type_name -> gosdn.csbi.DeleteResponse.Status
+	4,  // 6: gosdn.csbi.CsbiService.Get:input_type -> gosdn.csbi.GetRequest
+	4,  // 7: gosdn.csbi.CsbiService.GetGoStruct:input_type -> gosdn.csbi.GetRequest
+	4,  // 8: gosdn.csbi.CsbiService.GetManifest:input_type -> gosdn.csbi.GetRequest
+	7,  // 9: gosdn.csbi.CsbiService.Create:input_type -> gosdn.csbi.CreateRequest
+	10, // 10: gosdn.csbi.CsbiService.Delete:input_type -> gosdn.csbi.DeleteRequest
+	2,  // 11: gosdn.csbi.CsbiService.Hello:input_type -> gosdn.csbi.Syn
+	7,  // 12: gosdn.csbi.CsbiService.CreateGoStruct:input_type -> gosdn.csbi.CreateRequest
+	5,  // 13: gosdn.csbi.CsbiService.Get:output_type -> gosdn.csbi.GetResponse
+	9,  // 14: gosdn.csbi.CsbiService.GetGoStruct:output_type -> gosdn.csbi.Payload
+	9,  // 15: gosdn.csbi.CsbiService.GetManifest:output_type -> gosdn.csbi.Payload
+	8,  // 16: gosdn.csbi.CsbiService.Create:output_type -> gosdn.csbi.CreateResponse
+	11, // 17: gosdn.csbi.CsbiService.Delete:output_type -> gosdn.csbi.DeleteResponse
+	3,  // 18: gosdn.csbi.CsbiService.Hello:output_type -> gosdn.csbi.Ack
+	9,  // 19: gosdn.csbi.CsbiService.CreateGoStruct:output_type -> gosdn.csbi.Payload
+	13, // [13:20] is the sub-list for method output_type
+	6,  // [6:13] is the sub-list for method input_type
+	6,  // [6:6] is the sub-list for extension type_name
+	6,  // [6:6] is the sub-list for extension extendee
+	0,  // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_csbi_csbi_proto_init() }
+func file_gosdn_csbi_csbi_proto_init() {
+	if File_gosdn_csbi_csbi_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_csbi_csbi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Syn); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Ack); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Deployment); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Payload); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_csbi_csbi_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   10,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_gosdn_csbi_csbi_proto_goTypes,
+		DependencyIndexes: file_gosdn_csbi_csbi_proto_depIdxs,
+		EnumInfos:         file_gosdn_csbi_csbi_proto_enumTypes,
+		MessageInfos:      file_gosdn_csbi_csbi_proto_msgTypes,
+	}.Build()
+	File_gosdn_csbi_csbi_proto = out.File
+	file_gosdn_csbi_csbi_proto_rawDesc = nil
+	file_gosdn_csbi_csbi_proto_goTypes = nil
+	file_gosdn_csbi_csbi_proto_depIdxs = nil
+}
diff --git a/api/go/gosdn/csbi/csbi_grpc.pb.go b/api/go/gosdn/csbi/csbi_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..9811ad686d2524f393e295d8be84de4e9595cf53
--- /dev/null
+++ b/api/go/gosdn/csbi/csbi_grpc.pb.go
@@ -0,0 +1,399 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package csbi
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// CsbiServiceClient is the client API for CsbiService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type CsbiServiceClient interface {
+	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
+	GetGoStruct(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (CsbiService_GetGoStructClient, error)
+	GetManifest(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (CsbiService_GetManifestClient, error)
+	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
+	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
+	Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption) (*Ack, error)
+	CreateGoStruct(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (CsbiService_CreateGoStructClient, error)
+}
+
+type csbiServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewCsbiServiceClient(cc grpc.ClientConnInterface) CsbiServiceClient {
+	return &csbiServiceClient{cc}
+}
+
+func (c *csbiServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
+	out := new(GetResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Get", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *csbiServiceClient) GetGoStruct(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (CsbiService_GetGoStructClient, error) {
+	stream, err := c.cc.NewStream(ctx, &CsbiService_ServiceDesc.Streams[0], "/gosdn.csbi.CsbiService/GetGoStruct", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &csbiServiceGetGoStructClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type CsbiService_GetGoStructClient interface {
+	Recv() (*Payload, error)
+	grpc.ClientStream
+}
+
+type csbiServiceGetGoStructClient struct {
+	grpc.ClientStream
+}
+
+func (x *csbiServiceGetGoStructClient) Recv() (*Payload, error) {
+	m := new(Payload)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *csbiServiceClient) GetManifest(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (CsbiService_GetManifestClient, error) {
+	stream, err := c.cc.NewStream(ctx, &CsbiService_ServiceDesc.Streams[1], "/gosdn.csbi.CsbiService/GetManifest", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &csbiServiceGetManifestClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type CsbiService_GetManifestClient interface {
+	Recv() (*Payload, error)
+	grpc.ClientStream
+}
+
+type csbiServiceGetManifestClient struct {
+	grpc.ClientStream
+}
+
+func (x *csbiServiceGetManifestClient) Recv() (*Payload, error) {
+	m := new(Payload)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *csbiServiceClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
+	out := new(CreateResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Create", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *csbiServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
+	out := new(DeleteResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Delete", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *csbiServiceClient) Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption) (*Ack, error) {
+	out := new(Ack)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Hello", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *csbiServiceClient) CreateGoStruct(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (CsbiService_CreateGoStructClient, error) {
+	stream, err := c.cc.NewStream(ctx, &CsbiService_ServiceDesc.Streams[2], "/gosdn.csbi.CsbiService/CreateGoStruct", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &csbiServiceCreateGoStructClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type CsbiService_CreateGoStructClient interface {
+	Recv() (*Payload, error)
+	grpc.ClientStream
+}
+
+type csbiServiceCreateGoStructClient struct {
+	grpc.ClientStream
+}
+
+func (x *csbiServiceCreateGoStructClient) Recv() (*Payload, error) {
+	m := new(Payload)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// CsbiServiceServer is the server API for CsbiService service.
+// All implementations must embed UnimplementedCsbiServiceServer
+// for forward compatibility
+type CsbiServiceServer interface {
+	Get(context.Context, *GetRequest) (*GetResponse, error)
+	GetGoStruct(*GetRequest, CsbiService_GetGoStructServer) error
+	GetManifest(*GetRequest, CsbiService_GetManifestServer) error
+	Create(context.Context, *CreateRequest) (*CreateResponse, error)
+	Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
+	Hello(context.Context, *Syn) (*Ack, error)
+	CreateGoStruct(*CreateRequest, CsbiService_CreateGoStructServer) error
+	mustEmbedUnimplementedCsbiServiceServer()
+}
+
+// UnimplementedCsbiServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedCsbiServiceServer struct {
+}
+
+func (UnimplementedCsbiServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+}
+func (UnimplementedCsbiServiceServer) GetGoStruct(*GetRequest, CsbiService_GetGoStructServer) error {
+	return status.Errorf(codes.Unimplemented, "method GetGoStruct not implemented")
+}
+func (UnimplementedCsbiServiceServer) GetManifest(*GetRequest, CsbiService_GetManifestServer) error {
+	return status.Errorf(codes.Unimplemented, "method GetManifest not implemented")
+}
+func (UnimplementedCsbiServiceServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
+}
+func (UnimplementedCsbiServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+}
+func (UnimplementedCsbiServiceServer) Hello(context.Context, *Syn) (*Ack, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Hello not implemented")
+}
+func (UnimplementedCsbiServiceServer) CreateGoStruct(*CreateRequest, CsbiService_CreateGoStructServer) error {
+	return status.Errorf(codes.Unimplemented, "method CreateGoStruct not implemented")
+}
+func (UnimplementedCsbiServiceServer) mustEmbedUnimplementedCsbiServiceServer() {}
+
+// UnsafeCsbiServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CsbiServiceServer will
+// result in compilation errors.
+type UnsafeCsbiServiceServer interface {
+	mustEmbedUnimplementedCsbiServiceServer()
+}
+
+func RegisterCsbiServiceServer(s grpc.ServiceRegistrar, srv CsbiServiceServer) {
+	s.RegisterService(&CsbiService_ServiceDesc, srv)
+}
+
+func _CsbiService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CsbiServiceServer).Get(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.csbi.CsbiService/Get",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CsbiServiceServer).Get(ctx, req.(*GetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CsbiService_GetGoStruct_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(GetRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(CsbiServiceServer).GetGoStruct(m, &csbiServiceGetGoStructServer{stream})
+}
+
+type CsbiService_GetGoStructServer interface {
+	Send(*Payload) error
+	grpc.ServerStream
+}
+
+type csbiServiceGetGoStructServer struct {
+	grpc.ServerStream
+}
+
+func (x *csbiServiceGetGoStructServer) Send(m *Payload) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _CsbiService_GetManifest_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(GetRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(CsbiServiceServer).GetManifest(m, &csbiServiceGetManifestServer{stream})
+}
+
+type CsbiService_GetManifestServer interface {
+	Send(*Payload) error
+	grpc.ServerStream
+}
+
+type csbiServiceGetManifestServer struct {
+	grpc.ServerStream
+}
+
+func (x *csbiServiceGetManifestServer) Send(m *Payload) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _CsbiService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CsbiServiceServer).Create(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.csbi.CsbiService/Create",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CsbiServiceServer).Create(ctx, req.(*CreateRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CsbiService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CsbiServiceServer).Delete(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.csbi.CsbiService/Delete",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CsbiServiceServer).Delete(ctx, req.(*DeleteRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CsbiService_Hello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Syn)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CsbiServiceServer).Hello(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.csbi.CsbiService/Hello",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CsbiServiceServer).Hello(ctx, req.(*Syn))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _CsbiService_CreateGoStruct_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(CreateRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(CsbiServiceServer).CreateGoStruct(m, &csbiServiceCreateGoStructServer{stream})
+}
+
+type CsbiService_CreateGoStructServer interface {
+	Send(*Payload) error
+	grpc.ServerStream
+}
+
+type csbiServiceCreateGoStructServer struct {
+	grpc.ServerStream
+}
+
+func (x *csbiServiceCreateGoStructServer) Send(m *Payload) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+// CsbiService_ServiceDesc is the grpc.ServiceDesc for CsbiService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var CsbiService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.csbi.CsbiService",
+	HandlerType: (*CsbiServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Get",
+			Handler:    _CsbiService_Get_Handler,
+		},
+		{
+			MethodName: "Create",
+			Handler:    _CsbiService_Create_Handler,
+		},
+		{
+			MethodName: "Delete",
+			Handler:    _CsbiService_Delete_Handler,
+		},
+		{
+			MethodName: "Hello",
+			Handler:    _CsbiService_Hello_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "GetGoStruct",
+			Handler:       _CsbiService_GetGoStruct_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "GetManifest",
+			Handler:       _CsbiService_GetManifest_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "CreateGoStruct",
+			Handler:       _CsbiService_CreateGoStruct_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "gosdn/csbi/csbi.proto",
+}
diff --git a/api/go/gosdn/pnd/pnd.pb.go b/api/go/gosdn/pnd/pnd.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..3738f74a09fbca7fb2ffe3c9e2116e6e3606bf44
--- /dev/null
+++ b/api/go/gosdn/pnd/pnd.pb.go
@@ -0,0 +1,3292 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
+// source: gosdn/pnd/pnd.proto
+
+package pnd
+
+import (
+	southbound "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
+	transport "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
+	_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	_ "google.golang.org/protobuf/types/descriptorpb"
+	reflect "reflect"
+	sync "sync"
+)
+
+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 ChangeState int32
+
+const (
+	ChangeState_CHANGE_STATE_UNSPECIFIED  ChangeState = 0
+	ChangeState_CHANGE_STATE_PENDING      ChangeState = 1
+	ChangeState_CHANGE_STATE_COMMITTED    ChangeState = 2
+	ChangeState_CHANGE_STATE_CONFIRMED    ChangeState = 3
+	ChangeState_CHANGE_STATE_INCONSISTENT ChangeState = 4
+)
+
+// Enum value maps for ChangeState.
+var (
+	ChangeState_name = map[int32]string{
+		0: "CHANGE_STATE_UNSPECIFIED",
+		1: "CHANGE_STATE_PENDING",
+		2: "CHANGE_STATE_COMMITTED",
+		3: "CHANGE_STATE_CONFIRMED",
+		4: "CHANGE_STATE_INCONSISTENT",
+	}
+	ChangeState_value = map[string]int32{
+		"CHANGE_STATE_UNSPECIFIED":  0,
+		"CHANGE_STATE_PENDING":      1,
+		"CHANGE_STATE_COMMITTED":    2,
+		"CHANGE_STATE_CONFIRMED":    3,
+		"CHANGE_STATE_INCONSISTENT": 4,
+	}
+)
+
+func (x ChangeState) Enum() *ChangeState {
+	p := new(ChangeState)
+	*p = x
+	return p
+}
+
+func (x ChangeState) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ChangeState) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_pnd_pnd_proto_enumTypes[0].Descriptor()
+}
+
+func (ChangeState) Type() protoreflect.EnumType {
+	return &file_gosdn_pnd_pnd_proto_enumTypes[0]
+}
+
+func (x ChangeState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ChangeState.Descriptor instead.
+func (ChangeState) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{0}
+}
+
+type ApiOperation int32
+
+const (
+	ApiOperation_API_OPERATION_UNSPECIFIED ApiOperation = 0
+	ApiOperation_API_OPERATION_UPDATE      ApiOperation = 1
+	ApiOperation_API_OPERATION_REPLACE     ApiOperation = 2
+	ApiOperation_API_OPERATION_DELETE      ApiOperation = 3
+)
+
+// Enum value maps for ApiOperation.
+var (
+	ApiOperation_name = map[int32]string{
+		0: "API_OPERATION_UNSPECIFIED",
+		1: "API_OPERATION_UPDATE",
+		2: "API_OPERATION_REPLACE",
+		3: "API_OPERATION_DELETE",
+	}
+	ApiOperation_value = map[string]int32{
+		"API_OPERATION_UNSPECIFIED": 0,
+		"API_OPERATION_UPDATE":      1,
+		"API_OPERATION_REPLACE":     2,
+		"API_OPERATION_DELETE":      3,
+	}
+)
+
+func (x ApiOperation) Enum() *ApiOperation {
+	p := new(ApiOperation)
+	*p = x
+	return p
+}
+
+func (x ApiOperation) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ApiOperation) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_pnd_pnd_proto_enumTypes[1].Descriptor()
+}
+
+func (ApiOperation) Type() protoreflect.EnumType {
+	return &file_gosdn_pnd_pnd_proto_enumTypes[1]
+}
+
+func (x ApiOperation) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ApiOperation.Descriptor instead.
+func (ApiOperation) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{1}
+}
+
+type SbiType int32
+
+const (
+	SbiType_SBI_TYPE_UNSPECIFIED   SbiType = 0
+	SbiType_SBI_TYPE_OPENCONFIG    SbiType = 1
+	SbiType_SBI_TYPE_CONTAINERISED SbiType = 2
+	SbiType_SBI_TYPE_PLUGIN        SbiType = 3
+)
+
+// Enum value maps for SbiType.
+var (
+	SbiType_name = map[int32]string{
+		0: "SBI_TYPE_UNSPECIFIED",
+		1: "SBI_TYPE_OPENCONFIG",
+		2: "SBI_TYPE_CONTAINERISED",
+		3: "SBI_TYPE_PLUGIN",
+	}
+	SbiType_value = map[string]int32{
+		"SBI_TYPE_UNSPECIFIED":   0,
+		"SBI_TYPE_OPENCONFIG":    1,
+		"SBI_TYPE_CONTAINERISED": 2,
+		"SBI_TYPE_PLUGIN":        3,
+	}
+)
+
+func (x SbiType) Enum() *SbiType {
+	p := new(SbiType)
+	*p = x
+	return p
+}
+
+func (x SbiType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SbiType) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_pnd_pnd_proto_enumTypes[2].Descriptor()
+}
+
+func (SbiType) Type() protoreflect.EnumType {
+	return &file_gosdn_pnd_pnd_proto_enumTypes[2]
+}
+
+func (x SbiType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SbiType.Descriptor instead.
+func (SbiType) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{2}
+}
+
+type Operation int32
+
+const (
+	Operation_OPERATION_UNSPECIFIED Operation = 0
+	Operation_OPERATION_CREATE      Operation = 1
+	Operation_OPERATION_COMMIT      Operation = 2
+	Operation_OPERATION_CONFIRM     Operation = 3
+)
+
+// Enum value maps for Operation.
+var (
+	Operation_name = map[int32]string{
+		0: "OPERATION_UNSPECIFIED",
+		1: "OPERATION_CREATE",
+		2: "OPERATION_COMMIT",
+		3: "OPERATION_CONFIRM",
+	}
+	Operation_value = map[string]int32{
+		"OPERATION_UNSPECIFIED": 0,
+		"OPERATION_CREATE":      1,
+		"OPERATION_COMMIT":      2,
+		"OPERATION_CONFIRM":     3,
+	}
+)
+
+func (x Operation) Enum() *Operation {
+	p := new(Operation)
+	*p = x
+	return p
+}
+
+func (x Operation) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Operation) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_pnd_pnd_proto_enumTypes[3].Descriptor()
+}
+
+func (Operation) Type() protoreflect.EnumType {
+	return &file_gosdn_pnd_pnd_proto_enumTypes[3]
+}
+
+func (x Operation) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Operation.Descriptor instead.
+func (Operation) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{3}
+}
+
+type Status int32
+
+const (
+	Status_STATUS_UNSPECIFIED Status = 0
+	Status_STATUS_OK          Status = 1
+	Status_STATUS_ERROR       Status = 2
+)
+
+// Enum value maps for Status.
+var (
+	Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
+	}
+	Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
+	}
+)
+
+func (x Status) Enum() *Status {
+	p := new(Status)
+	*p = x
+	return p
+}
+
+func (x Status) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Status) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_pnd_pnd_proto_enumTypes[4].Descriptor()
+}
+
+func (Status) Type() protoreflect.EnumType {
+	return &file_gosdn_pnd_pnd_proto_enumTypes[4]
+}
+
+func (x Status) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Status.Descriptor instead.
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{4}
+}
+
+type GetOndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetOndListRequest) Reset() {
+	*x = GetOndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetOndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOndListRequest) ProtoMessage() {}
+
+func (x *GetOndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetOndListRequest.ProtoReflect.Descriptor instead.
+func (*GetOndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetOndListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetOndListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetOndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Did       []string `protobuf:"bytes,3,rep,name=did,proto3" json:"did,omitempty"`
+	Pid       string   `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetOndRequest) Reset() {
+	*x = GetOndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetOndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOndRequest) ProtoMessage() {}
+
+func (x *GetOndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetOndRequest.ProtoReflect.Descriptor instead.
+func (*GetOndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetOndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetOndRequest) GetDid() []string {
+	if x != nil {
+		return x.Did
+	}
+	return nil
+}
+
+func (x *GetOndRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetSbiListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetSbiListRequest) Reset() {
+	*x = GetSbiListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSbiListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSbiListRequest) ProtoMessage() {}
+
+func (x *GetSbiListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSbiListRequest.ProtoReflect.Descriptor instead.
+func (*GetSbiListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetSbiListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSbiListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetSbiRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Sid       []string `protobuf:"bytes,3,rep,name=sid,proto3" json:"sid,omitempty"`
+	Pid       string   `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetSbiRequest) Reset() {
+	*x = GetSbiRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSbiRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSbiRequest) ProtoMessage() {}
+
+func (x *GetSbiRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSbiRequest.ProtoReflect.Descriptor instead.
+func (*GetSbiRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetSbiRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSbiRequest) GetSid() []string {
+	if x != nil {
+		return x.Sid
+	}
+	return nil
+}
+
+func (x *GetSbiRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetChangeListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetChangeListRequest) Reset() {
+	*x = GetChangeListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeListRequest) ProtoMessage() {}
+
+func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeListRequest.ProtoReflect.Descriptor instead.
+func (*GetChangeListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetChangeListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetChangeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Cuid      string `protobuf:"bytes,3,opt,name=cuid,proto3" json:"cuid,omitempty"`
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetChangeRequest) Reset() {
+	*x = GetChangeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeRequest) ProtoMessage() {}
+
+func (x *GetChangeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeRequest.ProtoReflect.Descriptor instead.
+func (*GetChangeRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetChangeRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeRequest) GetCuid() string {
+	if x != nil {
+		return x.Cuid
+	}
+	return ""
+}
+
+func (x *GetChangeRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetPathRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Did       string `protobuf:"bytes,2,opt,name=did,proto3" json:"did,omitempty"`
+	Path      string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetPathRequest) Reset() {
+	*x = GetPathRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPathRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPathRequest) ProtoMessage() {}
+
+func (x *GetPathRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPathRequest.ProtoReflect.Descriptor instead.
+func (*GetPathRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *GetPathRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPathRequest) GetDid() string {
+	if x != nil {
+		return x.Did
+	}
+	return ""
+}
+
+func (x *GetPathRequest) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *GetPathRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetOndResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain         `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Ond []*OrchestratedNetworkingDevice `protobuf:"bytes,3,rep,name=ond,proto3" json:"ond,omitempty"`
+}
+
+func (x *GetOndResponse) Reset() {
+	*x = GetOndResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetOndResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOndResponse) ProtoMessage() {}
+
+func (x *GetOndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetOndResponse.ProtoReflect.Descriptor instead.
+func (*GetOndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *GetOndResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetOndResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetOndResponse) GetOnd() []*OrchestratedNetworkingDevice {
+	if x != nil {
+		return x.Ond
+	}
+	return nil
+}
+
+type GetOndListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain         `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Ond []*OrchestratedNetworkingDevice `protobuf:"bytes,3,rep,name=ond,proto3" json:"ond,omitempty"`
+}
+
+func (x *GetOndListResponse) Reset() {
+	*x = GetOndListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetOndListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOndListResponse) ProtoMessage() {}
+
+func (x *GetOndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetOndListResponse.ProtoReflect.Descriptor instead.
+func (*GetOndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *GetOndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetOndListResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetOndListResponse) GetOnd() []*OrchestratedNetworkingDevice {
+	if x != nil {
+		return x.Ond
+	}
+	return nil
+}
+
+type GetSbiResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain           `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Sbi []*southbound.SouthboundInterface `protobuf:"bytes,3,rep,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *GetSbiResponse) Reset() {
+	*x = GetSbiResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSbiResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSbiResponse) ProtoMessage() {}
+
+func (x *GetSbiResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSbiResponse.ProtoReflect.Descriptor instead.
+func (*GetSbiResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *GetSbiResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSbiResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetSbiResponse) GetSbi() []*southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type GetSbiListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain           `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Sbi []*southbound.SouthboundInterface `protobuf:"bytes,3,rep,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *GetSbiListResponse) Reset() {
+	*x = GetSbiListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSbiListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSbiListResponse) ProtoMessage() {}
+
+func (x *GetSbiListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSbiListResponse.ProtoReflect.Descriptor instead.
+func (*GetSbiListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *GetSbiListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSbiListResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetSbiListResponse) GetSbi() []*southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type GetPathResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Device []*gnmi.Notification    `protobuf:"bytes,3,rep,name=device,proto3" json:"device,omitempty"`
+}
+
+func (x *GetPathResponse) Reset() {
+	*x = GetPathResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPathResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPathResponse) ProtoMessage() {}
+
+func (x *GetPathResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPathResponse.ProtoReflect.Descriptor instead.
+func (*GetPathResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *GetPathResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPathResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetPathResponse) GetDevice() []*gnmi.Notification {
+	if x != nil {
+		return x.Device
+	}
+	return nil
+}
+
+type GetChangeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Change []*Change               `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"`
+}
+
+func (x *GetChangeResponse) Reset() {
+	*x = GetChangeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeResponse) ProtoMessage() {}
+
+func (x *GetChangeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeResponse.ProtoReflect.Descriptor instead.
+func (*GetChangeResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *GetChangeResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetChangeResponse) GetChange() []*Change {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+type GetChangeListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Change []*Change               `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"`
+}
+
+func (x *GetChangeListResponse) Reset() {
+	*x = GetChangeListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeListResponse) ProtoMessage() {}
+
+func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeListResponse.ProtoReflect.Descriptor instead.
+func (*GetChangeListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *GetChangeListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeListResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetChangeListResponse) GetChange() []*Change {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+type PrincipalNetworkDomain struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name        string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+}
+
+func (x *PrincipalNetworkDomain) Reset() {
+	*x = PrincipalNetworkDomain{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PrincipalNetworkDomain) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PrincipalNetworkDomain) ProtoMessage() {}
+
+func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PrincipalNetworkDomain.ProtoReflect.Descriptor instead.
+func (*PrincipalNetworkDomain) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *PrincipalNetworkDomain) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *PrincipalNetworkDomain) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *PrincipalNetworkDomain) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+type OrchestratedNetworkingDevice struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id     string                          `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name   string                          `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Device []*gnmi.Notification            `protobuf:"bytes,3,rep,name=device,proto3" json:"device,omitempty"`
+	Sbi    *southbound.SouthboundInterface `protobuf:"bytes,4,opt,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *OrchestratedNetworkingDevice) Reset() {
+	*x = OrchestratedNetworkingDevice{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OrchestratedNetworkingDevice) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrchestratedNetworkingDevice) ProtoMessage() {}
+
+func (x *OrchestratedNetworkingDevice) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OrchestratedNetworkingDevice.ProtoReflect.Descriptor instead.
+func (*OrchestratedNetworkingDevice) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *OrchestratedNetworkingDevice) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *OrchestratedNetworkingDevice) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *OrchestratedNetworkingDevice) GetDevice() []*gnmi.Notification {
+	if x != nil {
+		return x.Device
+	}
+	return nil
+}
+
+func (x *OrchestratedNetworkingDevice) GetSbi() *southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type Change struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id    string      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Age   int64       `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
+	State ChangeState `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.pnd.ChangeState" json:"state,omitempty"`
+}
+
+func (x *Change) Reset() {
+	*x = Change{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Change) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Change) ProtoMessage() {}
+
+func (x *Change) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Change.ProtoReflect.Descriptor instead.
+func (*Change) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *Change) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Change) GetAge() int64 {
+	if x != nil {
+		return x.Age
+	}
+	return 0
+}
+
+func (x *Change) GetState() ChangeState {
+	if x != nil {
+		return x.State
+	}
+	return ChangeState_CHANGE_STATE_UNSPECIFIED
+}
+
+type SetOndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64     `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Ond       []*SetOnd `protobuf:"bytes,2,rep,name=ond,proto3" json:"ond,omitempty"`
+	Pid       string    `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetOndListRequest) Reset() {
+	*x = SetOndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetOndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetOndListRequest) ProtoMessage() {}
+
+func (x *SetOndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetOndListRequest.ProtoReflect.Descriptor instead.
+func (*SetOndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *SetOndListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetOndListRequest) GetOnd() []*SetOnd {
+	if x != nil {
+		return x.Ond
+	}
+	return nil
+}
+
+func (x *SetOndListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetSbiListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64     `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Sbi       []*SetSbi `protobuf:"bytes,2,rep,name=sbi,proto3" json:"sbi,omitempty"`
+	Pid       string    `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetSbiListRequest) Reset() {
+	*x = SetSbiListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetSbiListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetSbiListRequest) ProtoMessage() {}
+
+func (x *SetSbiListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetSbiListRequest.ProtoReflect.Descriptor instead.
+func (*SetSbiListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *SetSbiListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetSbiListRequest) GetSbi() []*SetSbi {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+func (x *SetSbiListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetChangeListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64        `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Change    []*SetChange `protobuf:"bytes,2,rep,name=change,proto3" json:"change,omitempty"`
+	Pid       string       `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetChangeListRequest) Reset() {
+	*x = SetChangeListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChangeListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChangeListRequest) ProtoMessage() {}
+
+func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChangeListRequest.ProtoReflect.Descriptor instead.
+func (*SetChangeListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *SetChangeListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetChangeListRequest) GetChange() []*SetChange {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+func (x *SetChangeListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetPathListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp     int64            `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	ChangeRequest []*ChangeRequest `protobuf:"bytes,2,rep,name=change_request,json=changeRequest,proto3" json:"change_request,omitempty"`
+	Pid           string           `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetPathListRequest) Reset() {
+	*x = SetPathListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetPathListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetPathListRequest) ProtoMessage() {}
+
+func (x *SetPathListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetPathListRequest.ProtoReflect.Descriptor instead.
+func (*SetPathListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *SetPathListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetPathListRequest) GetChangeRequest() []*ChangeRequest {
+	if x != nil {
+		return x.ChangeRequest
+	}
+	return nil
+}
+
+func (x *SetPathListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+//TODO: rename
+type ChangeRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Did   string       `protobuf:"bytes,1,opt,name=did,proto3" json:"did,omitempty"`
+	Path  string       `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
+	Value string       `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
+	ApiOp ApiOperation `protobuf:"varint,4,opt,name=api_op,json=apiOp,proto3,enum=gosdn.pnd.ApiOperation" json:"api_op,omitempty"`
+}
+
+func (x *ChangeRequest) Reset() {
+	*x = ChangeRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChangeRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChangeRequest) ProtoMessage() {}
+
+func (x *ChangeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead.
+func (*ChangeRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *ChangeRequest) GetDid() string {
+	if x != nil {
+		return x.Did
+	}
+	return ""
+}
+
+func (x *ChangeRequest) GetPath() string {
+	if x != nil {
+		return x.Path
+	}
+	return ""
+}
+
+func (x *ChangeRequest) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+func (x *ChangeRequest) GetApiOp() ApiOperation {
+	if x != nil {
+		return x.ApiOp
+	}
+	return ApiOperation_API_OPERATION_UNSPECIFIED
+}
+
+type SetOnd struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address         string                          `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Sbi             *southbound.SouthboundInterface `protobuf:"bytes,2,opt,name=sbi,proto3" json:"sbi,omitempty"`
+	DeviceName      string                          `protobuf:"bytes,3,opt,name=device_name,json=deviceName,proto3" json:"device_name,omitempty"`
+	TransportOption *transport.TransportOption      `protobuf:"bytes,4,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
+}
+
+func (x *SetOnd) Reset() {
+	*x = SetOnd{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetOnd) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetOnd) ProtoMessage() {}
+
+func (x *SetOnd) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetOnd.ProtoReflect.Descriptor instead.
+func (*SetOnd) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *SetOnd) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+func (x *SetOnd) GetSbi() *southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+func (x *SetOnd) GetDeviceName() string {
+	if x != nil {
+		return x.DeviceName
+	}
+	return ""
+}
+
+func (x *SetOnd) GetTransportOption() *transport.TransportOption {
+	if x != nil {
+		return x.TransportOption
+	}
+	return nil
+}
+
+type SetSbi struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SbiType SbiType `protobuf:"varint,1,opt,name=sbi_type,json=sbiType,proto3,enum=gosdn.pnd.SbiType" json:"sbi_type,omitempty"`
+}
+
+func (x *SetSbi) Reset() {
+	*x = SetSbi{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetSbi) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetSbi) ProtoMessage() {}
+
+func (x *SetSbi) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetSbi.ProtoReflect.Descriptor instead.
+func (*SetSbi) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SetSbi) GetSbiType() SbiType {
+	if x != nil {
+		return x.SbiType
+	}
+	return SbiType_SBI_TYPE_UNSPECIFIED
+}
+
+type SetChange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Cuid string    `protobuf:"bytes,1,opt,name=cuid,proto3" json:"cuid,omitempty"`
+	Op   Operation `protobuf:"varint,2,opt,name=op,proto3,enum=gosdn.pnd.Operation" json:"op,omitempty"`
+}
+
+func (x *SetChange) Reset() {
+	*x = SetChange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChange) ProtoMessage() {}
+
+func (x *SetChange) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChange.ProtoReflect.Descriptor instead.
+func (*SetChange) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *SetChange) GetCuid() string {
+	if x != nil {
+		return x.Cuid
+	}
+	return ""
+}
+
+func (x *SetChange) GetOp() Operation {
+	if x != nil {
+		return x.Op
+	}
+	return Operation_OPERATION_UNSPECIFIED
+}
+
+type SetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+}
+
+func (x *SetResponse) Reset() {
+	*x = SetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetResponse) ProtoMessage() {}
+
+func (x *SetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetResponse.ProtoReflect.Descriptor instead.
+func (*SetResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *SetResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+type SetOndListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetOndListResponse) Reset() {
+	*x = SetOndListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetOndListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetOndListResponse) ProtoMessage() {}
+
+func (x *SetOndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetOndListResponse.ProtoReflect.Descriptor instead.
+func (*SetOndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *SetOndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetOndListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetOndListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+type SetChangeListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetChangeListResponse) Reset() {
+	*x = SetChangeListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChangeListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChangeListResponse) ProtoMessage() {}
+
+func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChangeListResponse.ProtoReflect.Descriptor instead.
+func (*SetChangeListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *SetChangeListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetChangeListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetChangeListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+type SetChangeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+}
+
+func (x *SetChangeResponse) Reset() {
+	*x = SetChangeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChangeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChangeResponse) ProtoMessage() {}
+
+func (x *SetChangeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChangeResponse.ProtoReflect.Descriptor instead.
+func (*SetChangeResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *SetChangeResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetChangeResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+type SetSbiListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetSbiListResponse) Reset() {
+	*x = SetSbiListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetSbiListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetSbiListResponse) ProtoMessage() {}
+
+func (x *SetSbiListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetSbiListResponse.ProtoReflect.Descriptor instead.
+func (*SetSbiListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *SetSbiListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetSbiListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetSbiListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+type SetPathListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetPathListResponse) Reset() {
+	*x = SetPathListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetPathListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetPathListResponse) ProtoMessage() {}
+
+func (x *SetPathListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetPathListResponse.ProtoReflect.Descriptor instead.
+func (*SetPathListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *SetPathListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetPathListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetPathListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+type DeleteOndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+	Did       string `protobuf:"bytes,5,opt,name=did,proto3" json:"did,omitempty"`
+}
+
+func (x *DeleteOndRequest) Reset() {
+	*x = DeleteOndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteOndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteOndRequest) ProtoMessage() {}
+
+func (x *DeleteOndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteOndRequest.ProtoReflect.Descriptor instead.
+func (*DeleteOndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *DeleteOndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeleteOndRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+func (x *DeleteOndRequest) GetDid() string {
+	if x != nil {
+		return x.Did
+	}
+	return ""
+}
+
+type DeleteOndResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+}
+
+func (x *DeleteOndResponse) Reset() {
+	*x = DeleteOndResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteOndResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteOndResponse) ProtoMessage() {}
+
+func (x *DeleteOndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeleteOndResponse.ProtoReflect.Descriptor instead.
+func (*DeleteOndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *DeleteOndResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeleteOndResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+var File_gosdn_pnd_pnd_proto protoreflect.FileDescriptor
+
+var file_gosdn_pnd_pnd_proto_rawDesc = []byte{
+	0x0a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70, 0x6e, 0x64, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64,
+	0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,
+	0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x1a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67,
+	0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x0d, 0x47,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69,
+	0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x43,
+	0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x03, 0x73, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x46, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x56,
+	0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x63, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x66, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74,
+	0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x9e,
+	0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12,
+	0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,
+	0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52,
+	0x03, 0x70, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x6f, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,
+	0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x64, 0x22,
+	0xa2, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72,
+	0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x6f, 0x6e, 0x64,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
+	0x6e, 0x64, 0x2e, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e,
+	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
+	0x03, 0x6f, 0x6e, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50,
+	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62,
+	0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03,
+	0x73, 0x62, 0x69, 0x22, 0xa0, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x37, 0x0a,
+	0x03, 0x73, 0x62, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61,
+	0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x2a, 0x0a,
+	0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e,
+	0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x47, 0x65,
+	0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a,
+	0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c,
+	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70,
+	0x6e, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x95, 0x01,
+	0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50,
+	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x5e, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,
+	0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x1c, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+	0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x64, 0x65,
+	0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d,
+	0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06,
+	0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74,
+	0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22,
+	0x58, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x74,
+	0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03,
+	0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x03, 0x6f, 0x6e,
+	0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
+	0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x70,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a,
+	0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
+	0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67,
+	0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x7b, 0x0a, 0x0d, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03,
+	0x64, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x12,
+	0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61,
+	0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x5f,
+	0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x05, 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x74,
+	0x4f, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a,
+	0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76,
+	0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x37, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x12, 0x2d,
+	0x0a, 0x08, 0x73, 0x62, 0x69, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x62, 0x69,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x62, 0x69, 0x54, 0x79, 0x70, 0x65, 0x22, 0x45, 0x0a,
+	0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x24,
+	0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x02, 0x6f, 0x70, 0x22, 0x56, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a,
+	0x12, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09,
+	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x11, 0x53,
+	0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x53, 0x65,
+	0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22,
+	0x94, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
+	0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69,
+	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x11,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12,
+	0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48,
+	0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e,
+	0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47,
+	0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41,
+	0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a,
+	0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43,
+	0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48,
+	0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e,
+	0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69,
+	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49,
+	0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f,
+	0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45,
+	0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54,
+	0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a,
+	0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44,
+	0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x07, 0x53, 0x62, 0x69, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,
+	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13,
+	0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e,
+	0x46, 0x49, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x49, 0x53, 0x45, 0x44, 0x10,
+	0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4c,
+	0x55, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e,
+	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14,
+	0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41,
+	0x54, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f,
+	0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50,
+	0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10,
+	0x03, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53,
+	0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
+	0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b,
+	0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52,
+	0x4f, 0x52, 0x10, 0x02, 0x32, 0xfc, 0x09, 0x0a, 0x0a, 0x50, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65,
+	0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4f,
+	0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x5c, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4f,
+	0x6e, 0x64, 0x12, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12,
+	0x15, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64,
+	0x2f, 0x7b, 0x64, 0x69, 0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64,
+	0x2e, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x70,
+	0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x63,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73,
+	0x62, 0x69, 0x73, 0x12, 0x5d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x12, 0x18, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x70, 0x6e, 0x64,
+	0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x62, 0x69, 0x73, 0x2f, 0x7b, 0x73, 0x69,
+	0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74,
+	0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x62,
+	0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f,
+	0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x62, 0x69, 0x73, 0x12, 0x6f, 0x0a, 0x0d, 0x47, 0x65,
+	0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x6a, 0x0a, 0x09, 0x47,
+	0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73,
+	0x2f, 0x7b, 0x63, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x72, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x43, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x07, 0x47,
+	0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
+	0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65,
+	0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69,
+	0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x64, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61,
+	0x74, 0x68, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x12, 0x6f, 0x0a, 0x0b, 0x53, 0x65,
+	0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b,
+	0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d,
+	0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x66, 0x0a, 0x09, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x64,
+	0x69, 0x64, 0x7d, 0x42, 0xae, 0x02, 0x5a, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69,
+	0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x92, 0x41, 0xfb, 0x01, 0x12, 0xf8, 0x01, 0x0a, 0x10, 0x67, 0x6f,
+	0x53, 0x44, 0x4e, 0x20, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x4d,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20,
+	0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61,
+	0x6e, 0x64, 0x20, 0x47, 0x6f, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+	0x68, 0x65, 0x20, 0x67, 0x6f, 0x53, 0x44, 0x4e, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x62, 0x6f,
+	0x75, 0x6e, 0x64, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x0a,
+	0x18, 0x67, 0x6f, 0x53, 0x44, 0x4e, 0x20, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73,
+	0x3a, 0x2f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61,
+	0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2a, 0x50, 0x0a,
+	0x14, 0x42, 0x53, 0x44, 0x20, 0x33, 0x2d, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69,
+	0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63,
+	0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f,
+	0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x2d, 0x2f, 0x62, 0x6c, 0x6f, 0x62,
+	0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32,
+	0x03, 0x30, 0x2e, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_pnd_pnd_proto_rawDescOnce sync.Once
+	file_gosdn_pnd_pnd_proto_rawDescData = file_gosdn_pnd_pnd_proto_rawDesc
+)
+
+func file_gosdn_pnd_pnd_proto_rawDescGZIP() []byte {
+	file_gosdn_pnd_pnd_proto_rawDescOnce.Do(func() {
+		file_gosdn_pnd_pnd_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_pnd_pnd_proto_rawDescData)
+	})
+	return file_gosdn_pnd_pnd_proto_rawDescData
+}
+
+var file_gosdn_pnd_pnd_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
+var file_gosdn_pnd_pnd_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
+var file_gosdn_pnd_pnd_proto_goTypes = []interface{}{
+	(ChangeState)(0),                       // 0: gosdn.pnd.ChangeState
+	(ApiOperation)(0),                      // 1: gosdn.pnd.ApiOperation
+	(SbiType)(0),                           // 2: gosdn.pnd.SbiType
+	(Operation)(0),                         // 3: gosdn.pnd.Operation
+	(Status)(0),                            // 4: gosdn.pnd.Status
+	(*GetOndListRequest)(nil),              // 5: gosdn.pnd.GetOndListRequest
+	(*GetOndRequest)(nil),                  // 6: gosdn.pnd.GetOndRequest
+	(*GetSbiListRequest)(nil),              // 7: gosdn.pnd.GetSbiListRequest
+	(*GetSbiRequest)(nil),                  // 8: gosdn.pnd.GetSbiRequest
+	(*GetChangeListRequest)(nil),           // 9: gosdn.pnd.GetChangeListRequest
+	(*GetChangeRequest)(nil),               // 10: gosdn.pnd.GetChangeRequest
+	(*GetPathRequest)(nil),                 // 11: gosdn.pnd.GetPathRequest
+	(*GetOndResponse)(nil),                 // 12: gosdn.pnd.GetOndResponse
+	(*GetOndListResponse)(nil),             // 13: gosdn.pnd.GetOndListResponse
+	(*GetSbiResponse)(nil),                 // 14: gosdn.pnd.GetSbiResponse
+	(*GetSbiListResponse)(nil),             // 15: gosdn.pnd.GetSbiListResponse
+	(*GetPathResponse)(nil),                // 16: gosdn.pnd.GetPathResponse
+	(*GetChangeResponse)(nil),              // 17: gosdn.pnd.GetChangeResponse
+	(*GetChangeListResponse)(nil),          // 18: gosdn.pnd.GetChangeListResponse
+	(*PrincipalNetworkDomain)(nil),         // 19: gosdn.pnd.PrincipalNetworkDomain
+	(*OrchestratedNetworkingDevice)(nil),   // 20: gosdn.pnd.OrchestratedNetworkingDevice
+	(*Change)(nil),                         // 21: gosdn.pnd.Change
+	(*SetOndListRequest)(nil),              // 22: gosdn.pnd.SetOndListRequest
+	(*SetSbiListRequest)(nil),              // 23: gosdn.pnd.SetSbiListRequest
+	(*SetChangeListRequest)(nil),           // 24: gosdn.pnd.SetChangeListRequest
+	(*SetPathListRequest)(nil),             // 25: gosdn.pnd.SetPathListRequest
+	(*ChangeRequest)(nil),                  // 26: gosdn.pnd.ChangeRequest
+	(*SetOnd)(nil),                         // 27: gosdn.pnd.SetOnd
+	(*SetSbi)(nil),                         // 28: gosdn.pnd.SetSbi
+	(*SetChange)(nil),                      // 29: gosdn.pnd.SetChange
+	(*SetResponse)(nil),                    // 30: gosdn.pnd.SetResponse
+	(*SetOndListResponse)(nil),             // 31: gosdn.pnd.SetOndListResponse
+	(*SetChangeListResponse)(nil),          // 32: gosdn.pnd.SetChangeListResponse
+	(*SetChangeResponse)(nil),              // 33: gosdn.pnd.SetChangeResponse
+	(*SetSbiListResponse)(nil),             // 34: gosdn.pnd.SetSbiListResponse
+	(*SetPathListResponse)(nil),            // 35: gosdn.pnd.SetPathListResponse
+	(*DeleteOndRequest)(nil),               // 36: gosdn.pnd.DeleteOndRequest
+	(*DeleteOndResponse)(nil),              // 37: gosdn.pnd.DeleteOndResponse
+	(*southbound.SouthboundInterface)(nil), // 38: gosdn.southbound.SouthboundInterface
+	(*gnmi.Notification)(nil),              // 39: gnmi.Notification
+	(*transport.TransportOption)(nil),      // 40: gosdn.transport.TransportOption
+}
+var file_gosdn_pnd_pnd_proto_depIdxs = []int32{
+	19, // 0: gosdn.pnd.GetOndResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	20, // 1: gosdn.pnd.GetOndResponse.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
+	19, // 2: gosdn.pnd.GetOndListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	20, // 3: gosdn.pnd.GetOndListResponse.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
+	19, // 4: gosdn.pnd.GetSbiResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	38, // 5: gosdn.pnd.GetSbiResponse.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	19, // 6: gosdn.pnd.GetSbiListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	38, // 7: gosdn.pnd.GetSbiListResponse.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	19, // 8: gosdn.pnd.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	39, // 9: gosdn.pnd.GetPathResponse.device:type_name -> gnmi.Notification
+	19, // 10: gosdn.pnd.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	21, // 11: gosdn.pnd.GetChangeResponse.change:type_name -> gosdn.pnd.Change
+	19, // 12: gosdn.pnd.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	21, // 13: gosdn.pnd.GetChangeListResponse.change:type_name -> gosdn.pnd.Change
+	39, // 14: gosdn.pnd.OrchestratedNetworkingDevice.device:type_name -> gnmi.Notification
+	38, // 15: gosdn.pnd.OrchestratedNetworkingDevice.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	0,  // 16: gosdn.pnd.Change.state:type_name -> gosdn.pnd.ChangeState
+	27, // 17: gosdn.pnd.SetOndListRequest.ond:type_name -> gosdn.pnd.SetOnd
+	28, // 18: gosdn.pnd.SetSbiListRequest.sbi:type_name -> gosdn.pnd.SetSbi
+	29, // 19: gosdn.pnd.SetChangeListRequest.change:type_name -> gosdn.pnd.SetChange
+	26, // 20: gosdn.pnd.SetPathListRequest.change_request:type_name -> gosdn.pnd.ChangeRequest
+	1,  // 21: gosdn.pnd.ChangeRequest.api_op:type_name -> gosdn.pnd.ApiOperation
+	38, // 22: gosdn.pnd.SetOnd.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	40, // 23: gosdn.pnd.SetOnd.transport_option:type_name -> gosdn.transport.TransportOption
+	2,  // 24: gosdn.pnd.SetSbi.sbi_type:type_name -> gosdn.pnd.SbiType
+	3,  // 25: gosdn.pnd.SetChange.op:type_name -> gosdn.pnd.Operation
+	4,  // 26: gosdn.pnd.SetResponse.status:type_name -> gosdn.pnd.Status
+	4,  // 27: gosdn.pnd.SetOndListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 28: gosdn.pnd.SetOndListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 29: gosdn.pnd.SetChangeListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 30: gosdn.pnd.SetChangeListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 31: gosdn.pnd.SetChangeResponse.status:type_name -> gosdn.pnd.Status
+	4,  // 32: gosdn.pnd.SetSbiListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 33: gosdn.pnd.SetSbiListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 34: gosdn.pnd.SetPathListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 35: gosdn.pnd.SetPathListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 36: gosdn.pnd.DeleteOndResponse.status:type_name -> gosdn.pnd.Status
+	5,  // 37: gosdn.pnd.PndService.GetOndList:input_type -> gosdn.pnd.GetOndListRequest
+	6,  // 38: gosdn.pnd.PndService.GetOnd:input_type -> gosdn.pnd.GetOndRequest
+	22, // 39: gosdn.pnd.PndService.SetOndList:input_type -> gosdn.pnd.SetOndListRequest
+	7,  // 40: gosdn.pnd.PndService.GetSbiList:input_type -> gosdn.pnd.GetSbiListRequest
+	8,  // 41: gosdn.pnd.PndService.GetSbi:input_type -> gosdn.pnd.GetSbiRequest
+	23, // 42: gosdn.pnd.PndService.SetSbiList:input_type -> gosdn.pnd.SetSbiListRequest
+	9,  // 43: gosdn.pnd.PndService.GetChangeList:input_type -> gosdn.pnd.GetChangeListRequest
+	10, // 44: gosdn.pnd.PndService.GetChange:input_type -> gosdn.pnd.GetChangeRequest
+	24, // 45: gosdn.pnd.PndService.SetChangeList:input_type -> gosdn.pnd.SetChangeListRequest
+	11, // 46: gosdn.pnd.PndService.GetPath:input_type -> gosdn.pnd.GetPathRequest
+	25, // 47: gosdn.pnd.PndService.SetPathList:input_type -> gosdn.pnd.SetPathListRequest
+	36, // 48: gosdn.pnd.PndService.DeleteOnd:input_type -> gosdn.pnd.DeleteOndRequest
+	13, // 49: gosdn.pnd.PndService.GetOndList:output_type -> gosdn.pnd.GetOndListResponse
+	12, // 50: gosdn.pnd.PndService.GetOnd:output_type -> gosdn.pnd.GetOndResponse
+	31, // 51: gosdn.pnd.PndService.SetOndList:output_type -> gosdn.pnd.SetOndListResponse
+	15, // 52: gosdn.pnd.PndService.GetSbiList:output_type -> gosdn.pnd.GetSbiListResponse
+	14, // 53: gosdn.pnd.PndService.GetSbi:output_type -> gosdn.pnd.GetSbiResponse
+	34, // 54: gosdn.pnd.PndService.SetSbiList:output_type -> gosdn.pnd.SetSbiListResponse
+	18, // 55: gosdn.pnd.PndService.GetChangeList:output_type -> gosdn.pnd.GetChangeListResponse
+	17, // 56: gosdn.pnd.PndService.GetChange:output_type -> gosdn.pnd.GetChangeResponse
+	32, // 57: gosdn.pnd.PndService.SetChangeList:output_type -> gosdn.pnd.SetChangeListResponse
+	16, // 58: gosdn.pnd.PndService.GetPath:output_type -> gosdn.pnd.GetPathResponse
+	35, // 59: gosdn.pnd.PndService.SetPathList:output_type -> gosdn.pnd.SetPathListResponse
+	37, // 60: gosdn.pnd.PndService.DeleteOnd:output_type -> gosdn.pnd.DeleteOndResponse
+	49, // [49:61] is the sub-list for method output_type
+	37, // [37:49] is the sub-list for method input_type
+	37, // [37:37] is the sub-list for extension type_name
+	37, // [37:37] is the sub-list for extension extendee
+	0,  // [0:37] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_pnd_pnd_proto_init() }
+func file_gosdn_pnd_pnd_proto_init() {
+	if File_gosdn_pnd_pnd_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_pnd_pnd_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetOndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetOndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSbiListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSbiRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChangeListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChangeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPathRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetOndResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetOndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSbiResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSbiListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPathResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChangeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChangeListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PrincipalNetworkDomain); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OrchestratedNetworkingDevice); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Change); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetOndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbiListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPathListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChangeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetOnd); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbi); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetOndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbiListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPathListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteOndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteOndResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_pnd_pnd_proto_rawDesc,
+			NumEnums:      5,
+			NumMessages:   33,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_gosdn_pnd_pnd_proto_goTypes,
+		DependencyIndexes: file_gosdn_pnd_pnd_proto_depIdxs,
+		EnumInfos:         file_gosdn_pnd_pnd_proto_enumTypes,
+		MessageInfos:      file_gosdn_pnd_pnd_proto_msgTypes,
+	}.Build()
+	File_gosdn_pnd_pnd_proto = out.File
+	file_gosdn_pnd_pnd_proto_rawDesc = nil
+	file_gosdn_pnd_pnd_proto_goTypes = nil
+	file_gosdn_pnd_pnd_proto_depIdxs = nil
+}
diff --git a/api/go/gosdn/pnd/pnd.pb.gw.go b/api/go/gosdn/pnd/pnd.pb.gw.go
new file mode 100644
index 0000000000000000000000000000000000000000..2b75200c8fad1fa6fe38831ee7293ad358a82c8b
--- /dev/null
+++ b/api/go/gosdn/pnd/pnd.pb.gw.go
@@ -0,0 +1,1602 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: gosdn/pnd/pnd.proto
+
+/*
+Package pnd is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package pnd
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/metadata"
+	"google.golang.org/grpc/status"
+	"google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+var (
+	filter_PndService_GetOndList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetOndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetOndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetOndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetOndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetOnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetOnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetOnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetOnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetOnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetOndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetOndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetOndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetOndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetSbiList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbiList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetSbiList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbiList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetSbiList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetSbi_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "sid": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetSbi_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["sid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sid")
+	}
+
+	protoReq.Sid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbi_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetSbi(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetSbi_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["sid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sid")
+	}
+
+	protoReq.Sid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbi_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetSbi(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetSbiList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetSbiList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetChangeList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChangeList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChangeList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetChangeList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetChange_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "cuid": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["cuid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid")
+	}
+
+	protoReq.Cuid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChange_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetChange(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["cuid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid")
+	}
+
+	protoReq.Cuid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChange_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetChange(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetChangeList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1, "path": 2}, Base: []int{1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 3, 4}}
+)
+
+func request_PndService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPathRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	val, ok = pathParams["path"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path")
+	}
+
+	protoReq.Path, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPath_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPath(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPathRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	val, ok = pathParams["path"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path")
+	}
+
+	protoReq.Path, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPath_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPath(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetPathListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetPathList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetPathListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetPathList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_DeleteOnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_DeleteOnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeleteOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeleteOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.DeleteOnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_DeleteOnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeleteOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeleteOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.DeleteOnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+// RegisterPndServiceHandlerServer registers the http handlers for service PndService to "mux".
+// UnaryRPC     :call PndServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPndServiceHandlerFromEndpoint instead.
+func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PndServiceServer) error {
+
+	mux.Handle("GET", pattern_PndService_GetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetOndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/ond/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetOnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetOndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetSbiList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbi_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbi", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis/{sid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetSbi_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbi_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetSbiList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetChangeList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChange", runtime.WithHTTPPathPattern("/pnds/{pid}/changes/{cuid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetChange_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChange_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetChangeList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPath", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}/paths/{path}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetPath_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetPath_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetPathList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/paths"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetPathList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetPathList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_PndService_DeleteOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/DeleteOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_DeleteOnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_DeleteOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+// RegisterPndServiceHandlerFromEndpoint is same as RegisterPndServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterPndServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterPndServiceHandler(ctx, mux, conn)
+}
+
+// RegisterPndServiceHandler registers the http handlers for service PndService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterPndServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterPndServiceHandlerClient(ctx, mux, NewPndServiceClient(conn))
+}
+
+// RegisterPndServiceHandlerClient registers the http handlers for service PndService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PndServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PndServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "PndServiceClient" to call the correct interceptors.
+func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PndServiceClient) error {
+
+	mux.Handle("GET", pattern_PndService_GetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetOndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/ond/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetOnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetOndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetSbiList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbi_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbi", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis/{sid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetSbi_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbi_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetSbiList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetChangeList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChange", runtime.WithHTTPPathPattern("/pnds/{pid}/changes/{cuid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetChange_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChange_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetChangeList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPath", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}/paths/{path}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetPath_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetPath_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetPathList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/paths"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetPathList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetPathList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_PndService_DeleteOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/DeleteOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_DeleteOnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_DeleteOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_PndService_GetOndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "onds"}, ""))
+
+	pattern_PndService_GetOnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "ond", "did"}, ""))
+
+	pattern_PndService_SetOndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "onds"}, ""))
+
+	pattern_PndService_GetSbiList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "sbis"}, ""))
+
+	pattern_PndService_GetSbi_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "sbis", "sid"}, ""))
+
+	pattern_PndService_SetSbiList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "sbis"}, ""))
+
+	pattern_PndService_GetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "changes"}, ""))
+
+	pattern_PndService_GetChange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "changes", "cuid"}, ""))
+
+	pattern_PndService_SetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "changes"}, ""))
+
+	pattern_PndService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"pnds", "pid", "onds", "did", "paths", "path"}, ""))
+
+	pattern_PndService_SetPathList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"pnds", "pid", "onds", "paths"}, ""))
+
+	pattern_PndService_DeleteOnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "onds", "did"}, ""))
+)
+
+var (
+	forward_PndService_GetOndList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetOnd_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetOndList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetSbiList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetSbi_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetSbiList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetChangeList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetChange_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetChangeList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetPath_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetPathList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_DeleteOnd_0 = runtime.ForwardResponseMessage
+)
diff --git a/api/go/gosdn/pnd/pnd_grpc.pb.go b/api/go/gosdn/pnd/pnd_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..bc681280de05002ce2a8bcacb94bd30e6e03cc44
--- /dev/null
+++ b/api/go/gosdn/pnd/pnd_grpc.pb.go
@@ -0,0 +1,539 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package pnd
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// PndServiceClient is the client API for PndService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type PndServiceClient interface {
+	// Allows to request all Orchestrated Networking Devices which are managed by a
+	// specific Principal Network Domain.
+	GetOndList(ctx context.Context, in *GetOndListRequest, opts ...grpc.CallOption) (*GetOndListResponse, error)
+	// Allows to request a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	GetOnd(ctx context.Context, in *GetOndRequest, opts ...grpc.CallOption) (*GetOndResponse, error)
+	// Allows add multiple Orchestrated Networking Devices to be managed by a
+	// specific Principal Network Domain.
+	SetOndList(ctx context.Context, in *SetOndListRequest, opts ...grpc.CallOption) (*SetOndListResponse, error)
+	// Allows to request all Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbiList(ctx context.Context, in *GetSbiListRequest, opts ...grpc.CallOption) (*GetSbiListResponse, error)
+	// Allows to request a specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbi(ctx context.Context, in *GetSbiRequest, opts ...grpc.CallOption) (*GetSbiResponse, error)
+	// Allows to add multiple specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	SetSbiList(ctx context.Context, in *SetSbiListRequest, opts ...grpc.CallOption) (*SetSbiListResponse, error)
+	// Allows to request all Changes registered for a specific Principal Network Domain.
+	GetChangeList(ctx context.Context, in *GetChangeListRequest, opts ...grpc.CallOption) (*GetChangeListResponse, error)
+	// Allows to request a specific Change registered for a specific Principal Network Domain.
+	GetChange(ctx context.Context, in *GetChangeRequest, opts ...grpc.CallOption) (*GetChangeResponse, error)
+	// Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+	SetChangeList(ctx context.Context, in *SetChangeListRequest, opts ...grpc.CallOption) (*SetChangeListResponse, error)
+	// Allows to request a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	GetPath(ctx context.Context, in *GetPathRequest, opts ...grpc.CallOption) (*GetPathResponse, error)
+	// Allows to set a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	SetPathList(ctx context.Context, in *SetPathListRequest, opts ...grpc.CallOption) (*SetPathListResponse, error)
+	// Allows to delete a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	DeleteOnd(ctx context.Context, in *DeleteOndRequest, opts ...grpc.CallOption) (*DeleteOndResponse, error)
+}
+
+type pndServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewPndServiceClient(cc grpc.ClientConnInterface) PndServiceClient {
+	return &pndServiceClient{cc}
+}
+
+func (c *pndServiceClient) GetOndList(ctx context.Context, in *GetOndListRequest, opts ...grpc.CallOption) (*GetOndListResponse, error) {
+	out := new(GetOndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetOndList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetOnd(ctx context.Context, in *GetOndRequest, opts ...grpc.CallOption) (*GetOndResponse, error) {
+	out := new(GetOndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetOnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetOndList(ctx context.Context, in *SetOndListRequest, opts ...grpc.CallOption) (*SetOndListResponse, error) {
+	out := new(SetOndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetOndList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetSbiList(ctx context.Context, in *GetSbiListRequest, opts ...grpc.CallOption) (*GetSbiListResponse, error) {
+	out := new(GetSbiListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetSbiList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetSbi(ctx context.Context, in *GetSbiRequest, opts ...grpc.CallOption) (*GetSbiResponse, error) {
+	out := new(GetSbiResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetSbi", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetSbiList(ctx context.Context, in *SetSbiListRequest, opts ...grpc.CallOption) (*SetSbiListResponse, error) {
+	out := new(SetSbiListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetSbiList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetChangeList(ctx context.Context, in *GetChangeListRequest, opts ...grpc.CallOption) (*GetChangeListResponse, error) {
+	out := new(GetChangeListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetChangeList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetChange(ctx context.Context, in *GetChangeRequest, opts ...grpc.CallOption) (*GetChangeResponse, error) {
+	out := new(GetChangeResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetChange", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetChangeList(ctx context.Context, in *SetChangeListRequest, opts ...grpc.CallOption) (*SetChangeListResponse, error) {
+	out := new(SetChangeListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetChangeList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetPath(ctx context.Context, in *GetPathRequest, opts ...grpc.CallOption) (*GetPathResponse, error) {
+	out := new(GetPathResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetPath", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetPathList(ctx context.Context, in *SetPathListRequest, opts ...grpc.CallOption) (*SetPathListResponse, error) {
+	out := new(SetPathListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetPathList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) DeleteOnd(ctx context.Context, in *DeleteOndRequest, opts ...grpc.CallOption) (*DeleteOndResponse, error) {
+	out := new(DeleteOndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/DeleteOnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PndServiceServer is the server API for PndService service.
+// All implementations must embed UnimplementedPndServiceServer
+// for forward compatibility
+type PndServiceServer interface {
+	// Allows to request all Orchestrated Networking Devices which are managed by a
+	// specific Principal Network Domain.
+	GetOndList(context.Context, *GetOndListRequest) (*GetOndListResponse, error)
+	// Allows to request a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	GetOnd(context.Context, *GetOndRequest) (*GetOndResponse, error)
+	// Allows add multiple Orchestrated Networking Devices to be managed by a
+	// specific Principal Network Domain.
+	SetOndList(context.Context, *SetOndListRequest) (*SetOndListResponse, error)
+	// Allows to request all Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbiList(context.Context, *GetSbiListRequest) (*GetSbiListResponse, error)
+	// Allows to request a specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbi(context.Context, *GetSbiRequest) (*GetSbiResponse, error)
+	// Allows to add multiple specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	SetSbiList(context.Context, *SetSbiListRequest) (*SetSbiListResponse, error)
+	// Allows to request all Changes registered for a specific Principal Network Domain.
+	GetChangeList(context.Context, *GetChangeListRequest) (*GetChangeListResponse, error)
+	// Allows to request a specific Change registered for a specific Principal Network Domain.
+	GetChange(context.Context, *GetChangeRequest) (*GetChangeResponse, error)
+	// Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+	SetChangeList(context.Context, *SetChangeListRequest) (*SetChangeListResponse, error)
+	// Allows to request a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	GetPath(context.Context, *GetPathRequest) (*GetPathResponse, error)
+	// Allows to set a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	SetPathList(context.Context, *SetPathListRequest) (*SetPathListResponse, error)
+	// Allows to delete a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	DeleteOnd(context.Context, *DeleteOndRequest) (*DeleteOndResponse, error)
+	mustEmbedUnimplementedPndServiceServer()
+}
+
+// UnimplementedPndServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedPndServiceServer struct {
+}
+
+func (UnimplementedPndServiceServer) GetOndList(context.Context, *GetOndListRequest) (*GetOndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOndList not implemented")
+}
+func (UnimplementedPndServiceServer) GetOnd(context.Context, *GetOndRequest) (*GetOndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOnd not implemented")
+}
+func (UnimplementedPndServiceServer) SetOndList(context.Context, *SetOndListRequest) (*SetOndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetOndList not implemented")
+}
+func (UnimplementedPndServiceServer) GetSbiList(context.Context, *GetSbiListRequest) (*GetSbiListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSbiList not implemented")
+}
+func (UnimplementedPndServiceServer) GetSbi(context.Context, *GetSbiRequest) (*GetSbiResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSbi not implemented")
+}
+func (UnimplementedPndServiceServer) SetSbiList(context.Context, *SetSbiListRequest) (*SetSbiListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetSbiList not implemented")
+}
+func (UnimplementedPndServiceServer) GetChangeList(context.Context, *GetChangeListRequest) (*GetChangeListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetChangeList not implemented")
+}
+func (UnimplementedPndServiceServer) GetChange(context.Context, *GetChangeRequest) (*GetChangeResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetChange not implemented")
+}
+func (UnimplementedPndServiceServer) SetChangeList(context.Context, *SetChangeListRequest) (*SetChangeListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetChangeList not implemented")
+}
+func (UnimplementedPndServiceServer) GetPath(context.Context, *GetPathRequest) (*GetPathResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPath not implemented")
+}
+func (UnimplementedPndServiceServer) SetPathList(context.Context, *SetPathListRequest) (*SetPathListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetPathList not implemented")
+}
+func (UnimplementedPndServiceServer) DeleteOnd(context.Context, *DeleteOndRequest) (*DeleteOndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteOnd not implemented")
+}
+func (UnimplementedPndServiceServer) mustEmbedUnimplementedPndServiceServer() {}
+
+// UnsafePndServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to PndServiceServer will
+// result in compilation errors.
+type UnsafePndServiceServer interface {
+	mustEmbedUnimplementedPndServiceServer()
+}
+
+func RegisterPndServiceServer(s grpc.ServiceRegistrar, srv PndServiceServer) {
+	s.RegisterService(&PndService_ServiceDesc, srv)
+}
+
+func _PndService_GetOndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetOndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetOndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetOndList(ctx, req.(*GetOndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetOnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetOnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetOnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetOnd(ctx, req.(*GetOndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_SetOndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetOndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetOndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetOndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetOndList(ctx, req.(*SetOndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetSbiList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSbiListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetSbiList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetSbiList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetSbiList(ctx, req.(*GetSbiListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetSbi_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSbiRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetSbi(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetSbi",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetSbi(ctx, req.(*GetSbiRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_SetSbiList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetSbiListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetSbiList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetSbiList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetSbiList(ctx, req.(*SetSbiListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetChangeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetChangeListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetChangeList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetChangeList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetChangeList(ctx, req.(*GetChangeListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetChange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetChangeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetChange(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetChange",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetChange(ctx, req.(*GetChangeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_SetChangeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetChangeListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetChangeList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetChangeList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetChangeList(ctx, req.(*SetChangeListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetPath_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPathRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetPath(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetPath",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetPath(ctx, req.(*GetPathRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_SetPathList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetPathListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetPathList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetPathList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetPathList(ctx, req.(*SetPathListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_DeleteOnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteOndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).DeleteOnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/DeleteOnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).DeleteOnd(ctx, req.(*DeleteOndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// PndService_ServiceDesc is the grpc.ServiceDesc for PndService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var PndService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.pnd.PndService",
+	HandlerType: (*PndServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetOndList",
+			Handler:    _PndService_GetOndList_Handler,
+		},
+		{
+			MethodName: "GetOnd",
+			Handler:    _PndService_GetOnd_Handler,
+		},
+		{
+			MethodName: "SetOndList",
+			Handler:    _PndService_SetOndList_Handler,
+		},
+		{
+			MethodName: "GetSbiList",
+			Handler:    _PndService_GetSbiList_Handler,
+		},
+		{
+			MethodName: "GetSbi",
+			Handler:    _PndService_GetSbi_Handler,
+		},
+		{
+			MethodName: "SetSbiList",
+			Handler:    _PndService_SetSbiList_Handler,
+		},
+		{
+			MethodName: "GetChangeList",
+			Handler:    _PndService_GetChangeList_Handler,
+		},
+		{
+			MethodName: "GetChange",
+			Handler:    _PndService_GetChange_Handler,
+		},
+		{
+			MethodName: "SetChangeList",
+			Handler:    _PndService_SetChangeList_Handler,
+		},
+		{
+			MethodName: "GetPath",
+			Handler:    _PndService_GetPath_Handler,
+		},
+		{
+			MethodName: "SetPathList",
+			Handler:    _PndService_SetPathList_Handler,
+		},
+		{
+			MethodName: "DeleteOnd",
+			Handler:    _PndService_DeleteOnd_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "gosdn/pnd/pnd.proto",
+}
diff --git a/api/go/gosdn/southbound/southbound.pb.go b/api/go/gosdn/southbound/southbound.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..c5bf59e44df5df43a6602d86b56aeb9251f21f08
--- /dev/null
+++ b/api/go/gosdn/southbound/southbound.pb.go
@@ -0,0 +1,375 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
+// source: gosdn/southbound/southbound.proto
+
+package southbound
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	_ "google.golang.org/protobuf/types/descriptorpb"
+	reflect "reflect"
+	sync "sync"
+)
+
+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)
+)
+
+// Changed according to style guide:
+// https://docs.buf.build/best-practices/style-guide#enums
+type Type int32
+
+const (
+	Type_TYPE_UNSPECIFIED   Type = 0
+	Type_TYPE_OPENCONFIG    Type = 1
+	Type_TYPE_CONTAINERISED Type = 2
+	Type_TYPE_PLUGIN        Type = 3
+)
+
+// Enum value maps for Type.
+var (
+	Type_name = map[int32]string{
+		0: "TYPE_UNSPECIFIED",
+		1: "TYPE_OPENCONFIG",
+		2: "TYPE_CONTAINERISED",
+		3: "TYPE_PLUGIN",
+	}
+	Type_value = map[string]int32{
+		"TYPE_UNSPECIFIED":   0,
+		"TYPE_OPENCONFIG":    1,
+		"TYPE_CONTAINERISED": 2,
+		"TYPE_PLUGIN":        3,
+	}
+)
+
+func (x Type) Enum() *Type {
+	p := new(Type)
+	*p = x
+	return p
+}
+
+func (x Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_gosdn_southbound_southbound_proto_enumTypes[0].Descriptor()
+}
+
+func (Type) Type() protoreflect.EnumType {
+	return &file_gosdn_southbound_southbound_proto_enumTypes[0]
+}
+
+func (x Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Type.Descriptor instead.
+func (Type) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{0}
+}
+
+type GetSchemaRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	Pid       string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"`
+	Sid       string `protobuf:"bytes,3,opt,name=sid,proto3" json:"sid,omitempty"`
+}
+
+func (x *GetSchemaRequest) Reset() {
+	*x = GetSchemaRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_southbound_southbound_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSchemaRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSchemaRequest) ProtoMessage() {}
+
+func (x *GetSchemaRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_southbound_southbound_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSchemaRequest.ProtoReflect.Descriptor instead.
+func (*GetSchemaRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *GetSchemaRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSchemaRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+func (x *GetSchemaRequest) GetSid() string {
+	if x != nil {
+		return x.Sid
+	}
+	return ""
+}
+
+type Payload struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"`
+}
+
+func (x *Payload) Reset() {
+	*x = Payload{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_southbound_southbound_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Payload) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Payload) ProtoMessage() {}
+
+func (x *Payload) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_southbound_southbound_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Payload.ProtoReflect.Descriptor instead.
+func (*Payload) Descriptor() ([]byte, []int) {
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Payload) GetChunk() []byte {
+	if x != nil {
+		return x.Chunk
+	}
+	return nil
+}
+
+type SouthboundInterface struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id   string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Type Type   `protobuf:"varint,2,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"`
+}
+
+func (x *SouthboundInterface) Reset() {
+	*x = SouthboundInterface{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_southbound_southbound_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SouthboundInterface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SouthboundInterface) ProtoMessage() {}
+
+func (x *SouthboundInterface) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_southbound_southbound_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SouthboundInterface.ProtoReflect.Descriptor instead.
+func (*SouthboundInterface) Descriptor() ([]byte, []int) {
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *SouthboundInterface) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *SouthboundInterface) GetType() Type {
+	if x != nil {
+		return x.Type
+	}
+	return Type_TYPE_UNSPECIFIED
+}
+
+var File_gosdn_southbound_southbound_proto protoreflect.FileDescriptor
+
+var file_gosdn_southbound_southbound_proto_rawDesc = []byte{
+	0x0a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75,
+	0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x12, 0x10, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,
+	0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x54, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63,
+	0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x64, 0x22, 0x1f, 0x0a,
+	0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e,
+	0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x51,
+	0x0a, 0x13, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74,
+	0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x2a, 0x5a, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x13, 0x0a, 0x0f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e, 0x46,
+	0x49, 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e,
+	0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x49, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b,
+	0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4c, 0x55, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x32, 0x5a, 0x0a,
+	0x0a, 0x53, 0x62, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x47,
+	0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53,
+	0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e,
+	0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x42, 0x36, 0x5a, 0x34, 0x63, 0x6f, 0x64,
+	0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61,
+	0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
+	0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_southbound_southbound_proto_rawDescOnce sync.Once
+	file_gosdn_southbound_southbound_proto_rawDescData = file_gosdn_southbound_southbound_proto_rawDesc
+)
+
+func file_gosdn_southbound_southbound_proto_rawDescGZIP() []byte {
+	file_gosdn_southbound_southbound_proto_rawDescOnce.Do(func() {
+		file_gosdn_southbound_southbound_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_southbound_southbound_proto_rawDescData)
+	})
+	return file_gosdn_southbound_southbound_proto_rawDescData
+}
+
+var file_gosdn_southbound_southbound_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_gosdn_southbound_southbound_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_gosdn_southbound_southbound_proto_goTypes = []interface{}{
+	(Type)(0),                   // 0: gosdn.southbound.Type
+	(*GetSchemaRequest)(nil),    // 1: gosdn.southbound.GetSchemaRequest
+	(*Payload)(nil),             // 2: gosdn.southbound.Payload
+	(*SouthboundInterface)(nil), // 3: gosdn.southbound.SouthboundInterface
+}
+var file_gosdn_southbound_southbound_proto_depIdxs = []int32{
+	0, // 0: gosdn.southbound.SouthboundInterface.type:type_name -> gosdn.southbound.Type
+	1, // 1: gosdn.southbound.SbiService.GetSchema:input_type -> gosdn.southbound.GetSchemaRequest
+	2, // 2: gosdn.southbound.SbiService.GetSchema:output_type -> gosdn.southbound.Payload
+	2, // [2:3] is the sub-list for method output_type
+	1, // [1:2] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_southbound_southbound_proto_init() }
+func file_gosdn_southbound_southbound_proto_init() {
+	if File_gosdn_southbound_southbound_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_southbound_southbound_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetSchemaRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_southbound_southbound_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Payload); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_southbound_southbound_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SouthboundInterface); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_southbound_southbound_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_gosdn_southbound_southbound_proto_goTypes,
+		DependencyIndexes: file_gosdn_southbound_southbound_proto_depIdxs,
+		EnumInfos:         file_gosdn_southbound_southbound_proto_enumTypes,
+		MessageInfos:      file_gosdn_southbound_southbound_proto_msgTypes,
+	}.Build()
+	File_gosdn_southbound_southbound_proto = out.File
+	file_gosdn_southbound_southbound_proto_rawDesc = nil
+	file_gosdn_southbound_southbound_proto_goTypes = nil
+	file_gosdn_southbound_southbound_proto_depIdxs = nil
+}
diff --git a/api/go/gosdn/southbound/southbound_grpc.pb.go b/api/go/gosdn/southbound/southbound_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..aaa62e6d2f844642c28df5b568883b7f96a61482
--- /dev/null
+++ b/api/go/gosdn/southbound/southbound_grpc.pb.go
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+
+package southbound
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// SbiServiceClient is the client API for SbiService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SbiServiceClient interface {
+	GetSchema(ctx context.Context, in *GetSchemaRequest, opts ...grpc.CallOption) (SbiService_GetSchemaClient, error)
+}
+
+type sbiServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSbiServiceClient(cc grpc.ClientConnInterface) SbiServiceClient {
+	return &sbiServiceClient{cc}
+}
+
+func (c *sbiServiceClient) GetSchema(ctx context.Context, in *GetSchemaRequest, opts ...grpc.CallOption) (SbiService_GetSchemaClient, error) {
+	stream, err := c.cc.NewStream(ctx, &SbiService_ServiceDesc.Streams[0], "/gosdn.southbound.SbiService/GetSchema", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &sbiServiceGetSchemaClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type SbiService_GetSchemaClient interface {
+	Recv() (*Payload, error)
+	grpc.ClientStream
+}
+
+type sbiServiceGetSchemaClient struct {
+	grpc.ClientStream
+}
+
+func (x *sbiServiceGetSchemaClient) Recv() (*Payload, error) {
+	m := new(Payload)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// SbiServiceServer is the server API for SbiService service.
+// All implementations must embed UnimplementedSbiServiceServer
+// for forward compatibility
+type SbiServiceServer interface {
+	GetSchema(*GetSchemaRequest, SbiService_GetSchemaServer) error
+	mustEmbedUnimplementedSbiServiceServer()
+}
+
+// UnimplementedSbiServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedSbiServiceServer struct {
+}
+
+func (UnimplementedSbiServiceServer) GetSchema(*GetSchemaRequest, SbiService_GetSchemaServer) error {
+	return status.Errorf(codes.Unimplemented, "method GetSchema not implemented")
+}
+func (UnimplementedSbiServiceServer) mustEmbedUnimplementedSbiServiceServer() {}
+
+// UnsafeSbiServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SbiServiceServer will
+// result in compilation errors.
+type UnsafeSbiServiceServer interface {
+	mustEmbedUnimplementedSbiServiceServer()
+}
+
+func RegisterSbiServiceServer(s grpc.ServiceRegistrar, srv SbiServiceServer) {
+	s.RegisterService(&SbiService_ServiceDesc, srv)
+}
+
+func _SbiService_GetSchema_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(GetSchemaRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(SbiServiceServer).GetSchema(m, &sbiServiceGetSchemaServer{stream})
+}
+
+type SbiService_GetSchemaServer interface {
+	Send(*Payload) error
+	grpc.ServerStream
+}
+
+type sbiServiceGetSchemaServer struct {
+	grpc.ServerStream
+}
+
+func (x *sbiServiceGetSchemaServer) Send(m *Payload) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+// SbiService_ServiceDesc is the grpc.ServiceDesc for SbiService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SbiService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.southbound.SbiService",
+	HandlerType: (*SbiServiceServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "GetSchema",
+			Handler:       _SbiService_GetSchema_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "gosdn/southbound/southbound.proto",
+}
diff --git a/api/go/gosdn/transport/transport.pb.go b/api/go/gosdn/transport/transport.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..b0db7a4d3273a960d2f037d493df6c7bea30ae2e
--- /dev/null
+++ b/api/go/gosdn/transport/transport.pb.go
@@ -0,0 +1,418 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
+// source: gosdn/transport/transport.proto
+
+package transport
+
+import (
+	southbound "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	_ "google.golang.org/protobuf/types/descriptorpb"
+	reflect "reflect"
+	sync "sync"
+)
+
+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 TransportOption struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Address  string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
+	Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"`
+	Tls      bool   `protobuf:"varint,4,opt,name=tls,proto3" json:"tls,omitempty"`
+	// Types that are assignable to TransportOption:
+	//	*TransportOption_GnmiTransportOption
+	//	*TransportOption_RestconfTransportOption
+	TransportOption isTransportOption_TransportOption `protobuf_oneof:"transport_option"`
+	Type            southbound.Type                   `protobuf:"varint,7,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"`
+}
+
+func (x *TransportOption) Reset() {
+	*x = TransportOption{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_transport_transport_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TransportOption) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TransportOption) ProtoMessage() {}
+
+func (x *TransportOption) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_transport_transport_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use TransportOption.ProtoReflect.Descriptor instead.
+func (*TransportOption) Descriptor() ([]byte, []int) {
+	return file_gosdn_transport_transport_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *TransportOption) GetAddress() string {
+	if x != nil {
+		return x.Address
+	}
+	return ""
+}
+
+func (x *TransportOption) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *TransportOption) GetPassword() string {
+	if x != nil {
+		return x.Password
+	}
+	return ""
+}
+
+func (x *TransportOption) GetTls() bool {
+	if x != nil {
+		return x.Tls
+	}
+	return false
+}
+
+func (m *TransportOption) GetTransportOption() isTransportOption_TransportOption {
+	if m != nil {
+		return m.TransportOption
+	}
+	return nil
+}
+
+func (x *TransportOption) GetGnmiTransportOption() *GnmiTransportOption {
+	if x, ok := x.GetTransportOption().(*TransportOption_GnmiTransportOption); ok {
+		return x.GnmiTransportOption
+	}
+	return nil
+}
+
+func (x *TransportOption) GetRestconfTransportOption() *RestconfTransportOption {
+	if x, ok := x.GetTransportOption().(*TransportOption_RestconfTransportOption); ok {
+		return x.RestconfTransportOption
+	}
+	return nil
+}
+
+func (x *TransportOption) GetType() southbound.Type {
+	if x != nil {
+		return x.Type
+	}
+	return southbound.Type(0)
+}
+
+type isTransportOption_TransportOption interface {
+	isTransportOption_TransportOption()
+}
+
+type TransportOption_GnmiTransportOption struct {
+	GnmiTransportOption *GnmiTransportOption `protobuf:"bytes,5,opt,name=gnmi_transport_option,json=gnmiTransportOption,proto3,oneof"`
+}
+
+type TransportOption_RestconfTransportOption struct {
+	RestconfTransportOption *RestconfTransportOption `protobuf:"bytes,6,opt,name=restconf_transport_option,json=restconfTransportOption,proto3,oneof"`
+}
+
+func (*TransportOption_GnmiTransportOption) isTransportOption_TransportOption() {}
+
+func (*TransportOption_RestconfTransportOption) isTransportOption_TransportOption() {}
+
+type GnmiTransportOption struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Compression     string            `protobuf:"bytes,1,opt,name=compression,proto3" json:"compression,omitempty"`
+	GrpcDialOptions map[string]string `protobuf:"bytes,2,rep,name=grpc_dial_options,json=grpcDialOptions,proto3" json:"grpc_dial_options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Token           string            `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
+	Encoding        gnmi.Encoding     `protobuf:"varint,4,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"`
+}
+
+func (x *GnmiTransportOption) Reset() {
+	*x = GnmiTransportOption{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_transport_transport_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GnmiTransportOption) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GnmiTransportOption) ProtoMessage() {}
+
+func (x *GnmiTransportOption) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_transport_transport_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GnmiTransportOption.ProtoReflect.Descriptor instead.
+func (*GnmiTransportOption) Descriptor() ([]byte, []int) {
+	return file_gosdn_transport_transport_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GnmiTransportOption) GetCompression() string {
+	if x != nil {
+		return x.Compression
+	}
+	return ""
+}
+
+func (x *GnmiTransportOption) GetGrpcDialOptions() map[string]string {
+	if x != nil {
+		return x.GrpcDialOptions
+	}
+	return nil
+}
+
+func (x *GnmiTransportOption) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *GnmiTransportOption) GetEncoding() gnmi.Encoding {
+	if x != nil {
+		return x.Encoding
+	}
+	return gnmi.Encoding(0)
+}
+
+type RestconfTransportOption struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RestconfTransportOption) Reset() {
+	*x = RestconfTransportOption{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_transport_transport_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RestconfTransportOption) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RestconfTransportOption) ProtoMessage() {}
+
+func (x *RestconfTransportOption) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_transport_transport_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use RestconfTransportOption.ProtoReflect.Descriptor instead.
+func (*RestconfTransportOption) Descriptor() ([]byte, []int) {
+	return file_gosdn_transport_transport_proto_rawDescGZIP(), []int{2}
+}
+
+var File_gosdn_transport_transport_proto protoreflect.FileDescriptor
+
+var file_gosdn_transport_transport_proto_rawDesc = []byte{
+	0x0a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f,
+	0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf9, 0x02, 0x0a, 0x0f, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
+	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12,
+	0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c,
+	0x73, 0x12, 0x5a, 0x0a, 0x15, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x67, 0x6e, 0x6d, 0x69, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a,
+	0x19, 0x72, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65,
+	0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74,
+	0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x42, 0x12, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a,
+	0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x65, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x47, 0x6e, 0x6d,
+	0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x47, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x08,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e,
+	0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x1a, 0x42, 0x0a, 0x14, 0x47, 0x72, 0x70, 0x63,
+	0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17,
+	0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x35, 0x5a, 0x33, 0x63, 0x6f, 0x64, 0x65, 0x2e,
+	0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65,
+	0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gosdn_transport_transport_proto_rawDescOnce sync.Once
+	file_gosdn_transport_transport_proto_rawDescData = file_gosdn_transport_transport_proto_rawDesc
+)
+
+func file_gosdn_transport_transport_proto_rawDescGZIP() []byte {
+	file_gosdn_transport_transport_proto_rawDescOnce.Do(func() {
+		file_gosdn_transport_transport_proto_rawDescData = protoimpl.X.CompressGZIP(file_gosdn_transport_transport_proto_rawDescData)
+	})
+	return file_gosdn_transport_transport_proto_rawDescData
+}
+
+var file_gosdn_transport_transport_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_gosdn_transport_transport_proto_goTypes = []interface{}{
+	(*TransportOption)(nil),         // 0: gosdn.transport.TransportOption
+	(*GnmiTransportOption)(nil),     // 1: gosdn.transport.GnmiTransportOption
+	(*RestconfTransportOption)(nil), // 2: gosdn.transport.RestconfTransportOption
+	nil,                             // 3: gosdn.transport.GnmiTransportOption.GrpcDialOptionsEntry
+	(southbound.Type)(0),            // 4: gosdn.southbound.Type
+	(gnmi.Encoding)(0),              // 5: gnmi.Encoding
+}
+var file_gosdn_transport_transport_proto_depIdxs = []int32{
+	1, // 0: gosdn.transport.TransportOption.gnmi_transport_option:type_name -> gosdn.transport.GnmiTransportOption
+	2, // 1: gosdn.transport.TransportOption.restconf_transport_option:type_name -> gosdn.transport.RestconfTransportOption
+	4, // 2: gosdn.transport.TransportOption.type:type_name -> gosdn.southbound.Type
+	3, // 3: gosdn.transport.GnmiTransportOption.grpc_dial_options:type_name -> gosdn.transport.GnmiTransportOption.GrpcDialOptionsEntry
+	5, // 4: gosdn.transport.GnmiTransportOption.encoding:type_name -> gnmi.Encoding
+	5, // [5:5] is the sub-list for method output_type
+	5, // [5:5] is the sub-list for method input_type
+	5, // [5:5] is the sub-list for extension type_name
+	5, // [5:5] is the sub-list for extension extendee
+	0, // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_gosdn_transport_transport_proto_init() }
+func file_gosdn_transport_transport_proto_init() {
+	if File_gosdn_transport_transport_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gosdn_transport_transport_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TransportOption); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_transport_transport_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GnmiTransportOption); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_transport_transport_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestconfTransportOption); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_gosdn_transport_transport_proto_msgTypes[0].OneofWrappers = []interface{}{
+		(*TransportOption_GnmiTransportOption)(nil),
+		(*TransportOption_RestconfTransportOption)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gosdn_transport_transport_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_gosdn_transport_transport_proto_goTypes,
+		DependencyIndexes: file_gosdn_transport_transport_proto_depIdxs,
+		MessageInfos:      file_gosdn_transport_transport_proto_msgTypes,
+	}.Build()
+	File_gosdn_transport_transport_proto = out.File
+	file_gosdn_transport_transport_proto_rawDesc = nil
+	file_gosdn_transport_transport_proto_goTypes = nil
+	file_gosdn_transport_transport_proto_depIdxs = nil
+}
diff --git a/api/proto/gosdn/core/core.proto b/api/proto/gosdn/core/core.proto
new file mode 100644
index 0000000000000000000000000000000000000000..a55a8dd17293a84a0353569cb49aa55762ef46bc
--- /dev/null
+++ b/api/proto/gosdn/core/core.proto
@@ -0,0 +1,87 @@
+syntax = "proto3";
+
+package gosdn.core;
+
+import "google/api/annotations.proto";
+import "gosdn/pnd/pnd.proto";
+
+option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core";
+
+service CoreService {
+  // Allows to request a specific Principal Network Domain.
+  rpc GetPnd(GetPndRequest) returns (GetPndResponse) {
+    option (google.api.http) = {
+      get: "/pnd/{pid}"
+    };
+  }
+  // Allows to request all Principal Network Domains.
+  rpc GetPndList(GetPndListRequest) returns (GetPndListResponse) {
+    option (google.api.http) = {
+      get: "/pnds"
+    };
+  }
+  // Allows create a Principal Network Domain.
+  rpc CreatePndList(CreatePndListRequest) returns (CreatePndListResponse) {
+    option (google.api.http) = {
+      post: "/pnds"
+      body: "*"
+    };
+  }
+  // Allows to delete a specific Principal Network Domain.
+  rpc DeletePnd(DeletePndRequest) returns (DeletePndResponse) {
+    option (google.api.http) = {
+      delete: "/pnds/{pid}"
+    };
+  }
+}
+
+message GetPndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+}
+
+message GetPndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string pid = 3;
+}
+
+message GetPndListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated .gosdn.pnd.PrincipalNetworkDomain pnd = 2;
+}
+
+message GetPndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated .gosdn.pnd.PrincipalNetworkDomain pnd = 2;
+}
+
+message CreatePndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated PndCreateProperties pnd = 2;
+}
+
+message PndCreateProperties {
+  string name = 1;
+  string description = 2;
+  string sbi = 3;
+}
+
+message CreatePndListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+message DeletePndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+
+message DeletePndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+enum Status {
+  STATUS_UNSPECIFIED = 0;
+  STATUS_OK = 1;
+  STATUS_ERROR = 2;
+}
diff --git a/api/proto/gosdn/csbi/csbi.proto b/api/proto/gosdn/csbi/csbi.proto
new file mode 100644
index 0000000000000000000000000000000000000000..bb3c044eaf4293b29dc4d86a073d2fc280c70137
--- /dev/null
+++ b/api/proto/gosdn/csbi/csbi.proto
@@ -0,0 +1,85 @@
+syntax = "proto3";
+
+package gosdn.csbi;
+
+import "gosdn/transport/transport.proto";
+
+option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi";
+
+// only used from within the controller; therefore we do not provide
+// grpc-gateway definitions
+service CsbiService {
+  rpc Get(GetRequest) returns (GetResponse);
+  rpc GetGoStruct(GetRequest) returns (stream Payload);
+  rpc GetManifest(GetRequest) returns (stream Payload);
+  rpc Create(CreateRequest) returns (CreateResponse);
+  rpc Delete(DeleteRequest) returns (DeleteResponse);
+  rpc Hello(Syn) returns (Ack);
+  rpc CreateGoStruct(CreateRequest) returns (stream Payload);
+}
+
+message Syn {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string id = 2;
+  string address = 3;
+}
+
+message Ack {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  .gosdn.transport.TransportOption transport_option = 2;
+}
+
+message GetRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  bool all = 2;
+  repeated string did = 3;
+}
+
+message GetResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated Deployment deployments = 2;
+}
+
+message Deployment {
+  string id = 1;
+  string name = 2;
+  State state = 3;
+}
+
+enum State {
+  STATE_UNSPECIFIED = 0;
+  STATE_ANNOUNCED = 1;
+  STATE_BUILT = 2;
+  STATE_DEPLOYED = 3;
+  STATE_RUNNING = 4;
+  STATE_DECOMMISSIONED = 5;
+}
+
+message CreateRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated .gosdn.transport.TransportOption transport_option = 2;
+}
+
+message CreateResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated Deployment deployments = 2;
+}
+
+message Payload {
+  bytes chunk = 1;
+}
+
+message DeleteRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string did = 2;
+}
+
+message DeleteResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  enum Status {
+    STATUS_UNSPECIFIED = 0;
+    STATUS_OK = 1;
+    STATUS_ERROR = 2;
+  }
+  Status status = 2;
+}
diff --git a/api/proto/gosdn/pnd/pnd.proto b/api/proto/gosdn/pnd/pnd.proto
new file mode 100644
index 0000000000000000000000000000000000000000..11bed8ef564785395463955b363ba372fcff4da8
--- /dev/null
+++ b/api/proto/gosdn/pnd/pnd.proto
@@ -0,0 +1,360 @@
+syntax = "proto3";
+
+package gosdn.pnd;
+
+import "google/api/annotations.proto";
+import "google/protobuf/descriptor.proto";
+import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto";
+import "gosdn/transport/transport.proto";
+import "gosdn/southbound/southbound.proto";
+import "protoc-gen-openapiv2/options/annotations.proto";
+
+option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd";
+
+option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
+	info: {
+		title: "goSDN Northbound";
+    description: "Protocol Buffer specifications and Go code for the goSDN northbound Interface"
+		version: "0.1";
+		contact: {
+			name: "goSDN Northbound project";
+			url: "https://code.fbi.h-da.de/danet/api";
+			//email: "none@example.com";
+		};
+		license: {
+			name: "BSD 3-Clause License";
+			url: "https://code.fbi.h-da.de/danet/api/-/blob/master/LICENSE";
+		};
+  };
+};
+
+service PndService {
+  // Allows to request all Orchestrated Networking Devices which are managed by a
+  // specific Principal Network Domain.
+  rpc GetOndList(GetOndListRequest) returns (GetOndListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/onds"
+    };
+  }
+  // Allows to request a specific Orchestrated Networking Device which is managed by a
+  // specific Principal Network Domain.
+  rpc GetOnd(GetOndRequest) returns (GetOndResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/ond/{did}"
+    };
+  }
+  // Allows add multiple Orchestrated Networking Devices to be managed by a
+  // specific Principal Network Domain.
+  rpc SetOndList(SetOndListRequest) returns (SetOndListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/onds"
+      body: "*"
+    };
+  }
+  // Allows to request all Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc GetSbiList(GetSbiListRequest) returns (GetSbiListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/sbis"
+    };
+  }
+  // Allows to request a specific Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc GetSbi(GetSbiRequest) returns (GetSbiResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/sbis/{sid}"
+    };
+  }
+  // Allows to add multiple specific Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc SetSbiList(SetSbiListRequest) returns (SetSbiListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/sbis"
+      body: "*"
+    };
+  }
+  // Allows to request all Changes registered for a specific Principal Network Domain.
+  rpc GetChangeList(GetChangeListRequest) returns (GetChangeListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/changes"
+    };
+  }
+  // Allows to request a specific Change registered for a specific Principal Network Domain.
+  rpc GetChange(GetChangeRequest) returns (GetChangeResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/changes/{cuid}"
+    };
+  }
+  // Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+  rpc SetChangeList(SetChangeListRequest) returns (SetChangeListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/changes"
+      body: "*"
+    };
+  }
+  // Allows to request a specific Path of a Orchestrated Networking Device,
+  // managed by a specific Principal Network Domain.
+  rpc GetPath(GetPathRequest) returns (GetPathResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/onds/{did}/paths/{path}"
+    };
+  }
+  // Allows to set a specific Path of a Orchestrated Networking Device,
+  // managed by a specific Principal Network Domain.
+  rpc SetPathList(SetPathListRequest) returns (SetPathListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/onds/paths"
+      body: "*"
+    };
+  }
+  // Allows to delete a specific Orchestrated Networking Device which is managed by a
+  // specific Principal Network Domain.
+  rpc DeleteOnd(DeleteOndRequest) returns (DeleteOndResponse) {
+    option (google.api.http) = {
+      delete: "/pnds/{pid}/onds/{did}"
+    };
+  }
+}
+
+message GetOndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+
+message GetOndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string did = 3;
+  string pid = 4;
+}
+
+message GetSbiListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+message GetSbiRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string sid = 3;
+  string pid = 4;
+}
+
+message GetChangeListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+
+message GetChangeRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string cuid = 3;
+  string pid = 4;
+}
+
+message GetPathRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string did = 2;
+  string path = 3;
+  string pid = 4;
+}
+
+message GetOndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated OrchestratedNetworkingDevice ond = 3;
+}
+
+message GetOndListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated OrchestratedNetworkingDevice ond = 3;
+}
+
+message GetSbiResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated .gosdn.southbound.SouthboundInterface sbi = 3;
+}
+
+message GetSbiListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated .gosdn.southbound.SouthboundInterface sbi = 3;
+}
+
+message GetPathResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated gnmi.Notification device = 3;
+}
+
+message GetChangeResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated Change change = 3;
+}
+
+message GetChangeListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated Change change = 3;
+}
+
+message PrincipalNetworkDomain {
+  string id = 1;
+  string name = 2;
+  string description = 3;
+}
+
+message OrchestratedNetworkingDevice {
+  string id = 1;
+  string name = 2;
+  repeated gnmi.Notification device = 3;
+  .gosdn.southbound.SouthboundInterface sbi = 4;
+}
+
+enum ChangeState {
+  CHANGE_STATE_UNSPECIFIED = 0;
+  CHANGE_STATE_PENDING = 1;
+  CHANGE_STATE_COMMITTED = 2;
+  CHANGE_STATE_CONFIRMED = 3;
+  CHANGE_STATE_INCONSISTENT = 4;
+}
+
+message Change {
+  string id = 1;
+  int64 age = 2;
+
+  ChangeState state = 3;
+}
+
+message SetOndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetOnd ond = 2;
+  string pid = 3;
+}
+
+message SetSbiListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetSbi sbi = 2;
+  string pid = 3;
+}
+
+message SetChangeListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetChange change = 2;
+  string pid = 3;
+}
+
+message SetPathListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated ChangeRequest change_request = 2;
+  string pid = 3;
+}
+
+//TODO: rename
+message ChangeRequest {
+  string did = 1;
+  string path = 2;
+  string value = 3;
+  ApiOperation api_op = 4;
+}
+
+enum ApiOperation {
+  API_OPERATION_UNSPECIFIED = 0;
+  API_OPERATION_UPDATE = 1;
+  API_OPERATION_REPLACE = 2;
+  API_OPERATION_DELETE = 3;
+}
+
+message SetOnd {
+  string address = 1;
+  .gosdn.southbound.SouthboundInterface sbi = 2;
+  string device_name = 3;
+  .gosdn.transport.TransportOption transport_option = 4;
+}
+
+message SetSbi {
+  SbiType sbi_type = 1;
+}
+
+enum SbiType {
+  SBI_TYPE_UNSPECIFIED = 0;
+  SBI_TYPE_OPENCONFIG = 1;
+  SBI_TYPE_CONTAINERISED = 2;
+  SBI_TYPE_PLUGIN = 3;
+}
+
+enum Operation {
+  OPERATION_UNSPECIFIED = 0;
+  OPERATION_CREATE = 1;
+  OPERATION_COMMIT = 2;
+  OPERATION_CONFIRM = 3;
+}
+
+message SetChange {
+  string cuid = 1;
+  Operation op = 2;
+}
+
+message SetResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+message SetOndListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message SetChangeListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message SetChangeResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+message SetSbiListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message SetPathListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message DeleteOndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+  string did = 5;
+}
+
+message DeleteOndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+enum Status {
+  STATUS_UNSPECIFIED = 0;
+  STATUS_OK = 1;
+  STATUS_ERROR = 2;
+}
diff --git a/api/proto/gosdn/southbound/southbound.proto b/api/proto/gosdn/southbound/southbound.proto
new file mode 100644
index 0000000000000000000000000000000000000000..d1ad0e63547eb7694c37f5a946d1c4522b1da185
--- /dev/null
+++ b/api/proto/gosdn/southbound/southbound.proto
@@ -0,0 +1,41 @@
+syntax = "proto3";
+
+package gosdn.southbound;
+
+import "google/protobuf/descriptor.proto";
+
+option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound";
+
+service SbiService {
+  rpc GetSchema(GetSchemaRequest) returns (stream Payload);
+  //{
+  // NOTE: probably the most intuitive route, but obviously we should go for
+  // something like: /pnd/{pid}/sbi/{sid}/schema and provide the information
+  // about the schema
+  // get: "/pnds/{pid}/onds/{did}/schema"
+  //};
+}
+
+message GetSchemaRequest {
+  int64 timestamp = 1;
+  string pid = 2;
+  string sid = 3;
+}
+
+message Payload {
+  bytes chunk = 1;
+}
+
+message SouthboundInterface {
+  string id = 1;
+  Type type = 2;
+}
+
+// Changed according to style guide:
+// https://docs.buf.build/best-practices/style-guide#enums
+enum Type {
+  TYPE_UNSPECIFIED = 0;
+  TYPE_OPENCONFIG = 1;
+  TYPE_CONTAINERISED = 2;
+  TYPE_PLUGIN = 3;
+}
diff --git a/api/proto/gosdn/transport/transport.proto b/api/proto/gosdn/transport/transport.proto
new file mode 100644
index 0000000000000000000000000000000000000000..caf4807c39c778fc2e690cc0b19d060f91f00017
--- /dev/null
+++ b/api/proto/gosdn/transport/transport.proto
@@ -0,0 +1,32 @@
+syntax = "proto3";
+
+package gosdn.transport;
+
+import "google/protobuf/descriptor.proto";
+import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto";
+import "gosdn/southbound/southbound.proto";
+
+option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport";
+
+message TransportOption {
+  string address = 1;
+  string username = 2;
+  string password = 3;
+  bool tls = 4;
+  oneof transport_option {
+    GnmiTransportOption gnmi_transport_option = 5;
+    RestconfTransportOption restconf_transport_option = 6;
+  }
+  .gosdn.southbound.Type type = 7;
+}
+
+message GnmiTransportOption {
+  string compression = 1;
+  map<string,string> grpc_dial_options = 2;
+  string token = 3;
+  gnmi.Encoding encoding = 4;
+}
+
+message RestconfTransportOption {
+
+}
diff --git a/.gitignore b/controller/.gitignore
similarity index 100%
rename from .gitignore
rename to controller/.gitignore