diff --git a/controller/controller.go b/controller/controller.go
index eebc8ae8c87515631c1aea22cafc4fd095bb7a26..931c38756707459c3d402250b8f41c991cb328b8 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -108,9 +108,7 @@ func startGrpc() error {
 	jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration)
 	setupGRPCServerWithCorrectSecurityLevel(jwtManager)
 
-	c.nbi = nbi.NewNBI(c.pndStore, c.userService, c.roleService)
-	c.nbi.Auth = nbi.NewAuthServer(jwtManager)
-	c.nbi.User = nbi.NewUserServer(jwtManager)
+	c.nbi = nbi.NewNBI(c.pndStore, c.userService, c.roleService, *jwtManager)
 
 	pb.RegisterCoreServiceServer(c.grpcServer, c.nbi.Core)
 	ppb.RegisterPndServiceServer(c.grpcServer, c.nbi.Pnd)
diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go
index bf00968736113bf76cacb96fcf958454379a0c40..7eec9d316d0c850e3e6a2b7502b8670dcc48a0a0 100644
--- a/controller/northbound/server/auth.go
+++ b/controller/northbound/server/auth.go
@@ -6,6 +6,7 @@ import (
 	"time"
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
@@ -19,7 +20,8 @@ import (
 // Auth holds a JWTManager and represents a AuthServiceServer.
 type Auth struct {
 	apb.UnimplementedAuthServiceServer
-	jwtManager *rbac.JWTManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
 }
 
 // NewAuthServer receives a JWTManager and returns a new Auth interface.
@@ -52,14 +54,14 @@ func (s Auth) Login(ctx context.Context, request *apb.LoginRequest) (*apb.LoginR
 		return nil, err
 	}
 
-	userToUpdate, err := userService.Get(store.Query{Name: user.UserName})
+	userToUpdate, err := s.userService.Get(store.Query{Name: user.UserName})
 	if err != nil {
 		return nil, err
 	}
 
 	userToUpdate.SetToken(token)
 
-	err = userService.Update(userToUpdate)
+	err = s.userService.Update(userToUpdate)
 	if err != nil {
 		return nil, err
 	}
@@ -90,7 +92,7 @@ func (s Auth) Logout(ctx context.Context, request *apb.LogoutRequest) (*apb.Logo
 
 // isValidUser checks if the provided user name fits to a stored one and then checks if the provided password is correct.
 func (s Auth) isValidUser(user rbac.User) error {
-	storedUser, err := userService.Get(store.Query{Name: user.Name()})
+	storedUser, err := s.userService.Get(store.Query{Name: user.Name()})
 	if err != nil {
 		return err
 	}
@@ -136,7 +138,7 @@ func (s Auth) handleLogout(ctx context.Context, userName string) error {
 			return status.Errorf(codes.Aborted, "missing match of user associated to token and provided user name")
 		}
 
-		storedUser, err := userService.Get(store.Query{Name: userName})
+		storedUser, err := s.userService.Get(store.Query{Name: userName})
 		if err != nil {
 			return err
 		}
@@ -145,7 +147,7 @@ func (s Auth) handleLogout(ctx context.Context, userName string) error {
 			return status.Errorf(codes.Aborted, "missing match of token provied for user")
 		}
 
-		err = userService.Update(&rbac.User{UserID: storedUser.ID(),
+		err = s.userService.Update(&rbac.User{UserID: storedUser.ID(),
 			UserName: storedUser.Name(),
 			Roles:    storedUser.GetRoles(),
 			Password: storedUser.GetPassword(),
diff --git a/controller/northbound/server/auth_interceptor.go b/controller/northbound/server/auth_interceptor.go
index 9c5f7a746cfd0d0627a75188ed04eec409885947..d4f73ec7ef7e0c5cbe9cf1ba3073d3c1aa7f647f 100644
--- a/controller/northbound/server/auth_interceptor.go
+++ b/controller/northbound/server/auth_interceptor.go
@@ -1,6 +1,7 @@
 package server
 
 import (
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 	"context"
 	"time"
 
@@ -16,7 +17,9 @@ import (
 
 // AuthInterceptor provides an AuthInterceptor
 type AuthInterceptor struct {
-	jwtManager *rbac.JWTManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
+	roleService rbacInterfaces.RoleService
 }
 
 // NewAuthInterceptor receives a JWTManager and a rbacMand returns a new AuthInterceptor provding gRPC Interceptor functionality.
@@ -82,7 +85,7 @@ func (auth *AuthInterceptor) authorize(ctx context.Context, method string) error
 			return status.Errorf(codes.PermissionDenied, "token expired at %v, please login", time.Unix(claims.ExpiresAt, 0))
 		}
 
-		user, err := userService.Get(store.Query{Name: claims.Username})
+		user, err := auth.userService.Get(store.Query{Name: claims.Username})
 		if err != nil {
 			return err
 		}
@@ -114,7 +117,7 @@ func (auth *AuthInterceptor) verifyPermisisonForRequestedCall(userRoles map[stri
 }
 
 func (auth *AuthInterceptor) verifyUserRoleAndRequestedCall(userRole, requestedMethod string) error {
-	storedRoles, err := roleService.GetAll()
+	storedRoles, err := auth.roleService.GetAll()
 	if err != nil {
 		return err
 	}
diff --git a/controller/northbound/server/core.go b/controller/northbound/server/core.go
index 13a7304c5975738d97f543a7f02f6452c25da171..4ef33b9b1f7dde90158981335857b89366798016 100644
--- a/controller/northbound/server/core.go
+++ b/controller/northbound/server/core.go
@@ -6,6 +6,7 @@ import (
 
 	pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core"
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
@@ -15,6 +16,7 @@ import (
 
 type core struct {
 	pb.UnimplementedCoreServiceServer
+    pndStore networkdomain.PndStore
 }
 
 func (s core) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb.GetPndResponse, error) {
@@ -27,7 +29,7 @@ func (s core) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb.GetPnd
 		return nil, handleRPCError(labels, err)
 	}
 
-	storedPnd, err := pndc.Get(store.Query{ID: pndID})
+	storedPnd, err := s.pndStore.Get(store.Query{ID: pndID})
 	if err != nil {
 		return nil, err
 	}
@@ -49,7 +51,7 @@ func (s core) GetPndList(ctx context.Context, request *pb.GetPndListRequest) (*p
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	pndList, err := pndc.GetAll()
+	pndList, err := s.pndStore.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -77,7 +79,7 @@ func (s core) CreatePndList(ctx context.Context, request *pb.CreatePndListReques
 		if err != nil {
 			return nil, handleRPCError(labels, err)
 		}
-		if err := pndc.Add(pnd); err != nil {
+		if err := s.pndStore.Add(pnd); err != nil {
 			return nil, handleRPCError(labels, err)
 		}
 	}
@@ -97,11 +99,11 @@ func (s core) DeletePnd(ctx context.Context, request *pb.DeletePndRequest) (*pb.
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pndID})
+	pnd, err := s.pndStore.Get(store.Query{ID: pndID})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
-	err = pndc.Delete(pnd)
+	err = s.pndStore.Delete(pnd)
 	if err != nil {
 		return &pb.DeletePndResponse{
 			Timestamp: time.Now().UnixNano(),
diff --git a/controller/northbound/server/csbi.go b/controller/northbound/server/csbi.go
index acfb4d67078ef410c7b6267ec2add229dcc16ee1..07811a87520cfefb320bd3f0074b672c460a10fe 100644
--- a/controller/northbound/server/csbi.go
+++ b/controller/northbound/server/csbi.go
@@ -11,6 +11,7 @@ import (
 
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/device"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"google.golang.org/grpc/codes"
@@ -20,13 +21,14 @@ import (
 
 type csbi struct {
 	cpb.UnimplementedCsbiServiceServer
+    pndStore networkdomain.PndStore
 }
 
 func (s csbi) Hello(ctx context.Context, syn *cpb.Syn) (*cpb.Ack, error) {
 	labels := prometheus.Labels{"service": "csbi", "rpc": "hello"}
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
-	ch, err := pndc.PendingChannels(store.FromString(syn.Id))
+	ch, err := s.pndStore.PendingChannels(store.FromString(syn.Id))
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go
index 040407e326693301a4e8050cf004185f70b60748..5e4321d98e568f573d23f77712ae770beb1eeca5 100644
--- a/controller/northbound/server/nbi.go
+++ b/controller/northbound/server/nbi.go
@@ -2,7 +2,9 @@ package server
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
+
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"github.com/prometheus/client_golang/prometheus"
 	log "github.com/sirupsen/logrus"
@@ -10,10 +12,6 @@ import (
 	"google.golang.org/grpc/status"
 )
 
-var pndc networkdomain.PndStore
-var userService rbac.UserService
-var roleService rbac.RoleService
-
 // NorthboundInterface is the representation of the
 // gRPC services used provided.
 type NorthboundInterface struct {
@@ -27,18 +25,30 @@ type NorthboundInterface struct {
 }
 
 // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface
-func NewNBI(pnds networkdomain.PndStore, users rbac.UserService, roles rbac.RoleService) *NorthboundInterface {
-	pndc = pnds
-	userService = users
-	roleService = roles
+func NewNBI(pnds networkdomain.PndStore, users rbacInterfaces.UserService, roles rbacInterfaces.RoleService, jwt rbac.JWTManager) *NorthboundInterface {
 	return &NorthboundInterface{
-		Pnd:  &pndServer{},
-		Core: &core{},
-		Csbi: &csbi{},
-		Sbi:  &sbiServer{},
-		Auth: &Auth{},
-		User: &User{},
-		Role: &Role{},
+		Pnd: &pndServer{
+			pndStore: pnds,
+		},
+		Core: &core{
+			pndStore: pnds,
+		},
+		Csbi: &csbi{
+			pndStore: pnds,
+		},
+		Sbi: &sbiServer{
+			pndStore: pnds,
+		},
+		Auth: &Auth{
+			jwtManager: &jwt,
+            userService: users,
+		},
+		User: &User{
+			jwtManager: &jwt,
+        },
+		Role: &Role{
+			jwtManager: &jwt,
+        },
 	}
 }
 
diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go
index 9f3f40636c89316bf2f67b5e0543cb4f413cb130..35364eb5d8e996d2be4bc9b03eb7f2850af2cdc7 100644
--- a/controller/northbound/server/pnd.go
+++ b/controller/northbound/server/pnd.go
@@ -25,6 +25,7 @@ import (
 
 type pndServer struct {
 	ppb.UnimplementedPndServiceServer
+	pndStore networkdomain.PndStore
 }
 
 func (p pndServer) GetOnd(ctx context.Context, request *ppb.GetOndRequest) (*ppb.GetOndResponse, error) {
@@ -36,7 +37,7 @@ func (p pndServer) GetOnd(ctx context.Context, request *ppb.GetOndRequest) (*ppb
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -68,7 +69,7 @@ func (p pndServer) GetOndList(ctx context.Context, request *ppb.GetOndListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -172,7 +173,7 @@ func (p pndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -211,7 +212,7 @@ func (p pndServer) GetSbiList(ctx context.Context, request *ppb.GetSbiListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -275,7 +276,7 @@ func (p pndServer) GetPath(ctx context.Context, request *ppb.GetPathRequest) (*p
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -321,7 +322,7 @@ func (p pndServer) GetChange(ctx context.Context, request *ppb.GetChangeRequest)
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -351,7 +352,7 @@ func (p pndServer) GetChangeList(ctx context.Context, request *ppb.GetChangeList
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -427,7 +428,7 @@ func (p pndServer) SetOndList(ctx context.Context, request *ppb.SetOndListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -468,7 +469,7 @@ func (p pndServer) SetChangeList(ctx context.Context, request *ppb.SetChangeList
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -519,7 +520,7 @@ func (p pndServer) SetPathList(ctx context.Context, request *ppb.SetPathListRequ
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -559,7 +560,7 @@ func (p pndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -611,7 +612,7 @@ func (p pndServer) DeleteOnd(ctx context.Context, request *ppb.DeleteOndRequest)
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := p.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go
index 4f4990d0fc47425d02da1a8257243cff49ce3b8d..bc2059d2f187bd9a306c60ba214ba3e952e378bd 100644
--- a/controller/northbound/server/role.go
+++ b/controller/northbound/server/role.go
@@ -5,6 +5,7 @@ import (
 	"time"
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
@@ -18,7 +19,8 @@ import (
 // Role holds a JWTManager and represents a RoleServiceServer.
 type Role struct {
 	apb.UnimplementedRoleServiceServer
-	jwtManager *rbac.JWTManager
+	jwtManager  *rbac.JWTManager
+	roleService rbacInterfaces.RoleService
 }
 
 // NewRoleServer receives a JWTManager and returns a new Role.
@@ -34,10 +36,10 @@ func (r Role) CreateRoles(ctx context.Context, request *apb.CreateRolesRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, r := range request.Roles {
-		role := rbac.NewRole(uuid.New(), r.Name, r.Description, r.Permissions)
+	for _, rrole := range request.Roles {
+		role := rbac.NewRole(uuid.New(), rrole.Name, rrole.Description, rrole.Permissions)
 
-		err := roleService.Add(role)
+		err := r.roleService.Add(role)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -56,7 +58,7 @@ func (r Role) GetRole(ctx context.Context, request *apb.GetRoleRequest) (*apb.Ge
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleData, err := roleService.Get(store.Query{Name: request.RoleName})
+	roleData, err := r.roleService.Get(store.Query{Name: request.RoleName})
 	if err != nil {
 		return nil, err
 	}
@@ -81,7 +83,7 @@ func (r Role) GetRoles(ctx context.Context, request *apb.GetRolesRequest) (*apb.
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleList, err := roleService.GetAll()
+	roleList, err := r.roleService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -109,19 +111,19 @@ func (r Role) UpdateRoles(ctx context.Context, request *apb.UpdateRolesRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, r := range request.Roles {
-		rid, err := uuid.Parse(r.Id)
+	for _, role := range request.Roles {
+		rid, err := uuid.Parse(role.Id)
 		if err != nil {
 			return nil, handleRPCError(labels, err)
 		}
 
-		_, err = roleService.Get(store.Query{ID: rid})
+		_, err = r.roleService.Get(store.Query{ID: rid})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "role not found %v", err)
 		}
 
-		roleToUpdate := rbac.NewRole(rid, r.Name, r.Description, r.Permissions)
-		err = roleService.Update(roleToUpdate)
+		roleToUpdate := rbac.NewRole(rid, role.Name, role.Description, role.Permissions)
+		err = r.roleService.Update(roleToUpdate)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "could not update role %v", err)
 		}
@@ -139,7 +141,7 @@ func (r Role) DeletePermissionsForRole(ctx context.Context, request *apb.DeleteP
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleToUpdate, err := roleService.Get(store.Query{Name: request.RoleName})
+	roleToUpdate, err := r.roleService.Get(store.Query{Name: request.RoleName})
 	if err != nil {
 		return nil, status.Errorf(codes.Canceled, "role not found %v", err)
 	}
@@ -164,7 +166,7 @@ func (r Role) DeletePermissionsForRole(ctx context.Context, request *apb.DeleteP
 
 	// updates the existing role with the trimmed set of permissions
 	roleToUpdate.RemovePermissionsFromRole(request.PermissionsToDelete)
-	err = roleService.Update(roleToUpdate)
+	err = r.roleService.Update(roleToUpdate)
 	if err != nil {
 		return nil, status.Errorf(codes.Aborted, "could not update role %v", err)
 	}
@@ -181,13 +183,13 @@ func (r Role) DeleteRoles(ctx context.Context, request *apb.DeleteRolesRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, r := range request.RoleName {
-		roleToDelete, err := roleService.Get(store.Query{Name: r})
+	for _, role := range request.RoleName {
+		roleToDelete, err := r.roleService.Get(store.Query{Name: role})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "role not found")
 		}
 
-		err = roleService.Delete(roleToDelete)
+		err = r.roleService.Delete(roleToDelete)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "error deleting role %v", err)
 		}
diff --git a/controller/northbound/server/sbi.go b/controller/northbound/server/sbi.go
index 6c6102806bc9c7e644fe3cd59c88fe6c156ce31b..d948cb30f7b9502cbf090dfbb5dc9302e578e876 100644
--- a/controller/northbound/server/sbi.go
+++ b/controller/northbound/server/sbi.go
@@ -5,6 +5,7 @@ import (
 	"io"
 
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
@@ -24,6 +25,7 @@ const (
 
 type sbiServer struct {
 	spb.UnimplementedSbiServiceServer
+    pndStore networkdomain.PndStore
 }
 
 func (s sbiServer) GetSchema(request *spb.GetSchemaRequest, stream spb.SbiService_GetSchemaServer) error {
@@ -41,7 +43,7 @@ func (s sbiServer) GetSchema(request *spb.GetSchemaRequest, stream spb.SbiServic
 		return handleRPCError(labels, err)
 	}
 
-	pnd, err := pndc.Get(store.Query{ID: pid})
+	pnd, err := s.pndStore.Get(store.Query{ID: pid})
 	if err != nil {
 		return handleRPCError(labels, err)
 	}
diff --git a/controller/northbound/server/user.go b/controller/northbound/server/user.go
index f15f3412450d3762306fef57122a92cfc63547e2..56524cd7ec4822d4feb1d9efed19b63cccc345ce 100644
--- a/controller/northbound/server/user.go
+++ b/controller/northbound/server/user.go
@@ -17,12 +17,15 @@ import (
 	"google.golang.org/grpc/status"
 
 	"golang.org/x/crypto/argon2"
+
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 )
 
 // User holds a JWTManager and represents a UserServiceServer.
 type User struct {
 	apb.UnimplementedUserServiceServer
-	jwtManager *rbac.JWTManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
 }
 
 // NewUserServer receives a JWTManager and returns a new UserServer.
@@ -38,9 +41,9 @@ func (u User) CreateUsers(ctx context.Context, request *apb.CreateUsersRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, u := range request.User {
+	for _, user := range request.User {
 		roles := map[string]string{}
-		for key, elem := range u.Roles {
+		for key, elem := range user.Roles {
 			_, err := uuid.Parse(key)
 			if err != nil {
 				return nil, handleRPCError(labels, err)
@@ -56,10 +59,10 @@ func (u User) CreateUsers(ctx context.Context, request *apb.CreateUsersRequest)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 
-		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(u.Password), []byte(salt), 1, 64*1024, 4, 32))
+		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(user.Password), []byte(salt), 1, 64*1024, 4, 32))
 
-		user := rbac.NewUser(uuid.New(), u.Name, roles, string(hashedPassword), u.Token, salt)
-		err = userService.Add(user)
+		user := rbac.NewUser(uuid.New(), user.Name, roles, string(hashedPassword), user.Token, salt)
+		err = u.userService.Add(user)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -78,7 +81,7 @@ func (u User) GetUser(ctx context.Context, request *apb.GetUserRequest) (*apb.Ge
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	userData, err := userService.Get(store.Query{Name: request.Name})
+	userData, err := u.userService.Get(store.Query{Name: request.Name})
 	if err != nil {
 		return nil, err
 	}
@@ -102,7 +105,7 @@ func (u User) GetUsers(ctx context.Context, request *apb.GetUsersRequest) (*apb.
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	userList, err := userService.GetAll()
+	userList, err := u.userService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -129,22 +132,22 @@ func (u User) UpdateUsers(ctx context.Context, request *apb.UpdateUsersRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, u := range request.User {
-		uid, err := uuid.Parse(u.Id)
+	for _, user := range request.User {
+		uid, err := uuid.Parse(user.Id)
 		if err != nil {
 			return nil, handleRPCError(labels, err)
 		}
 
-		storedUser, err := userService.Get(store.Query{ID: uid})
+		storedUser, err := u.userService.Get(store.Query{ID: uid})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "user not found %v", err)
 		}
 
-		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(u.Password), []byte(storedUser.GetSalt()), 1, 64*1024, 4, 32))
+		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(user.Password), []byte(storedUser.GetSalt()), 1, 64*1024, 4, 32))
 
-		userToUpdate := rbac.NewUser(uid, u.Name, u.Roles, string(hashedPassword), u.Token, storedUser.GetSalt())
+		userToUpdate := rbac.NewUser(uid, user.Name, user.Roles, string(hashedPassword), user.Token, storedUser.GetSalt())
 
-		err = userService.Update(userToUpdate)
+		err = u.userService.Update(userToUpdate)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "could not update user %v", err)
 		}
@@ -162,13 +165,13 @@ func (u User) DeleteUsers(ctx context.Context, request *apb.DeleteUsersRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	for _, u := range request.Username {
-		userToDelete, err := userService.Get(store.Query{Name: u})
+	for _, user := range request.Username {
+		userToDelete, err := u.userService.Get(store.Query{Name: user})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "user not found %v", err)
 		}
 
-		err = userService.Delete(userToDelete)
+		err = u.userService.Delete(userToDelete)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "error deleting user %v", err)
 		}
@@ -180,7 +183,7 @@ func (u User) DeleteUsers(ctx context.Context, request *apb.DeleteUsersRequest)
 }
 
 func (u User) isValidUser(user rbac.User) (bool, error) {
-	storedUser, err := userService.Get(store.Query{Name: user.Name()})
+	storedUser, err := u.userService.Get(store.Query{Name: user.Name()})
 	if err != nil {
 		return false, err
 	} else if storedUser == nil {