diff --git a/go/gosdn/southbound/southbound.pb.go b/go/gosdn/southbound/southbound.pb.go
index d326feaeb6e5a24be11ad47e77a5deef7af885fe..e6d48b1c561b4387575d173a3efc9bfdb24d00f9 100644
--- a/go/gosdn/southbound/southbound.pb.go
+++ b/go/gosdn/southbound/southbound.pb.go
@@ -75,6 +75,116 @@ 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
@@ -87,7 +197,7 @@ type SouthboundInterface struct {
 func (x *SouthboundInterface) Reset() {
 	*x = SouthboundInterface{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_southbound_southbound_proto_msgTypes[0]
+		mi := &file_gosdn_southbound_southbound_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -100,7 +210,7 @@ func (x *SouthboundInterface) String() string {
 func (*SouthboundInterface) ProtoMessage() {}
 
 func (x *SouthboundInterface) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_southbound_southbound_proto_msgTypes[0]
+	mi := &file_gosdn_southbound_southbound_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -113,7 +223,7 @@ func (x *SouthboundInterface) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SouthboundInterface.ProtoReflect.Descriptor instead.
 func (*SouthboundInterface) Descriptor() ([]byte, []int) {
-	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{0}
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *SouthboundInterface) GetId() string {
@@ -138,21 +248,35 @@ var file_gosdn_southbound_southbound_proto_rawDesc = []byte{
 	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, 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,
+	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,
-	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, 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, 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,
+	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, 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 (
@@ -168,15 +292,19 @@ func file_gosdn_southbound_southbound_proto_rawDescGZIP() []byte {
 }
 
 var file_gosdn_southbound_southbound_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_gosdn_southbound_southbound_proto_msgTypes = make([]protoimpl.MessageInfo, 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
-	(*SouthboundInterface)(nil), // 1: gosdn.southbound.SouthboundInterface
+	(*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:1] is the sub-list for method output_type
-	1, // [1:1] is the sub-list for method input_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
@@ -189,6 +317,30 @@ func file_gosdn_southbound_southbound_proto_init() {
 	}
 	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
@@ -207,9 +359,9 @@ func file_gosdn_southbound_southbound_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gosdn_southbound_southbound_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   1,
+			NumMessages:   3,
 			NumExtensions: 0,
-			NumServices:   0,
+			NumServices:   1,
 		},
 		GoTypes:           file_gosdn_southbound_southbound_proto_goTypes,
 		DependencyIndexes: file_gosdn_southbound_southbound_proto_depIdxs,
diff --git a/go/gosdn/southbound/southbound_grpc.pb.go b/go/gosdn/southbound/southbound_grpc.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..aaa62e6d2f844642c28df5b568883b7f96a61482
--- /dev/null
+++ b/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/openapiv2/gosdn_northbound.swagger.json b/openapiv2/gosdn_northbound.swagger.json
index 160ac64cb841a5e35d3126e79bf186f9a9678edd..652fec14901b630546e1bc08cd1412c27fc4a0d3 100644
--- a/openapiv2/gosdn_northbound.swagger.json
+++ b/openapiv2/gosdn_northbound.swagger.json
@@ -21,13 +21,16 @@
       "name": "gNMI"
     },
     {
-      "name": "CoreService"
+      "name": "AgentManager"
+    },
+    {
+      "name": "SbiService"
     },
     {
       "name": "Collector"
     },
     {
-      "name": "AgentManager"
+      "name": "CoreService"
     },
     {
       "name": "CsbiService"
@@ -910,15 +913,6 @@
         }
       }
     },
-    "csbiPayload": {
-      "type": "object",
-      "properties": {
-        "chunk": {
-          "type": "string",
-          "format": "byte"
-        }
-      }
-    },
     "fakeBoolList": {
       "type": "object",
       "properties": {
@@ -1963,6 +1957,15 @@
         }
       }
     },
+    "gosdncsbiPayload": {
+      "type": "object",
+      "properties": {
+        "chunk": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
     "gosdncsbiState": {
       "type": "string",
       "enum": [
@@ -2006,6 +2009,15 @@
       ],
       "default": "STATUS_UNSPECIFIED"
     },
+    "gosdnsouthboundPayload": {
+      "type": "object",
+      "properties": {
+        "chunk": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
     "gosdnsouthboundType": {
       "type": "string",
       "enum": [
@@ -2015,7 +2027,7 @@
         "TYPE_PLUGIN"
       ],
       "default": "TYPE_UNSPECIFIED",
-      "title": "Changed accoprding to style guide: \r\nhttps://docs.buf.build/best-practices/style-guide#enums"
+      "title": "Changed accoprding to style guide:\r\nhttps://docs.buf.build/best-practices/style-guide#enums"
     },
     "pndApiOperation": {
       "type": "string",
diff --git a/proto/gosdn/csbi/csbi.proto b/proto/gosdn/csbi/csbi.proto
index 635ce6866c05f110391c95b4a15d9a9a196c3d1b..51afef569116ba8f8a49bda8a08b17b3aa11da2b 100644
--- a/proto/gosdn/csbi/csbi.proto
+++ b/proto/gosdn/csbi/csbi.proto
@@ -6,6 +6,8 @@ import "gosdn/transport/transport.proto";
 
 option go_package = "code.fbi.h-da.de/danet/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);
diff --git a/proto/gosdn/pnd/pnd.proto b/proto/gosdn/pnd/pnd.proto
index 2835bbbdf1f71368bd7217879a214864d09d753f..945d77b27cce665a68af45f8e600c8d86fb27dd3 100644
--- a/proto/gosdn/pnd/pnd.proto
+++ b/proto/gosdn/pnd/pnd.proto
@@ -3,7 +3,6 @@ syntax = "proto3";
 package gosdn.pnd;
 
 import "google/api/annotations.proto";
-//import "protoc-gen-openapiv2/options/annotations.proto";
 import "google/protobuf/descriptor.proto";
 import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto";
 import "gosdn/transport/transport.proto";
@@ -358,4 +357,4 @@ enum Status {
   STATUS_UNSPECIFIED = 0;
   STATUS_OK = 1;
   STATUS_ERROR = 2;
-}
\ No newline at end of file
+}
diff --git a/proto/gosdn/southbound/southbound.proto b/proto/gosdn/southbound/southbound.proto
index 3054bac76dc6aef7495a24f6b825bd060c6f87d4..7a3cc5df2b4085d9a66877559276e942a20613f3 100644
--- a/proto/gosdn/southbound/southbound.proto
+++ b/proto/gosdn/southbound/southbound.proto
@@ -6,13 +6,32 @@ import "google/protobuf/descriptor.proto";
 
 option go_package = "code.fbi.h-da.de/danet/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 accoprding to style guide: 
+// Changed according to style guide:
 // https://docs.buf.build/best-practices/style-guide#enums
 enum Type {
   TYPE_UNSPECIFIED = 0;