diff --git a/go/gosdn/southbound/southbound.pb.go b/go/gosdn/southbound/southbound.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..c82d9ad9091eca60d101f06ffef5c7f9f6e8bf5e
--- /dev/null
+++ b/go/gosdn/southbound/southbound.pb.go
@@ -0,0 +1,208 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.15.8
+// 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)
+)
+
+type Type int32
+
+const (
+	Type_OPENCONFIG Type = 0
+)
+
+// Enum value maps for Type.
+var (
+	Type_name = map[int32]string{
+		0: "OPENCONFIG",
+	}
+	Type_value = map[string]int32{
+		"OPENCONFIG": 0,
+	}
+)
+
+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 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[0]
+		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[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 SouthboundInterface.ProtoReflect.Descriptor instead.
+func (*SouthboundInterface) Descriptor() ([]byte, []int) {
+	return file_gosdn_southbound_southbound_proto_rawDescGZIP(), []int{0}
+}
+
+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_OPENCONFIG
+}
+
+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, 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, 0x16, 0x0a, 0x04, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47,
+	0x10, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68,
+	0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 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, 1)
+var file_gosdn_southbound_southbound_proto_goTypes = []interface{}{
+	(Type)(0),                   // 0: gosdn.southbound.Type
+	(*SouthboundInterface)(nil), // 1: 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: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.(*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:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		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/go/gosdn/transport/transport.pb.go b/go/gosdn/transport/transport.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..c58abfee6312272f17cac71bcc5bd0a865eb582b
--- /dev/null
+++ b/go/gosdn/transport/transport.pb.go
@@ -0,0 +1,401 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.15.8
+// source: gosdn/transport/transport.proto
+
+package transport
+
+import (
+	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:"transportOption"`
+}
+
+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
+}
+
+type isTransportOption_TransportOption interface {
+	isTransportOption_TransportOption()
+}
+
+type TransportOption_GnmiTransportOption struct {
+	GnmiTransportOption *GnmiTransportOption `protobuf:"bytes,5,opt,name=GnmiTransportOption,proto3,oneof"`
+}
+
+type TransportOption_RestconfTransportOption struct {
+	RestconfTransportOption *RestconfTransportOption `protobuf:"bytes,6,opt,name=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=grpcDialOptions,proto3" json:"grpcDialOptions,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_JSON
+}
+
+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, 0x22, 0xc8, 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, 0x58,
+	0x0a, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	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, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 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, 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, 0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11,
+	0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x22, 0xa2, 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, 0x63, 0x0a, 0x0f, 0x67,
+	0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 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, 0x2f, 0x5a, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d,
+	0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 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
+	(gnmi.Encoding)(0),              // 4: gnmi.Encoding
+}
+var file_gosdn_transport_transport_proto_depIdxs = []int32{
+	1, // 0: gosdn.transport.TransportOption.GnmiTransportOption:type_name -> gosdn.transport.GnmiTransportOption
+	2, // 1: gosdn.transport.TransportOption.RestconfTransportOption:type_name -> gosdn.transport.RestconfTransportOption
+	3, // 2: gosdn.transport.GnmiTransportOption.grpcDialOptions:type_name -> gosdn.transport.GnmiTransportOption.GrpcDialOptionsEntry
+	4, // 3: gosdn.transport.GnmiTransportOption.encoding:type_name -> gnmi.Encoding
+	4, // [4:4] is the sub-list for method output_type
+	4, // [4:4] is the sub-list for method input_type
+	4, // [4:4] is the sub-list for extension type_name
+	4, // [4:4] is the sub-list for extension extendee
+	0, // [0:4] 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/proto/gosdn/southbound/southbound.proto b/proto/gosdn/southbound/southbound.proto
new file mode 100644
index 0000000000000000000000000000000000000000..0162da2edc487d4ff5823bcd4cc7da424a97445a
--- /dev/null
+++ b/proto/gosdn/southbound/southbound.proto
@@ -0,0 +1,17 @@
+syntax = "proto3";
+
+package gosdn.southbound;
+
+import "google/protobuf/descriptor.proto";
+
+option go_package = "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound";
+
+
+message SouthboundInterface {
+  string id = 1;
+  Type type = 2;
+}
+
+enum Type {
+  OPENCONFIG = 0;
+}
diff --git a/proto/gosdn/transport/transport.proto b/proto/gosdn/transport/transport.proto
new file mode 100644
index 0000000000000000000000000000000000000000..12924cb11aa8361523806c1aee3117f5a9a13ecc
--- /dev/null
+++ b/proto/gosdn/transport/transport.proto
@@ -0,0 +1,30 @@
+syntax = "proto3";
+
+package gosdn.transport;
+
+import "google/protobuf/descriptor.proto";
+import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto";
+
+option go_package = "code.fbi.h-da.de/cocsn/api/go/gosdn/transport";
+
+message TransportOption {
+  string address = 1;
+  string username = 2;
+  string password = 3;
+  bool tls = 4;
+  oneof transportOption {
+    GnmiTransportOption GnmiTransportOption = 5;
+    RestconfTransportOption RestconfTransportOption = 6;
+  }
+}
+
+message GnmiTransportOption {
+  string compression = 1;
+  map<string,string> grpcDialOptions = 2;
+  string token = 3;
+  gnmi.Encoding encoding = 4;
+}
+
+message RestconfTransportOption {
+
+}
\ No newline at end of file