diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go
index c3c4ff76a60f1ff82a08e65972579abbfaa34c46..e6ad9a1e76ae660bd9c2696391dfa378f7142877 100644
--- a/controller/api/initialise_test.go
+++ b/controller/api/initialise_test.go
@@ -26,7 +26,6 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto"
 	rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/links"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
@@ -191,10 +190,13 @@ func bootstrapUnitTest() {
 	}, sbi, conflict.Metadata{ResourceVersion: 0})
 	_ = networkElementService.Add(mne)
 
-	serviceManager := servmgmt.ServiceManager{MneService: networkElementService, SbiService: sbiService, PNDStore: pndStore}
+	pndService := &mocks.PndService{}
 
 	northbound := nbi.NewNBI(
 		pndStore,
+		pndService,
+		networkElementService,
+		sbiService,
 		userService,
 		roleService,
 		*jwtManager,
@@ -204,7 +206,6 @@ func bootstrapUnitTest() {
 		routeService,
 		appService,
 		&mockPnd,
-		serviceManager,
 	)
 
 	cpb.RegisterCoreServiceServer(s, northbound.Core)
diff --git a/controller/controller.go b/controller/controller.go
index 1e6242f69704163f10fb5822c6221287e6c01c95..83431a7526849018ad5e2fb060e0e2ddb9facbed 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -31,7 +31,6 @@ import (
 	//TODO: check if both of 'app' are necessary?
 	"code.fbi.h-da.de/danet/gosdn/controller/app"
 	apps "code.fbi.h-da.de/danet/gosdn/controller/app"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/config"
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
@@ -39,6 +38,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/northbound/server"
 	nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/server"
 	rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac"
@@ -59,6 +59,9 @@ var coreOnce sync.Once
 // Core is the representation of the controller's core.
 type Core struct {
 	pndStore              networkdomain.PndStore
+	pndService            networkdomain.Service
+	mneService            networkelement.Service
+	sbiService            southbound.Service
 	userService           rbac.UserService
 	roleService           rbac.RoleService
 	topologyService       topology.Service
@@ -74,8 +77,6 @@ type Core struct {
 	stopChan              chan os.Signal
 
 	csbiClient cpb.CsbiServiceClient
-
-	serviceManager servmgmt.ServiceManager
 }
 
 var c *Core
@@ -106,10 +107,15 @@ func initialize() error {
 		eventService,
 	)
 
-	serviveManager := initServiceManager(eventService)
+	pndStore := nucleus.NewPndStore()
+
+	sbiService := nucleus.NewSbiService(nucleus.NewSbiStore(config.BasePndUUID), eventService)
 
 	c = &Core{
-		pndStore:    nucleus.NewPndStore(),
+		pndStore:    pndStore,
+		pndService:  nucleus.NewPndService(pndStore),
+		mneService:  nucleus.NewNetworkElementService(nucleus.NewNetworkElementStore(config.BasePndUUID), sbiService, eventService),
+		sbiService:  sbiService,
 		userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService),
 		roleService: rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService),
 		topologyService: topology.NewTopologyService(
@@ -118,13 +124,12 @@ func initialize() error {
 			portService,
 			eventService,
 		),
-		nodeService:    nodeService,
-		portService:    portService,
-		routeService:   routeService,
-		eventService:   eventService,
-		appService:     apps.NewAppService(apps.NewAppStore()),
-		stopChan:       make(chan os.Signal, 1),
-		serviceManager: serviveManager,
+		nodeService:  nodeService,
+		portService:  portService,
+		routeService: routeService,
+		eventService: eventService,
+		appService:   apps.NewAppService(apps.NewAppStore()),
+		stopChan:     make(chan os.Signal, 1),
 	}
 
 	// Setting up signal capturing
@@ -135,7 +140,7 @@ func initialize() error {
 		return err
 	}
 
-	c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.serviceManager, c.eventService)
+	c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.mneService, c.eventService)
 	c.networkElementWatcher.SubToNetworkElements(config.GetGnmiSubscriptionPaths(), nil)
 
 	err = ensureDefaultRoleExists()
@@ -168,15 +173,18 @@ func startGrpc() error {
 	log.Infof("listening to %v", lislisten.Addr())
 
 	jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration)
-	setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.serviceManager)
+	setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.userService, c.roleService)
 
-	basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID})
+	basePnd, err := c.pndService.Get(store.Query{ID: config.BasePndUUID})
 	if err != nil {
 		panic(err)
 	}
 
 	c.nbi = nbi.NewNBI(
 		c.pndStore,
+		c.pndService,
+		c.mneService,
+		c.sbiService,
 		c.userService,
 		c.roleService,
 		*jwtManager,
@@ -186,7 +194,6 @@ func startGrpc() error {
 		c.routeService,
 		c.appService,
 		basePnd,
-		c.serviceManager,
 	)
 
 	pb.RegisterCoreServiceServer(c.grpcServer, c.nbi.Core)
@@ -218,7 +225,7 @@ func startGrpc() error {
 
 // createPrincipalNetworkDomain initializes the controller with an initial PND.
 func createPrincipalNetworkDomain() error {
-	basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID})
+	basePnd, err := c.pndService.Get(store.Query{ID: config.BasePndUUID})
 	if err != nil {
 		log.Info(err)
 	}
@@ -372,67 +379,14 @@ func callback(id uuid.UUID, ch chan networkelement.Details) {
 // This allows users to operate on the controller without any authentication/authorization,
 // but they could still login if they want to.
 // Use insecure only for testing purposes and with caution.
-func setupGRPCServerWithCorrectSecurityLevel(jwt *rbacImpl.JWTManager, serviceManager servmgmt.ServiceManager) {
+func setupGRPCServerWithCorrectSecurityLevel(jwt *rbacImpl.JWTManager, userService rbac.UserService, roleService rbac.RoleService) {
 	securityLevel := viper.GetString("security")
 	if securityLevel == "insecure" {
 		c.grpcServer = grpc.NewServer()
 		log.Info("set up grpc server in insecure mode")
 	} else {
-		interceptor := server.NewAuthInterceptor(jwt, serviceManager)
+		interceptor := server.NewAuthInterceptor(jwt, userService, roleService)
 		c.grpcServer = grpc.NewServer(grpc.UnaryInterceptor(interceptor.Unary()), grpc.StreamInterceptor(interceptor.Stream()))
 		log.Info("set up grpc server in secure mode")
 	}
 }
-
-// TODO(PND): add changeStore here?!
-func initServiceManager(eventService eventInterfaces.Service) servmgmt.ServiceManager {
-
-	pndStore := nucleus.NewPndStore()
-	pndService := nucleus.NewPndService(pndStore)
-
-	sbiStore := nucleus.NewSbiStore(uuid.New())
-	sbiService := nucleus.NewSbiService(sbiStore, eventService)
-
-	networkElementStore := nucleus.NewNetworkElementStore(uuid.New())
-	networkElementService := nucleus.NewNetworkElementService(
-		networkElementStore,
-		sbiService,
-		eventService,
-	)
-
-	userService := rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService)
-	roleService := rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService)
-
-	nodeService := nodes.NewNodeService(nodes.NewDatabaseNodeStore(), eventService)
-	portService := ports.NewPortService(ports.NewDatabasePortStore(), eventService)
-
-	//TODO(PND): find way to add servicemanager here instead of having al the extra services in constructor?!
-	routeService := routingtables.NewRoutingTableService(
-		routingtables.NewDatabaseRoutingTableStore(),
-		nodeService,
-		portService,
-		eventService,
-	)
-	topologyService := topology.NewTopologyService(
-		topology.NewDatabaseTopologyStore(),
-		nodeService,
-		portService,
-		eventService,
-	)
-
-	appService := app.NewAppService(app.NewAppStore())
-
-	//TODO(PND): add real change store!?
-	return *servmgmt.NewServiceManager(pndService, pndStore,
-		store.ChangeStore{},
-		sbiService,
-		networkElementService,
-		userService,
-		roleService,
-		nodeService,
-		portService,
-		topologyService,
-		routeService,
-		appService,
-	)
-}
diff --git a/controller/interfaces/networkdomain/pndService.go b/controller/interfaces/networkdomain/pndService.go
index a6894bc731fab2bb9c99eca1ad429b2a77113685..ecc0c715b878df9801640e01b023d3bac1454910 100644
--- a/controller/interfaces/networkdomain/pndService.go
+++ b/controller/interfaces/networkdomain/pndService.go
@@ -4,8 +4,8 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 )
 
-// PndService describes an interface for PND service implementation.
-type PndService interface {
+// Service describes an interface for PND service implementation.
+type Service interface {
 	Add(NetworkDomain) error
 	Delete(NetworkDomain) error
 	Get(store.Query) (NetworkDomain, error)
diff --git a/controller/northbound/server/auth.go b/controller/northbound/server/auth.go
index 41beefe78223b36e30a4e338a025e9539758505d..e7459f7b5ddee7e9b051ff613938f32e4e8b0d50 100644
--- a/controller/northbound/server/auth.go
+++ b/controller/northbound/server/auth.go
@@ -6,9 +6,9 @@ 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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/prometheus/client_golang/prometheus"
 	"golang.org/x/crypto/argon2"
@@ -20,15 +20,15 @@ import (
 // AuthServer holds a JWTManager and represents a AuthServiceServer.
 type AuthServer struct {
 	apb.UnimplementedAuthServiceServer
-	jwtManager     *rbac.JWTManager
-	serviceManager servmgmt.ServiceManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
 }
 
 // NewAuthServer receives a JWTManager and a userService and returns a new Auth interface.
-func NewAuthServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *AuthServer {
+func NewAuthServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserService) *AuthServer {
 	return &AuthServer{
-		jwtManager:     jwtManager,
-		serviceManager: serviceManager,
+		jwtManager:  jwtManager,
+		userService: userService,
 	}
 }
 
@@ -55,14 +55,14 @@ func (s AuthServer) Login(ctx context.Context, request *apb.LoginRequest) (*apb.
 		return nil, err
 	}
 
-	userToUpdate, err := s.serviceManager.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 = s.serviceManager.UserService.Update(userToUpdate)
+	err = s.userService.Update(userToUpdate)
 	if err != nil {
 		return nil, err
 	}
@@ -93,7 +93,7 @@ func (s AuthServer) Logout(ctx context.Context, request *apb.LogoutRequest) (*ap
 
 // isValidUser checks if the provided user name fits to a stored one and then checks if the provided password is correct.
 func (s AuthServer) isValidUser(user rbac.User) error {
-	storedUser, err := s.serviceManager.UserService.Get(store.Query{Name: user.Name()})
+	storedUser, err := s.userService.Get(store.Query{Name: user.Name()})
 	if err != nil {
 		return err
 	}
@@ -139,7 +139,7 @@ func (s AuthServer) 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 := s.serviceManager.UserService.Get(store.Query{Name: userName})
+		storedUser, err := s.userService.Get(store.Query{Name: userName})
 		if err != nil {
 			return err
 		}
@@ -148,7 +148,7 @@ func (s AuthServer) handleLogout(ctx context.Context, userName string) error {
 			return status.Errorf(codes.Aborted, "missing match of token provied for user")
 		}
 
-		err = s.serviceManager.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 03cc895c97bfa1c43015cee44fc73f49b0f499f0..30ffa2ea982be33282ab3db1c86cfe2f6e22d06e 100644
--- a/controller/northbound/server/auth_interceptor.go
+++ b/controller/northbound/server/auth_interceptor.go
@@ -4,7 +4,7 @@ import (
 	"context"
 	"time"
 
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
+	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 
 	csbipb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
@@ -18,18 +18,21 @@ import (
 
 // AuthInterceptor provides an AuthInterceptor.
 type AuthInterceptor struct {
-	jwtManager     *rbac.JWTManager
-	serviceManager servmgmt.ServiceManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
+	roleService rbacInterfaces.RoleService
 }
 
 // NewAuthInterceptor receives a JWTManager and a rbacMand returns a new AuthInterceptor provding gRPC Interceptor functionality.
 func NewAuthInterceptor(
 	jwtManager *rbac.JWTManager,
-	serviceManager servmgmt.ServiceManager,
+	userService rbacInterfaces.UserService,
+	roleService rbacInterfaces.RoleService,
 ) *AuthInterceptor {
 	return &AuthInterceptor{
-		jwtManager:     jwtManager,
-		serviceManager: serviceManager,
+		jwtManager:  jwtManager,
+		userService: userService,
+		roleService: roleService,
 	}
 }
 
@@ -89,7 +92,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 := auth.serviceManager.UserService.Get(store.Query{Name: claims.Username})
+		user, err := auth.userService.Get(store.Query{Name: claims.Username})
 		if err != nil {
 			return err
 		}
@@ -121,7 +124,7 @@ func (auth *AuthInterceptor) verifyPermisisonForRequestedCall(userRoles map[stri
 }
 
 func (auth *AuthInterceptor) verifyUserRoleAndRequestedCall(userRole, requestedMethod string) error {
-	storedRoles, err := auth.serviceManager.RoleService.GetAll()
+	storedRoles, err := auth.roleService.GetAll()
 	if err != nil {
 		return err
 	}
diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go
index a47349bbf92ed515e7b850465be464a6994853f1..bc374a98d08c76111ef8dd38cacb49477849e968 100644
--- a/controller/northbound/server/auth_interceptor_test.go
+++ b/controller/northbound/server/auth_interceptor_test.go
@@ -12,7 +12,6 @@ import (
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
 	"google.golang.org/grpc/metadata"
@@ -39,14 +38,12 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer,
 		t.Fatal(err)
 	}
 
-	serviceManager := servmgmt.ServiceManager{PndService: pndService, UserService: userService, RoleService: roleService}
+	s := NewAuthInterceptor(jwtManager, userService, roleService)
+	u := NewUserServer(jwtManager, userService)
+	r := NewRoleServer(jwtManager, roleService)
+	sbiServer := NewSbiServer(pndService)
 
-	s := NewAuthInterceptor(jwtManager, serviceManager)
-	u := NewUserServer(jwtManager, serviceManager)
-	r := NewRoleServer(jwtManager, serviceManager)
-	sbiServer := NewSbiServer(serviceManager)
-
-	if err := clearAndCreateAuthTestSetup(serviceManager); err != nil {
+	if err := clearAndCreateAuthTestSetup(userService, roleService); err != nil {
 		t.Fatal(err)
 	}
 
@@ -75,12 +72,12 @@ func dialer(interceptorServer *AuthInterceptor, userServer *UserServer, roleServ
 
 func TestAuthInterceptor_Unary(t *testing.T) {
 	authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t)
-	validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager)
+	validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager)
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	wrongUserToken, err := createTestUserToken("foo", false, authServer.serviceManager, authServer.jwtManager)
+	wrongUserToken, err := createTestUserToken("foo", false, authServer.userService, authServer.jwtManager)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -171,7 +168,7 @@ func TestAuthInterceptor_Unary(t *testing.T) {
 
 func TestAuthInterceptor_Stream(t *testing.T) {
 	authServer, userServer, roleServer, sbiServer := getTestAuthInterceptorServer(t)
-	validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager)
+	validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -246,12 +243,12 @@ func TestAuthInterceptor_Stream(t *testing.T) {
 
 func TestAuthInterceptor_authorize(t *testing.T) {
 	authServer, _, _, _ := getTestAuthInterceptorServer(t)
-	validToken, err := createTestUserToken("testAdmin", true, authServer.serviceManager, authServer.jwtManager)
+	validToken, err := createTestUserToken("testAdmin", true, authServer.userService, authServer.jwtManager)
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	wrongUserToken, err := createTestUserToken("foo", false, authServer.serviceManager, authServer.jwtManager)
+	wrongUserToken, err := createTestUserToken("foo", false, authServer.userService, authServer.jwtManager)
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/controller/northbound/server/auth_test.go b/controller/northbound/server/auth_test.go
index bc3d7fba5035101ad33e883b2f88bbd0a7f67eda..c6d362a0bd6f8540cbd79bc0a1581bdad453bab0 100644
--- a/controller/northbound/server/auth_test.go
+++ b/controller/northbound/server/auth_test.go
@@ -9,7 +9,6 @@ import (
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"google.golang.org/grpc/metadata"
 )
 
@@ -23,10 +22,9 @@ func getTestAuthServer(t *testing.T) *AuthServer {
 	roleStore := rbac.NewMemoryRoleStore()
 	roleService := rbac.NewRoleService(roleStore, eventService)
 
-	serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService}
+	s := NewAuthServer(jwtManager, userService)
+	err := clearAndCreateAuthTestSetup(s.userService, roleService)
 
-	s := NewAuthServer(jwtManager, serviceManager)
-	err := clearAndCreateAuthTestSetup(serviceManager)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
@@ -90,7 +88,7 @@ func TestAuth_Login(t *testing.T) {
 
 func TestAuth_Logout(t *testing.T) {
 	s := getTestAuthServer(t)
-	validToken, err := createTestUserToken("testAdmin", true, s.serviceManager, s.jwtManager)
+	validToken, err := createTestUserToken("testAdmin", true, s.userService, s.jwtManager)
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -188,12 +186,12 @@ func TestAuth_isValidUser(t *testing.T) {
 
 func TestAuth_handleLogout(t *testing.T) {
 	s := getTestAuthServer(t)
-	validToken, err := createTestUserToken("testAdmin", true, s.serviceManager, s.jwtManager)
+	validToken, err := createTestUserToken("testAdmin", true, s.userService, s.jwtManager)
 	if err != nil {
 		log.Fatal(err)
 	}
 
-	invalidToken, err := createTestUserToken("testAdmin", false, s.serviceManager, s.jwtManager)
+	invalidToken, err := createTestUserToken("testAdmin", false, s.userService, s.jwtManager)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/controller/northbound/server/core.go b/controller/northbound/server/core.go
index c20c8c7b168476e5ab7344c3e591f6b679a48a95..dc6919c091efd076c013b630b5f7f767b7d12dbc 100644
--- a/controller/northbound/server/core.go
+++ b/controller/northbound/server/core.go
@@ -6,9 +6,9 @@ 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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/prometheus/client_golang/prometheus"
@@ -17,13 +17,13 @@ import (
 // CoreServer represents a core server.
 type CoreServer struct {
 	pb.UnimplementedCoreServiceServer
-	serviceManager servmgmt.ServiceManager
+	pndService networkdomain.Service
 }
 
 // NewCoreServer receives a pndStore and returns a new coreServer.
-func NewCoreServer(serviceManager servmgmt.ServiceManager) *CoreServer {
+func NewCoreServer(pndService networkdomain.Service) *CoreServer {
 	return &CoreServer{
-		serviceManager: serviceManager,
+		pndService: pndService,
 	}
 }
 
@@ -38,7 +38,7 @@ func (s CoreServer) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb.
 		return nil, handleRPCError(labels, err)
 	}
 
-	storedPnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID})
+	storedPnd, err := s.pndService.Get(store.Query{ID: pndID})
 	if err != nil {
 		return nil, err
 	}
@@ -61,7 +61,7 @@ func (s CoreServer) GetPndList(ctx context.Context, request *pb.GetPndListReques
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	pndList, err := s.serviceManager.PndService.GetAll()
+	pndList, err := s.pndService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -90,7 +90,7 @@ func (s CoreServer) CreatePndList(ctx context.Context, request *pb.CreatePndList
 		if err != nil {
 			return nil, handleRPCError(labels, err)
 		}
-		if err := s.serviceManager.PndService.Add(pnd); err != nil {
+		if err := s.pndService.Add(pnd); err != nil {
 			return nil, handleRPCError(labels, err)
 		}
 	}
@@ -111,11 +111,11 @@ func (s CoreServer) DeletePnd(ctx context.Context, request *pb.DeletePndRequest)
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID})
+	pnd, err := s.pndService.Get(store.Query{ID: pndID})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
-	err = s.serviceManager.PndService.Delete(pnd)
+	err = s.pndService.Delete(pnd)
 	if err != nil {
 		return &pb.DeletePndResponse{
 			Timestamp: time.Now().UnixNano(),
diff --git a/controller/northbound/server/core_test.go b/controller/northbound/server/core_test.go
index 05a30452c56a995b5f713c8b1055a807c044948b..a470b54a27dadb2da79852c2b4c8ede390b09836 100644
--- a/controller/northbound/server/core_test.go
+++ b/controller/northbound/server/core_test.go
@@ -11,7 +11,6 @@ import (
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
@@ -96,11 +95,7 @@ func getTestCoreServer(t *testing.T) *CoreServer {
 
 	pndService := nucleus.NewPndService(pndStore)
 
-	serviceManager := servmgmt.ServiceManager{
-		PndService: pndService,
-	}
-
-	c := NewCoreServer(serviceManager)
+	c := NewCoreServer(pndService)
 
 	return c
 }
diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go
index 0db12578c3e218faf54bd9b0201a53a3ab0accb8..1d7274120aae01cd13bfaa6c5276b42cb810e0f3 100644
--- a/controller/northbound/server/nbi.go
+++ b/controller/northbound/server/nbi.go
@@ -3,9 +3,10 @@ package server
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/app"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
@@ -37,6 +38,9 @@ type NorthboundInterface struct {
 // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface.
 func NewNBI(
 	pnds networkdomain.PndStore,
+	pndService networkdomain.Service,
+	mneService networkelement.Service,
+	sbiService southbound.Service,
 	users rbacInterfaces.UserService,
 	roles rbacInterfaces.RoleService,
 	jwt rbac.JWTManager,
@@ -46,19 +50,18 @@ func NewNBI(
 	routeService routingtables.Service,
 	apps app.ManagementService,
 	networkDomain networkdomain.NetworkDomain,
-	serviceManager servmgmt.ServiceManager,
 ) *NorthboundInterface {
 	return &NorthboundInterface{
-		Pnd:            NewPndServer(serviceManager),
-		Core:           NewCoreServer(serviceManager),
+		Pnd:            NewPndServer(pndService),
+		Core:           NewCoreServer(pndService),
 		Csbi:           NewCsbiServer(pnds),
-		Sbi:            NewSbiServer(serviceManager),
-		Auth:           NewAuthServer(&jwt, serviceManager),
-		User:           NewUserServer(&jwt, serviceManager),
-		Role:           NewRoleServer(&jwt, serviceManager),
+		Sbi:            NewSbiServer(pndService),
+		Auth:           NewAuthServer(&jwt, users),
+		User:           NewUserServer(&jwt, users),
+		Role:           NewRoleServer(&jwt, roles),
 		Topology:       NewTopologyServer(topologyService, nodeService, portService),
 		App:            NewAppServer(apps),
-		NetworkElement: NewNetworkElementServer(networkDomain, serviceManager),
+		NetworkElement: NewNetworkElementServer(mneService, pndService, sbiService),
 		Routes:         NewRoutingTableServiceServer(routeService, nodeService, portService),
 	}
 }
diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go
index 0fd870faadedeaf59639ba306b5faeeeb90c0b02..25b2f7dad85e2f142a3a03d5e38057697e4b062c 100644
--- a/controller/northbound/server/networkElement.go
+++ b/controller/northbound/server/networkElement.go
@@ -17,7 +17,6 @@ import (
 	"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/nucleus/types"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	"github.com/google/uuid"
@@ -34,117 +33,124 @@ import (
 // NetworkElementServer represents a NetworkElementServer.
 type NetworkElementServer struct {
 	mnepb.UnimplementedNetworkElementServiceServer
-	networkDomain  networkdomain.NetworkDomain
-	serviceManager servmgmt.ServiceManager
+	mneService networkelement.Service
+	pndService networkdomain.Service
+	sbiService southbound.Service
 }
 
 // NewNetworkElementServer returns a new NetWorkElementServer.
-func NewNetworkElementServer(networkDomain networkdomain.NetworkDomain, serviceManager servmgmt.ServiceManager) *NetworkElementServer {
+func NewNetworkElementServer(mneService networkelement.Service, pndService networkdomain.Service, sbiService southbound.Service) *NetworkElementServer {
 	return &NetworkElementServer{
-		networkDomain:  networkDomain,
-		serviceManager: serviceManager,
+		mneService: mneService,
+		pndService: pndService,
+		sbiService: sbiService,
 	}
 }
 
-// Add adds a new network element.
-func (n *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) {
-	sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id)
-	if err != nil {
-		return nil, status.Errorf(codes.Aborted, "%v", err)
-	}
-
-	id, err := n.networkDomain.AddNetworkElement(
-		request.NetworkElement.NetworkElementName,
-		request.NetworkElement.TransportOption,
-		sbiID,
-	)
-	if err != nil {
-		return nil, status.Errorf(codes.Aborted, "%v", err)
-	}
-
-	return &mnepb.AddNetworkElementResponse{
-		Timestamp:        time.Now().UnixNano(),
-		Status:           mnepb.Status_STATUS_OK,
-		NetworkElementId: id.String(),
-	}, nil
-}
-
-// GetAll returns all stored network elements.
-func (n *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) {
-	networkElements := n.networkDomain.NetworkElements()
-
-	mnes := []*mnepb.NetworkElement{}
-	for _, mne := range networkElements {
-		ygotStructAsJSON, err := mne.GetModelAsString()
-		if err != nil {
-			log.Error(err)
-			return nil, status.Errorf(codes.Aborted, "%v", err)
-		}
-
-		mnes = append(mnes, &mnepb.NetworkElement{
-			Id:    mne.ID().String(),
-			Name:  mne.Name(),
-			Model: ygotStructAsJSON,
-		})
-	}
-
-	return &mnepb.GetAllNetworkElementResponse{
-		Timestamp:      time.Now().UnixNano(),
-		Status:         mnepb.Status_STATUS_OK,
-		NetworkElement: mnes,
-	}, nil
-}
-
-// Get returns a network element.
-func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) {
-	mne, err := n.networkDomain.GetNetworkElement(request.NetworkElementId)
-	if err != nil {
-		return nil, status.Errorf(codes.Aborted, "%v", err)
-	}
-
-	ygotStructAsJSON, err := mne.GetModelAsString()
-	if err != nil {
-		log.Error(err)
-		return nil, status.Errorf(codes.Aborted, "%v", err)
-	}
-
-	networkElement := &mnepb.NetworkElement{
-		Id:               mne.ID().String(),
-		Name:             mne.Name(),
-		Model:            ygotStructAsJSON,
-		TransportAddress: mne.TransportAddress(),
-	}
-
-	return &mnepb.GetNetworkElementResponse{
-		Timestamp:      time.Now().UnixNano(),
-		Status:         mnepb.Status_STATUS_OK,
-		NetworkElement: networkElement,
-	}, nil
-}
-
-// Update updates a network element.
-func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) {
-	mneID, err := uuid.Parse(request.NetworkElement.Id)
-	if err != nil {
-		return &mnepb.UpdateNetworkElementResponse{
-			Timestamp: time.Now().UnixNano(),
-			Status:    mnepb.Status_STATUS_OK,
-		}, err
-	}
-
-	err = n.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model)
-	if err != nil {
-		return &mnepb.UpdateNetworkElementResponse{
-			Timestamp: time.Now().UnixNano(),
-			Status:    mnepb.Status_STATUS_OK,
-		}, err
-	}
-
-	return &mnepb.UpdateNetworkElementResponse{
-		Timestamp: time.Now().UnixNano(),
-		Status:    mnepb.Status_STATUS_OK,
-	}, nil
-}
+// // Add adds a new network element.
+// func (n *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) {
+// 	sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id)
+// 	if err != nil {
+// 		return nil, status.Errorf(codes.Aborted, "%v", err)
+// 	}
+
+// 	id, err := n.networkDomain.AddNetworkElement(
+// 		request.NetworkElement.NetworkElementName,
+// 		request.NetworkElement.TransportOption,
+// 		sbiID,
+// 	)
+
+// 	if err != nil {
+// 		return nil, status.Errorf(codes.Aborted, "%v", err)
+// 	}
+
+// 	return &mnepb.AddNetworkElementResponse{
+// 		Timestamp:        time.Now().UnixNano(),
+// 		Status:           mnepb.Status_STATUS_OK,
+// 		NetworkElementId: id.String(),
+// 	}, nil
+// }
+
+// func (n *NetworkElementServer) addNetworkElement(name string, transportOpt *tpb.TransportOption, sbiID uuid.UUID) (uuid.UUID, error) {
+
+// }
+
+// // GetAll returns all stored network elements.
+// func (n *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) {
+// 	networkElements := n.networkDomain.NetworkElements()
+
+// 	mnes := []*mnepb.NetworkElement{}
+// 	for _, mne := range networkElements {
+// 		ygotStructAsJSON, err := mne.GetModelAsString()
+// 		if err != nil {
+// 			log.Error(err)
+// 			return nil, status.Errorf(codes.Aborted, "%v", err)
+// 		}
+
+// 		mnes = append(mnes, &mnepb.NetworkElement{
+// 			Id:    mne.ID().String(),
+// 			Name:  mne.Name(),
+// 			Model: ygotStructAsJSON,
+// 		})
+// 	}
+
+// 	return &mnepb.GetAllNetworkElementResponse{
+// 		Timestamp:      time.Now().UnixNano(),
+// 		Status:         mnepb.Status_STATUS_OK,
+// 		NetworkElement: mnes,
+// 	}, nil
+// }
+
+// // Get returns a network element.
+// func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) {
+// 	mne, err := n.networkDomain.GetNetworkElement(request.NetworkElementId)
+// 	if err != nil {
+// 		return nil, status.Errorf(codes.Aborted, "%v", err)
+// 	}
+
+// 	ygotStructAsJSON, err := mne.GetModelAsString()
+// 	if err != nil {
+// 		log.Error(err)
+// 		return nil, status.Errorf(codes.Aborted, "%v", err)
+// 	}
+
+// 	networkElement := &mnepb.NetworkElement{
+// 		Id:               mne.ID().String(),
+// 		Name:             mne.Name(),
+// 		Model:            ygotStructAsJSON,
+// 		TransportAddress: mne.TransportAddress(),
+// 	}
+
+// 	return &mnepb.GetNetworkElementResponse{
+// 		Timestamp:      time.Now().UnixNano(),
+// 		Status:         mnepb.Status_STATUS_OK,
+// 		NetworkElement: networkElement,
+// 	}, nil
+// }
+
+// // Update updates a network element.
+// func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) {
+// 	mneID, err := uuid.Parse(request.NetworkElement.Id)
+// 	if err != nil {
+// 		return &mnepb.UpdateNetworkElementResponse{
+// 			Timestamp: time.Now().UnixNano(),
+// 			Status:    mnepb.Status_STATUS_OK,
+// 		}, err
+// 	}
+
+// 	err = n.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model)
+// 	if err != nil {
+// 		return &mnepb.UpdateNetworkElementResponse{
+// 			Timestamp: time.Now().UnixNano(),
+// 			Status:    mnepb.Status_STATUS_OK,
+// 		}, err
+// 	}
+
+// 	return &mnepb.UpdateNetworkElementResponse{
+// 		Timestamp: time.Now().UnixNano(),
+// 		Status:    mnepb.Status_STATUS_OK,
+// 	}, nil
+// }
 
 // GetMne gets a specific mne.
 func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMneRequest) (*mnepb.GetMneResponse, error) {
@@ -157,7 +163,7 @@ func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMne
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -194,7 +200,7 @@ func (n *NetworkElementServer) getMne(identifier string) (networkelement.Network
 		id = uuid.Nil
 	}
 
-	mne, err := n.serviceManager.MneService.Get(store.Query{
+	mne, err := n.mneService.Get(store.Query{
 		ID: id,
 	})
 	if mne == nil {
@@ -218,13 +224,13 @@ func (n *NetworkElementServer) GetMneList(ctx context.Context, request *mnepb.Ge
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
-	storedMNE, err := n.serviceManager.MneService.GetAll()
+	storedMNE, err := n.mneService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -261,13 +267,13 @@ func (n *NetworkElementServer) GetFlattenedMneList(ctx context.Context, request
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
-	mnes, err := n.serviceManager.MneService.GetAllAsLoaded()
+	mnes, err := n.mneService.GetAllAsLoaded()
 	if err != nil {
 		return nil, err
 	}
@@ -366,7 +372,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -399,7 +405,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa
 }
 
 func (n *NetworkElementServer) getPath(ctx context.Context, uuid uuid.UUID, path string) (proto.Message, error) {
-	mne, err := n.serviceManager.MneService.Get(store.Query{
+	mne, err := n.mneService.Get(store.Query{
 		ID:   uuid,
 		Name: uuid.String(),
 	})
@@ -433,7 +439,7 @@ func (n *NetworkElementServer) getPath(ctx context.Context, uuid uuid.UUID, path
 	}
 
 	// TODO(path): We probably have to remove this when we address path request handling.
-	err = n.serviceManager.MneService.UpdateModel(uuid, modelAsString)
+	err = n.mneService.UpdateModel(uuid, modelAsString)
 	if err != nil {
 		return nil, err
 	}
@@ -452,7 +458,7 @@ func (n *NetworkElementServer) GetChange(ctx context.Context, request *mnepb.Get
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -486,7 +492,7 @@ func (n *NetworkElementServer) GetChangeList(ctx context.Context, request *mnepb
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -623,7 +629,7 @@ func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb
 	// 	}
 	// }
 
-	sbi, err = n.serviceManager.SbiService.Get(store.Query{ID: sid})
+	sbi, err = n.sbiService.Get(store.Query{ID: sid})
 	if err != nil {
 		return uuid.Nil, err
 	}
@@ -633,7 +639,7 @@ func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb
 		return uuid.Nil, err
 	}
 
-	err = n.serviceManager.MneService.Add(mne)
+	err = n.mneService.Add(mne)
 	if err != nil {
 		return uuid.Nil, err
 	}
@@ -658,7 +664,7 @@ func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -711,7 +717,7 @@ func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.S
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := n.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
@@ -766,7 +772,7 @@ func (n *NetworkElementServer) DeleteMne(ctx context.Context, request *mnepb.Del
 }
 
 func (n *NetworkElementServer) deleteMne(id uuid.UUID) error {
-	mne, err := n.serviceManager.MneService.Get(store.Query{
+	mne, err := n.mneService.Get(store.Query{
 		ID:   id,
 		Name: id.String(),
 	})
@@ -788,7 +794,7 @@ func (n *NetworkElementServer) deleteMne(id uuid.UUID) error {
 	// 	return pnd.networkElementService.Delete(mne)
 	// }
 
-	return n.serviceManager.MneService.Delete(mne)
+	return n.mneService.Delete(mne)
 }
 
 // SubscribePath subscribes to specifc paths of an mne.
@@ -806,7 +812,7 @@ func (n *NetworkElementServer) SubscribePath(request *mnepb.SubscribePathRequest
 }
 
 func (n *NetworkElementServer) subscribePath(uuid uuid.UUID, subList *mnepb.SubscriptionList) error {
-	mne, err := n.serviceManager.MneService.Get(store.Query{
+	mne, err := n.mneService.Get(store.Query{
 		ID: uuid,
 	})
 	if err != nil {
diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go
index 908c31fe8115f41b953d08737b41d42132edb5cf..dc2854939974220f95c477e6092cc166158d3112 100644
--- a/controller/northbound/server/pnd.go
+++ b/controller/northbound/server/pnd.go
@@ -7,9 +7,9 @@ import (
 	ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
 	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/interfaces/southbound"
 	"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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/prometheus/client_golang/prometheus"
@@ -21,13 +21,14 @@ import (
 // PndServer implements a pnd server.
 type PndServer struct {
 	ppb.UnimplementedPndServiceServer
-	serviceManager servmgmt.ServiceManager
+	pndService networkdomain.Service
+	sbiService southbound.Service
 }
 
 // NewPndServer receives a pndStore and returns a new pndServer.
-func NewPndServer(serviceManager servmgmt.ServiceManager) *PndServer {
+func NewPndServer(pndService networkdomain.Service) *PndServer {
 	return &PndServer{
-		serviceManager: serviceManager,
+		pndService: pndService,
 	}
 }
 
@@ -41,7 +42,7 @@ func (p PndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := p.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -81,7 +82,7 @@ func (p PndServer) GetSbiList(ctx context.Context, request *ppb.GetSbiListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := p.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -129,7 +130,7 @@ func (p PndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListReques
 		return nil, handleRPCError(labels, err)
 	}
 
-	pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := p.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		return nil, handleRPCError(labels, err)
 	}
diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go
index 6608cd19ad99d4375f89dbef7a5d7e44b62a4a7f..1e4166b21c43f5c83e12105497e786d5dc4da700 100644
--- a/controller/northbound/server/pnd_test.go
+++ b/controller/northbound/server/pnd_test.go
@@ -9,7 +9,6 @@ import (
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 	"github.com/google/uuid"
 	"github.com/openconfig/gnmi/proto/gnmi"
@@ -96,9 +95,7 @@ func getTestPndServer(t *testing.T) *PndServer {
 
 	pndService := nucleus.NewPndService(pndStore)
 
-	serviceManager := &servmgmt.ServiceManager{PndService: pndService}
-
-	c := NewPndServer(*serviceManager)
+	c := NewPndServer(pndService)
 
 	return c
 }
diff --git a/controller/northbound/server/role.go b/controller/northbound/server/role.go
index 2a873bb33fbabdbf98316006be7b0ba314cfb1b5..58d42d01b7893a1c7448c766cfd3092624d2730a 100644
--- a/controller/northbound/server/role.go
+++ b/controller/northbound/server/role.go
@@ -6,9 +6,9 @@ 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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/prometheus/client_golang/prometheus"
@@ -20,15 +20,15 @@ import (
 // RoleServer holds a JWTManager and represents a RoleServiceServer.
 type RoleServer struct {
 	apb.UnimplementedRoleServiceServer
-	jwtManager     *rbac.JWTManager
-	serviceManager servmgmt.ServiceManager
+	jwtManager  *rbac.JWTManager
+	roleService rbacInterfaces.RoleService
 }
 
 // NewRoleServer receives a JWTManager and a RoleService and returns a new RoleServer.
-func NewRoleServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *RoleServer {
+func NewRoleServer(jwtManager *rbac.JWTManager, roleService rbacInterfaces.RoleService) *RoleServer {
 	return &RoleServer{
-		jwtManager:     jwtManager,
-		serviceManager: serviceManager,
+		jwtManager:  jwtManager,
+		roleService: roleService,
 	}
 }
 
@@ -41,7 +41,7 @@ func (r RoleServer) CreateRoles(ctx context.Context, request *apb.CreateRolesReq
 	for _, rrole := range request.Roles {
 		role := rbac.NewRole(uuid.New(), rrole.Name, rrole.Description, rrole.Permissions)
 
-		err := r.serviceManager.RoleService.Add(role)
+		err := r.roleService.Add(role)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -65,7 +65,7 @@ func (r RoleServer) GetRole(ctx context.Context, request *apb.GetRoleRequest) (*
 		return nil, fmt.Errorf("could not parse role uuid")
 	}
 
-	roleData, err := r.serviceManager.RoleService.Get(store.Query{Name: request.RoleName, ID: roleID})
+	roleData, err := r.roleService.Get(store.Query{Name: request.RoleName, ID: roleID})
 	if err != nil {
 		return nil, err
 	}
@@ -90,7 +90,7 @@ func (r RoleServer) GetRoles(ctx context.Context, request *apb.GetRolesRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleList, err := r.serviceManager.RoleService.GetAll()
+	roleList, err := r.roleService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -123,13 +123,13 @@ func (r RoleServer) UpdateRoles(ctx context.Context, request *apb.UpdateRolesReq
 		if err != nil {
 			return nil, handleRPCError(labels, err)
 		}
-		_, err = r.serviceManager.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, role.Name, role.Description, role.Permissions)
-		err = r.serviceManager.RoleService.Update(roleToUpdate)
+		err = r.roleService.Update(roleToUpdate)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "could not update role %v", err)
 		}
@@ -147,7 +147,7 @@ func (r RoleServer) DeletePermissionsForRole(ctx context.Context, request *apb.D
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	roleToUpdate, err := r.serviceManager.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)
 	}
@@ -172,7 +172,7 @@ func (r RoleServer) DeletePermissionsForRole(ctx context.Context, request *apb.D
 
 	// updates the existing role with the trimmed set of permissions
 	roleToUpdate.RemovePermissionsFromRole(request.PermissionsToDelete)
-	err = r.serviceManager.RoleService.Update(roleToUpdate)
+	err = r.roleService.Update(roleToUpdate)
 	if err != nil {
 		return nil, status.Errorf(codes.Aborted, "could not update role %v", err)
 	}
@@ -190,12 +190,12 @@ func (r RoleServer) DeleteRoles(ctx context.Context, request *apb.DeleteRolesReq
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
 	for _, role := range request.RoleName {
-		roleToDelete, err := r.serviceManager.RoleService.Get(store.Query{Name: role})
+		roleToDelete, err := r.roleService.Get(store.Query{Name: role})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "role not found")
 		}
 
-		err = r.serviceManager.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/role_test.go b/controller/northbound/server/role_test.go
index c4c88fe4fab78fff993d8818e0c7445f5d17a433..2ad31431d68eba2c9c4b528554024af541b3ebd9 100644
--- a/controller/northbound/server/role_test.go
+++ b/controller/northbound/server/role_test.go
@@ -8,7 +8,6 @@ import (
 
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"github.com/google/uuid"
 
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
@@ -24,10 +23,8 @@ func getTestRoleServer(t *testing.T) *RoleServer {
 	roleStore := rbac.NewMemoryRoleStore()
 	roleService := rbac.NewRoleService(roleStore, eventService)
 
-	serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService}
-
-	s := NewRoleServer(jwtManager, serviceManager)
-	err := clearAndCreateAuthTestSetup(serviceManager)
+	s := NewRoleServer(jwtManager, roleService)
+	err := clearAndCreateAuthTestSetup(userService, roleService)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
diff --git a/controller/northbound/server/sbi.go b/controller/northbound/server/sbi.go
index 8edfaae2357ea68f3c564f8f4d81a3a04b1bff4a..3931be5904818ba8b8cd685ac9aca805835e8df4 100644
--- a/controller/northbound/server/sbi.go
+++ b/controller/northbound/server/sbi.go
@@ -6,8 +6,8 @@ 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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/prometheus/client_golang/prometheus"
@@ -27,13 +27,13 @@ const (
 // SbiServer represents a sbi server.
 type SbiServer struct {
 	spb.UnimplementedSbiServiceServer
-	serviceManager servmgmt.ServiceManager
+	pndService networkdomain.Service
 }
 
 // NewSbiServer receives a pndStore and returns a new sbiServer.
-func NewSbiServer(serviceManager servmgmt.ServiceManager) *SbiServer {
+func NewSbiServer(pndService networkdomain.Service) *SbiServer {
 	return &SbiServer{
-		serviceManager: serviceManager,
+		pndService: pndService,
 	}
 }
 
@@ -53,7 +53,7 @@ func (s SbiServer) GetSchema(request *spb.GetSchemaRequest, stream spb.SbiServic
 		return handleRPCError(labels, err)
 	}
 
-	pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pid})
+	pnd, err := s.pndService.Get(store.Query{ID: pid})
 	if err != nil {
 		return handleRPCError(labels, err)
 	}
diff --git a/controller/northbound/server/test_util_test.go b/controller/northbound/server/test_util_test.go
index 24fd718395685f41291da7b55e4f885fe2f27b87..e32c7d8011801a4bfdccc6200663e5df2a487572 100644
--- a/controller/northbound/server/test_util_test.go
+++ b/controller/northbound/server/test_util_test.go
@@ -14,7 +14,6 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
@@ -53,37 +52,37 @@ const randomRoleName = "bertram"
 var adminRoleMap = map[string]string{pndID: "adminTestRole"}
 var userRoleMap = map[string]string{pndID: "userTestRole"}
 
-func clearAndCreateAuthTestSetup(serviceManager servmgmt.ServiceManager) error {
+func clearAndCreateAuthTestSetup(userService rbacInterfaces.UserService, roleService rbacInterfaces.RoleService) error {
 	//clear setup if changed
-	storedUsers, err := serviceManager.UserService.GetAll()
+	storedUsers, err := userService.GetAll()
 	if err != nil {
 		return err
 	}
 	for _, u := range storedUsers {
-		err = serviceManager.UserService.Delete(u)
+		err = userService.Delete(u)
 		if err != nil {
 			return err
 		}
 	}
 
-	storedRoles, err := serviceManager.RoleService.GetAll()
+	storedRoles, err := roleService.GetAll()
 	if err != nil {
 		return err
 	}
 	for _, r := range storedRoles {
-		err = serviceManager.RoleService.Delete(r)
+		err = roleService.Delete(r)
 		if err != nil {
 			return err
 		}
 	}
 
 	// create dataset
-	err = createTestUsers(serviceManager.UserService)
+	err = createTestUsers(userService)
 	if err != nil {
 		return err
 	}
 
-	err = createTestRoles(serviceManager.RoleService)
+	err = createTestRoles(roleService)
 	if err != nil {
 		return err
 	}
@@ -181,20 +180,20 @@ func patchLogger(t *testing.T) {
 
 // Creates a token to be used in auth interceptor tests. If validTokenRequired is set as true, the generated token will also
 // be attached to the provided user. Else the user won't have the token and can not be authorized.
-func createTestUserToken(userName string, validTokenRequired bool, serviceManager servmgmt.ServiceManager, jwt *rbac.JWTManager) (string, error) {
+func createTestUserToken(userName string, validTokenRequired bool, userService rbacInterfaces.UserService, jwt *rbac.JWTManager) (string, error) {
 	token, err := jwt.GenerateToken(rbac.User{UserName: userName})
 	if err != nil {
 		return token, err
 	}
 
 	if validTokenRequired {
-		user, err := serviceManager.UserService.Get(store.Query{Name: userName})
+		user, err := userService.Get(store.Query{Name: userName})
 		if err != nil {
 			return token, err
 		}
 		user.SetToken(token)
 
-		err = serviceManager.UserService.Update(user)
+		err = userService.Update(user)
 		if err != nil {
 			return token, err
 		}
diff --git a/controller/northbound/server/user.go b/controller/northbound/server/user.go
index d68c7805ba6cf35f6a874ab0c93bd3f5096459f1..a50baaaab0fc4faee85aca99d707091b14a398fc 100644
--- a/controller/northbound/server/user.go
+++ b/controller/northbound/server/user.go
@@ -9,9 +9,9 @@ import (
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict"
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
+	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/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/prometheus/client_golang/prometheus"
@@ -26,15 +26,15 @@ import (
 // UserServer holds a JWTManager and represents a UserServiceServer.
 type UserServer struct {
 	apb.UnimplementedUserServiceServer
-	jwtManager     *rbac.JWTManager
-	serviceManager servmgmt.ServiceManager
+	jwtManager  *rbac.JWTManager
+	userService rbacInterfaces.UserService
 }
 
 // NewUserServer receives a JWTManager and a UserService and returns a new UserServer.
-func NewUserServer(jwtManager *rbac.JWTManager, serviceManager servmgmt.ServiceManager) *UserServer {
+func NewUserServer(jwtManager *rbac.JWTManager, userService rbacInterfaces.UserService) *UserServer {
 	return &UserServer{
-		jwtManager:     jwtManager,
-		serviceManager: serviceManager,
+		jwtManager:  jwtManager,
+		userService: userService,
 	}
 }
 
@@ -65,7 +65,7 @@ func (u UserServer) CreateUsers(ctx context.Context, request *apb.CreateUsersReq
 		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(user.Password), []byte(salt), 1, 64*1024, 4, 32))
 
 		user := rbac.NewUser(uuid.New(), user.Name, roles, string(hashedPassword), user.Token, salt, conflict.Metadata{ResourceVersion: 0})
-		err = u.serviceManager.UserService.Add(user)
+		err = u.userService.Add(user)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -89,7 +89,7 @@ func (u UserServer) GetUser(ctx context.Context, request *apb.GetUserRequest) (*
 		return nil, fmt.Errorf("could not parse user uuid")
 	}
 
-	userData, err := u.serviceManager.UserService.Get(store.Query{Name: request.Name, ID: userID})
+	userData, err := u.userService.Get(store.Query{Name: request.Name, ID: userID})
 	if err != nil {
 		return nil, err
 	}
@@ -116,7 +116,7 @@ func (u UserServer) GetUsers(ctx context.Context, request *apb.GetUsersRequest)
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
-	userList, err := u.serviceManager.UserService.GetAll()
+	userList, err := u.userService.GetAll()
 	if err != nil {
 		return nil, err
 	}
@@ -152,7 +152,7 @@ func (u UserServer) UpdateUsers(ctx context.Context, request *apb.UpdateUsersReq
 			return nil, handleRPCError(labels, err)
 		}
 
-		storedUser, err := u.serviceManager.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)
 		}
@@ -165,7 +165,7 @@ func (u UserServer) UpdateUsers(ctx context.Context, request *apb.UpdateUsersReq
 		usr, _ := userToUpdate.(*rbac.User)
 		usr.Metadata.ResourceVersion = int(user.Metadata.ResourceVersion)
 
-		err = u.serviceManager.UserService.Update(usr)
+		err = u.userService.Update(usr)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "could not update user %v", err)
 		}
@@ -184,12 +184,12 @@ func (u UserServer) DeleteUsers(ctx context.Context, request *apb.DeleteUsersReq
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
 	for _, user := range request.Username {
-		userToDelete, err := u.serviceManager.UserService.Get(store.Query{Name: user})
+		userToDelete, err := u.userService.Get(store.Query{Name: user})
 		if err != nil {
 			return nil, status.Errorf(codes.Canceled, "user not found %v", err)
 		}
 
-		err = u.serviceManager.UserService.Delete(userToDelete)
+		err = u.userService.Delete(userToDelete)
 		if err != nil {
 			return nil, status.Errorf(codes.Aborted, "error deleting user %v", err)
 		}
diff --git a/controller/northbound/server/user_test.go b/controller/northbound/server/user_test.go
index 594dd4cea979b89176af6326a11e91a1c2642c42..6b693a39cbdadb56390ac896716894a91f9706db 100644
--- a/controller/northbound/server/user_test.go
+++ b/controller/northbound/server/user_test.go
@@ -10,7 +10,6 @@ import (
 	apb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"github.com/google/uuid"
 )
 
@@ -24,10 +23,8 @@ func getTestUserServer(t *testing.T) *UserServer {
 	roleStore := rbac.NewMemoryRoleStore()
 	roleService := rbac.NewRoleService(roleStore, eventService)
 
-	serviceManager := servmgmt.ServiceManager{UserService: userService, RoleService: roleService}
-
-	s := NewUserServer(jwtManager, serviceManager)
-	err := clearAndCreateAuthTestSetup(serviceManager)
+	s := NewUserServer(jwtManager, userService)
+	err := clearAndCreateAuthTestSetup(userService, roleService)
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go
index 7cba403d1f452e74a39223d814c3d393c6deeed3..19d12969acdef96b620b7a7b69d6f0ddcfe76c20 100644
--- a/controller/nucleus/networkElementWatcher.go
+++ b/controller/nucleus/networkElementWatcher.go
@@ -11,7 +11,6 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
-	"code.fbi.h-da.de/danet/gosdn/controller/servmgmt"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	"github.com/google/uuid"
@@ -29,7 +28,7 @@ const (
 // NetworkElementWatcher is a component that subscribes to network elements via gNMI from within the controller and handles
 // responses by triggering the internal event process.
 type NetworkElementWatcher struct {
-	serviceManager             servmgmt.ServiceManager
+	mneService                 networkelement.Service
 	networkelementSubcriptions map[uuid.UUID]*networkelementSubscriptionHelper
 	eventService               eventInterfaces.Service
 }
@@ -41,9 +40,9 @@ type networkelementSubscriptionHelper struct {
 }
 
 // NewNetworkElementWatcher takes a pndStore to subscribe to network element paths.
-func NewNetworkElementWatcher(serviceManager servmgmt.ServiceManager, eventService eventInterfaces.Service) *NetworkElementWatcher {
+func NewNetworkElementWatcher(mneService networkelement.Service, eventService eventInterfaces.Service) *NetworkElementWatcher {
 	return &NetworkElementWatcher{
-		serviceManager:             serviceManager,
+		mneService:                 mneService,
 		networkelementSubcriptions: make(map[uuid.UUID]*networkelementSubscriptionHelper),
 		eventService:               eventService,
 	}
@@ -62,7 +61,7 @@ func (n *NetworkElementWatcher) SubToNetworkElements(paths [][]string, opts *gnm
 		}
 	}
 
-	mnes, err := n.serviceManager.MneService.GetAll()
+	mnes, err := n.mneService.GetAll()
 	if err != nil {
 		log.Error(err)
 		return
@@ -148,7 +147,7 @@ func (n *NetworkElementWatcher) handleSubscribeResponse(resp *gpb.SubscribeRespo
 }
 
 func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.SubscribeResponse_Update, subscriptionInfo *transport.SubscriptionInformation) {
-	mne, err := n.serviceManager.MneService.Get(store.Query{ID: uuid.MustParse(subscriptionInfo.NetworkElementID)})
+	mne, err := n.mneService.Get(store.Query{ID: uuid.MustParse(subscriptionInfo.NetworkElementID)})
 	if err != nil {
 		log.Error(err)
 	}
diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go
index a8a6b1098c4683cd6fa45fdec075776fcc397391..c43612a1544233d1948e269950fc3c8ab4514dca 100644
--- a/controller/nucleus/pndService.go
+++ b/controller/nucleus/pndService.go
@@ -14,7 +14,7 @@ type PndService struct {
 }
 
 // NewPndService creates a PND service.
-func NewPndService(pndStore networkdomain.PndStore) networkdomain.PndService {
+func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service {
 	pndService := &PndService{
 		pndStore: pndStore,
 	}
diff --git a/controller/servmgmt/serviceManager.go b/controller/servmgmt/serviceManager.go
deleted file mode 100644
index c114941453fa82959d068336e5d697b36f5fe4b8..0000000000000000000000000000000000000000
--- a/controller/servmgmt/serviceManager.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package servmgmt
-
-import (
-	"code.fbi.h-da.de/danet/gosdn/controller/app"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
-	"code.fbi.h-da.de/danet/gosdn/controller/store"
-	"code.fbi.h-da.de/danet/gosdn/controller/topology"
-	"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
-	"code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
-	routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables"
-	"github.com/google/uuid"
-)
-
-// NOTE: Until we've added database support for changes, we will hold
-// changeStores in memory for now.
-var changeStoreMap = make(map[uuid.UUID]*store.ChangeStore)
-
-// ServiceManager is an aggregation of all services which handle storage access.
-type ServiceManager struct {
-	//TODO(PND):change these to services!
-	PndService      networkdomain.PndService
-	PNDStore        networkdomain.PndStore
-	ChangeStore     store.ChangeStore
-	SbiService      southbound.Service
-	MneService      networkelement.Service
-	UserService     rbac.UserService
-	RoleService     rbac.RoleService
-	NodeService     nodes.Service
-	PortService     ports.Service
-	TopologyService topology.Service
-	RouteService    routingtables.Service
-	AppService      app.ManagementService
-}
-
-// NewServiceManager returns a ServiceManager.
-func NewServiceManager(pndService networkdomain.PndService, pndStore networkdomain.PndStore, changeStore store.ChangeStore, sbiServ southbound.Service,
-	mneServ networkelement.Service, userServ rbac.UserService, roleServ rbac.RoleService,
-	nodeServ nodes.Service, portServ ports.Service, topoServ topology.Service,
-	routeServ routingtables.Service, appServ app.ManagementService) *ServiceManager {
-	return &ServiceManager{
-		PndService:      pndService,
-		PNDStore:        pndStore,
-		ChangeStore:     changeStore,
-		SbiService:      sbiServ,
-		MneService:      mneServ,
-		UserService:     userServ,
-		RoleService:     roleServ,
-		NodeService:     nodeServ,
-		PortService:     portServ,
-		TopologyService: topoServ,
-		RouteService:    routeServ,
-		AppService:      appServ,
-	}
-}