diff --git a/controller/api/api_test.go b/controller/api/api_test.go
index 02a55df4be5e10f45213f6773d5de4ce3f90cede..0c07066d00a8745e32de263b97032d81825b1a22 100644
--- a/controller/api/api_test.go
+++ b/controller/api/api_test.go
@@ -7,9 +7,7 @@ import (
 	"testing"
 
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
-	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
@@ -32,7 +30,7 @@ func Test_GetIds(t *testing.T) {
 }
 
 func ensureFilesForTestsAreRemoved() {
-	ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix)
+	ensureStoreFileForTestsIsRemoved(store.PluginFilenameSuffix)
 	ensureStoreFileForTestsIsRemoved(store.NetworkElementFilenameSuffix)
 }
 
@@ -59,11 +57,7 @@ func ensureStoreFileForTestsIsRemoved(storeName string) {
 func Test_AddPnd(t *testing.T) {
 	defer ensureFilesForTestsAreRemoved()
 
-	sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
-	if err != nil {
-		t.Errorf("AddPnd() error = %v", err)
-	}
-	resp, err := AddPnd(context.TODO(), bufnet, "test", "test pnd", sbi.ID().String())
+	resp, err := AddPnd(context.TODO(), bufnet, "test", "test pnd")
 	if err != nil {
 		t.Error(err)
 		return
diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go
index 0cb626781b18b4d3d228dcd7121776b9f824af09..4e4c98792c55bd3114cf965f0197beaf552ac486 100644
--- a/controller/api/initialise_test.go
+++ b/controller/api/initialise_test.go
@@ -10,6 +10,8 @@ import (
 
 	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict"
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core"
+	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
+	rpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
@@ -121,12 +123,12 @@ func bootstrapUnitTest() {
 		},
 	})
 
-	sbi := &nucleus.OpenConfig{}
+	plugin := &mocks.Plugin{}
 
 	mockNetworkElement := &mocks.NetworkElement{}
-	mockNetworkElement.On("SBI").Return(sbi)
+	mockNetworkElement.On("Plugin").Return(plugin)
 	mockNetworkElement.On("ID").Return(mneUUID)
-	mockNetworkElement.On("GetModel").Return(sbi.Schema().Root)
+	mockNetworkElement.On("GetModel").Return(plugin.Model())
 	mockNetworkElement.On("Name").Return("openconfig")
 	mockNetworkElement.On("TransportAddress").Return("127.0.0.1:6030")
 	mockNetworkElement.On("GetMetadata").Return(conflict.Metadata{ResourceVersion: 0})
@@ -145,7 +147,7 @@ func bootstrapUnitTest() {
 	mockPnd.On("NetworkElements").Return([]networkelement.NetworkElement{
 		&nucleus.CommonNetworkElement{
 			UUID:   mneUUID,
-			Plugin: &openconfig.Device{},
+			Plugin: &mocks.Plugin{},
 		},
 	})
 	mockPnd.On("GetSBIs").Return([]mocks.SouthboundInterface{})
@@ -180,6 +182,9 @@ func bootstrapUnitTest() {
 		portService,
 		routeService,
 		appService,
+		rpb.NewPluginRegistryServiceClient(&grpc.ClientConn{}),
+		csbi.NewCsbiServiceClient(&grpc.ClientConn{}),
+		func(u uuid.UUID, c chan networkelement.Details) {},
 		&mockPnd,
 	)
 
diff --git a/controller/nucleus/gnmi_transport_test.go b/controller/nucleus/gnmi_transport_test.go
index 146b1ce8b14ded564916e05f26d8a8822ec53732..6b1dccf92a9803003687251fd5616210117dc8a7 100644
--- a/controller/nucleus/gnmi_transport_test.go
+++ b/controller/nucleus/gnmi_transport_test.go
@@ -9,8 +9,6 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
 
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
-
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
@@ -18,10 +16,9 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
+	openconfigPlugin "code.fbi.h-da.de/danet/gosdn/plugins/openconfig"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
-	"github.com/openconfig/goyang/pkg/yang"
 	"github.com/openconfig/ygot/ygot"
-	"github.com/openconfig/ygot/ytypes"
 	"github.com/stretchr/testify/mock"
 )
 
@@ -106,7 +103,7 @@ func TestGnmi_Capabilities(t *testing.T) {
 
 func TestGnmi_Close(t *testing.T) {
 	type fields struct {
-		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+		SetNode  func(path *gpb.Path, value *gpb.TypedValue) error
 		RespChan chan *gpb.SubscribeResponse
 	}
 	tests := []struct {
@@ -217,56 +214,50 @@ func TestGnmi_Get(t *testing.T) {
 }
 
 func TestGnmi_ProcessResponse(t *testing.T) {
-	type fields struct {
-		Sbi southbound.SouthboundInterface
-	}
 	type args struct {
 		path string
-		root interface{}
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		wantErr bool
 	}{
 		{
-			name:   "Interfaces Interface",
-			fields: fields{Sbi: &OpenConfig{}},
+			name: "Interfaces Interface",
 			args: args{
 				path: "../test/proto/resp-interfaces-interface-arista-ceos",
-				root: &openconfig.Device{},
 			},
 			wantErr: false,
 		},
 		{
-			name:   "Interfaces Wildcard",
-			fields: fields{Sbi: &OpenConfig{}},
+			name: "Interfaces Wildcard",
 			args: args{
 				path: "../test/proto/resp-interfaces-wildcard",
-				root: &openconfig.Device{},
 			},
 			wantErr: false,
 		},
 		{
-			name:   "Root",
-			fields: fields{Sbi: &OpenConfig{}},
+			name: "Root",
 			args: args{
 				path: "../test/proto/resp-full-node-arista-ceos",
-				root: &openconfig.Device{},
 			},
 			wantErr: false,
 		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			networkElementModel, err := openconfigPlugin.NewDeviceModel()
+			if err != nil {
+				t.Errorf("ProcessResponse() error = %v", err)
+			}
+
 			g := &Gnmi{
-				SetNode:   tt.fields.Sbi.SetNode,
-				Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal,
+				SetNode:   networkElementModel.SetNode,
+				Unmarshal: networkElementModel.Unmarshal,
 			}
-			s := tt.fields.Sbi.Schema()
+
 			resp := gnmiMessages[tt.args.path]
-			if err := g.ProcessResponse(resp, tt.args.root, s); (err != nil) != tt.wantErr {
+			if err := g.ProcessResponse(resp); (err != nil) != tt.wantErr {
 				t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr)
 			}
 		})
@@ -388,21 +379,16 @@ func TestGnmi_Set(t *testing.T) {
 }
 
 func TestGnmi_Subscribe(t *testing.T) {
-	type fields struct {
-		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
-		RespChan chan *gpb.SubscribeResponse
-	}
 	type args struct {
 		ctx    context.Context
 		params []string
 	}
 	tests := []struct {
 		name    string
-		fields  fields
 		args    args
 		wantErr bool
 	}{
-		{name: "nil client", fields: fields{}, args: args{}, wantErr: true},
+		{name: "nil client", args: args{}, wantErr: true},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -415,23 +401,15 @@ func TestGnmi_Subscribe(t *testing.T) {
 }
 
 func TestGnmi_Type(t *testing.T) {
-	type fields struct {
-		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
-		RespChan chan *gpb.SubscribeResponse
-	}
 	tests := []struct {
-		name   string
-		fields fields
-		want   string
+		name string
+		want string
 	}{
-		{name: "dummy", fields: fields{}, want: "gnmi"},
+		{name: "dummy", want: "gnmi"},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			g := &Gnmi{
-				SetNode:  tt.fields.SetNode,
-				RespChan: tt.fields.RespChan,
-			}
+			g := &Gnmi{}
 			if got := g.Type(); got != tt.want {
 				t.Errorf("Type() = %v, want %v", got, tt.want)
 			}