diff --git a/Makefile b/Makefile
index 515245e72d7247813096e8cc9c046047361dfdf6..e3a95d3d5bf80f3a7e6857b9a77c68cac05ff17d 100644
--- a/Makefile
+++ b/Makefile
@@ -17,9 +17,9 @@ BUILD_ARTIFACTS_PATH=artifacts
 PLUGIN_NAME= bundled_plugin.zip
 
 # Tool Versions
-GOTESTSUM_VERSION=v1.8.1
-GOLANGCI_LINT_VERSION=v1.54.0
-MOCKERY_VERSION=v2.20.0
+GOTESTSUM_VERSION=v1.11.0
+GOLANGCI_LINT_VERSION=v1.54.2
+MOCKERY_VERSION=v2.34.1
 YGOT_GENERATOR_VERSION=v0.27.0
 YGOT_GENERATOR_GENERATOR_VERSION=v0.0.4
 
diff --git a/controller/app/Store.go b/controller/app/Store.go
index 0852c57fc2b72071c22b44911600ab8c489d92d1..510fe56ea7c47911632ec95bd0d16b2ea2f1c3e2 100644
--- a/controller/app/Store.go
+++ b/controller/app/Store.go
@@ -5,7 +5,7 @@ import (
 	"log"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 
 	"github.com/google/uuid"
@@ -57,7 +57,7 @@ func (s *Store) Get(query store.Query) (App, error) {
 }
 
 func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -66,7 +66,7 @@ func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: appID.String()}})
 	if result == nil {
@@ -83,7 +83,7 @@ func (s *Store) getByID(appID uuid.UUID) (loadedApp App, err error) {
 }
 
 func (s *Store) getByName(appName string) (loadedApp App, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -92,7 +92,7 @@ func (s *Store) getByName(appName string) (loadedApp App, err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: appName}})
 	if result == nil {
@@ -110,7 +110,7 @@ func (s *Store) getByName(appName string) (loadedApp App, err error) {
 
 // GetAll returns all stored apps.
 func (s *Store) GetAll() (loadedApps []App, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -119,7 +119,7 @@ func (s *Store) GetAll() (loadedApps []App, err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -139,7 +139,7 @@ func (s *Store) GetAll() (loadedApps []App, err error) {
 
 // Add adds a app to the app store.
 func (s *Store) Add(app App) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -148,7 +148,7 @@ func (s *Store) Add(app App) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, app)
 	if err != nil {
@@ -163,7 +163,7 @@ func (s *Store) Add(app App) (err error) {
 func (s *Store) Update(app App) (err error) {
 	var updatedApp App
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -181,7 +181,7 @@ func (s *Store) Update(app App) (err error) {
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": app.GetID().String()}, update, &opt).
@@ -197,7 +197,7 @@ func (s *Store) Update(app App) (err error) {
 
 // Delete deletes a app from the app store.
 func (s *Store) Delete(app App) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -206,7 +206,7 @@ func (s *Store) Delete(app App) (err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: app.GetID().String()}})
 	if err != nil {
diff --git a/controller/controller.go b/controller/controller.go
index 6f4b12ac01aa613f2bc14888a8e3205ae22f9b67..a7db812da4a085fd918902e2afdcc9882554a193 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -30,14 +30,15 @@ import (
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/app"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/application/service"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/config"
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
-	"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/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/northbound/server"
 	nbi "code.fbi.h-da.de/danet/gosdn/controller/northbound/server"
@@ -45,7 +46,7 @@ import (
 	"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"
+	topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
 	routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables"
 
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
@@ -58,22 +59,26 @@ 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
-	changeStore           store.ChangeStore
-	userService           rbac.UserService
-	roleService           rbac.RoleService
-	topologyService       topology.Service
-	nodeService           nodes.Service
-	portService           ports.Service
-	routeService          routingtables.Service
-	pluginService         plugin.Service
-	httpServer            *http.Server
-	grpcServer            *grpc.Server
-	nbi                   *nbi.NorthboundInterface
-	eventService          eventInterfaces.Service
-	appService            app.ManagementService
+	pndStore    ports.PndStore
+	changeStore store.ChangeStore
+
+	pndService      ports.PndService
+	mneService      ports.NetworkElementService
+	userService     rbac.UserService
+	roleService     rbac.RoleService
+	topologyService topology.Service
+	nodeService     nodes.Service
+	portService     topoPorts.Service
+	routeService    routingtables.Service
+	pluginService   ports.PluginService
+	eventService    eventInterfaces.Service
+	appService      app.ManagementService
+
+	httpServer *http.Server
+	grpcServer *grpc.Server
+
+	nbi *nbi.NorthboundInterface
+
 	networkElementWatcher *nucleus.NetworkElementWatcher
 	stopChan              chan os.Signal
 
@@ -99,7 +104,7 @@ func initialize() error {
 	}
 
 	nodeService := nodes.NewNodeService(nodes.NewDatabaseNodeStore(), eventService)
-	portService := ports.NewPortService(ports.NewDatabasePortStore(), eventService)
+	portService := topoPorts.NewPortService(topoPorts.NewDatabasePortStore(), eventService)
 	routeService := routingtables.NewRoutingTableService(
 		routingtables.NewDatabaseRoutingTableStore(),
 		nodeService,
@@ -108,16 +113,21 @@ func initialize() error {
 	)
 
 	pluginRegistryClient := setupPluginRegistryClient()
-	pluginService := nucleus.NewPluginService(nucleus.NewPluginStore(), eventService, model.NewPluginThroughReattachConfig, pluginRegistryClient)
+	pluginService := service.NewPluginService(
+		persistence.NewPluginStore(),
+		eventService,
+		model.NewPluginThroughReattachConfig,
+		pluginRegistryClient,
+	)
 
-	pndStore := nucleus.NewPndStore(pluginService)
+	pndStore := persistence.NewPndStore(pluginService)
 
 	changeStore := store.NewChangeStore()
 
 	c = &Core{
 		pndStore:    pndStore,
-		pndService:  nucleus.NewPndService(pndStore),
-		mneService:  nucleus.NewNetworkElementService(nucleus.NewNetworkElementStore(), pluginService, eventService),
+		pndService:  service.NewPndService(pndStore),
+		mneService:  service.NewNetworkElementService(persistence.NewNetworkElementStore(), pluginService, eventService),
 		changeStore: *changeStore,
 		userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService),
 		roleService: rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService),
@@ -197,24 +207,24 @@ func startGrpc() error {
 	jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration)
 	setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.userService, c.roleService)
 
-	c.nbi = nbi.NewNBI(
-		c.pndStore,
-		c.pndService,
-		c.mneService,
-		c.changeStore,
-		c.userService,
-		c.roleService,
-		*jwtManager,
-		c.topologyService,
-		c.nodeService,
-		c.portService,
-		c.routeService,
-		c.appService,
-		c.pluginService,
-		c.pluginRegistryClient,
-		c.csbiClient,
-		callback,
-	)
+	// c.nbi = nbi.NewNBI(
+	// 	c.pndStore,
+	// 	c.pndService,
+	// 	c.mneService,
+	// 	c.changeStore,
+	// 	c.userService,
+	// 	c.roleService,
+	// 	*jwtManager,
+	// 	c.topologyService,
+	// 	c.nodeService,
+	// 	c.portService,
+	// 	c.routeService,
+	// 	c.appService,
+	// 	c.pluginService,
+	// 	c.pluginRegistryClient,
+	// 	c.csbiClient,
+	// 	callback,
+	// )
 
 	ppb.RegisterPndServiceServer(c.grpcServer, c.nbi.Pnd)
 	cpb.RegisterCsbiServiceServer(c.grpcServer, c.nbi.Csbi)
diff --git a/controller/interfaces/networkdomain/pndStore.go b/controller/interfaces/networkdomain/pndStore.go
index c031c1fec113246f02aa613cc402cc6d31b48fbe..b88d61a213ced30e1fa55ef004408c126d089f6a 100644
--- a/controller/interfaces/networkdomain/pndStore.go
+++ b/controller/interfaces/networkdomain/pndStore.go
@@ -1,9 +1,10 @@
 package networkdomain
 
 import (
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
+
+	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
 )
 
 // PndStore describes an interface for pnd store implementations.
@@ -12,7 +13,13 @@ type PndStore interface {
 	Delete(NetworkDomain) error
 	Get(store.Query) (LoadedPnd, error)
 	GetAll() ([]LoadedPnd, error)
-	PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error)
-	AddPendingChannel(id uuid.UUID, ch chan networkelement.Details)
+	PendingChannels(id uuid.UUID, parseErrors ...error) (chan Details, error)
+	AddPendingChannel(id uuid.UUID, ch chan Details)
 	RemovePendingChannel(id uuid.UUID)
 }
+
+type Details struct {
+	ID              string
+	Address         string
+	TransportOption *tpb.TransportOption
+}
diff --git a/controller/interfaces/networkelement/networkElement.go b/controller/interfaces/networkelement/networkElement.go
index eb74ba36798bb40561805f35c14ef252503a06bc..3d32fca88fcb129cd6e23df01a5e4847d3644255 100644
--- a/controller/interfaces/networkelement/networkElement.go
+++ b/controller/interfaces/networkelement/networkElement.go
@@ -6,6 +6,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"github.com/google/uuid"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
@@ -71,7 +72,7 @@ type LoadedNetworkElement struct {
 // EnsureIntendedConfigurationIsAppliedOnNetworkElement pushes the stored
 // configuration to a network element.
 // TODO: find a better place for this function.
-func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne NetworkElement) error {
+func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne model.NetworkElement) error {
 	model, err := mne.GetModelAsFilteredCopy()
 	if err != nil {
 		return err
diff --git a/controller/interfaces/networkelement/networkElementStore.go b/controller/interfaces/networkelement/networkElementStore.go
deleted file mode 100644
index e2a136105e3d817db19ff8eb6a21ff1f462b92c9..0000000000000000000000000000000000000000
--- a/controller/interfaces/networkelement/networkElementStore.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package networkelement
-
-import (
-	"code.fbi.h-da.de/danet/gosdn/controller/store"
-)
-
-// Store describes an interface for network element store implementations.
-type Store interface {
-	Add(NetworkElement) error
-	Update(NetworkElement) error
-	Delete(NetworkElement) error
-	Get(store.Query) (LoadedNetworkElement, error)
-	GetAll() ([]LoadedNetworkElement, error)
-}
diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go
index 33b7d9d86ebd7ebd0b83a2401596e87edb2b9584..fd61f956bb6d1c2afd8d8cd160803567775201eb 100644
--- a/controller/northbound/server/auth_interceptor_test.go
+++ b/controller/northbound/server/auth_interceptor_test.go
@@ -12,7 +12,7 @@ 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/nucleus"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
 	"github.com/bufbuild/protovalidate-go"
 	"google.golang.org/grpc"
diff --git a/controller/northbound/server/configurationmanagement.go b/controller/northbound/server/configurationmanagement.go
index 40db2590ee756cecebc10e285ea30acbaaba9965..cef101a4c68b90312905251ad5de280881493a1a 100644
--- a/controller/northbound/server/configurationmanagement.go
+++ b/controller/northbound/server/configurationmanagement.go
@@ -9,15 +9,14 @@ import (
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
-	"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/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"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/links"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/nodes"
-	"code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
+	topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 
@@ -28,23 +27,23 @@ import (
 // ConfigurationManagementServer represents  ConfigurationManagementServer...
 type ConfigurationManagementServer struct {
 	cmpb.UnimplementedConfigurationManagementServiceServer
-	pndService      networkdomain.Service
-	mneService      networkelement.Service
+	pndService      ports.PndService
+	mneService      ports.NetworkElementService
 	topologyService topology.Service
 	nodeService     nodes.Service
-	portService     ports.Service
-	pluginService   plugin.Service
+	portService     topoPorts.Service
+	pluginService   ports.PluginService
 	protoValidator  *protovalidate.Validator
 }
 
 // NewConfigurationManagementServer creates the ConfigurationManagementServer..
 func NewConfigurationManagementServer(
-	pndService networkdomain.Service,
-	mneService networkelement.Service,
+	pndService ports.PndService,
+	mneService ports.NetworkElementService,
 	topologyService topology.Service,
 	nodeService nodes.Service,
-	portService ports.Service,
-	pluginService plugin.Service,
+	portService topoPorts.Service,
+	pluginService ports.PluginService,
 	protoValidator *protovalidate.Validator,
 ) *ConfigurationManagementServer {
 	return &ConfigurationManagementServer{
@@ -60,22 +59,22 @@ func NewConfigurationManagementServer(
 
 // sdnConfig is used to parse the sdnConfig into JSON.
 type sdnConfig struct {
-	PndID           string                          `json:"pndID"`
-	Nodes           []nodes.Node                    `json:"nodes"`
-	Ports           []ports.Port                    `json:"ports"`
-	Links           []links.Link                    `json:"links"`
-	Plugins         []plugin.LoadedPlugin           `json:"plugins"`
-	NetworkElements []networkelement.NetworkElement `json:"networkelements"`
+	PndID           string                 `json:"pndID"`
+	Nodes           []nodes.Node           `json:"nodes"`
+	Ports           []topoPorts.Port       `json:"ports"`
+	Links           []links.Link           `json:"links"`
+	Plugins         []plugin.LoadedPlugin  `json:"plugins"`
+	NetworkElements []model.NetworkElement `json:"networkelements"`
 }
 
 // loadedSDNConfig is used to parse the stringified JSON sdnConfig into objects.
 type loadedSDNConfig struct {
-	PndID           string                                `json:"pndID"`
-	Nodes           []nodes.Node                          `json:"nodes"`
-	Ports           []ports.Port                          `json:"ports"`
-	Links           []links.Link                          `json:"links"`
-	Plugins         []plugin.LoadedPlugin                 `json:"plugins"`
-	NetworkElements []networkelement.LoadedNetworkElement `json:"networkelements"`
+	PndID           string                       `json:"pndID"`
+	Nodes           []nodes.Node                 `json:"nodes"`
+	Ports           []topoPorts.Port             `json:"ports"`
+	Links           []links.Link                 `json:"links"`
+	Plugins         []plugin.LoadedPlugin        `json:"plugins"`
+	NetworkElements []model.LoadedNetworkElement `json:"networkelements"`
 }
 
 // ExportSDNConfig returns the SDN configuration.
@@ -257,7 +256,7 @@ func (c ConfigurationManagementServer) createTopology(sdnConfig *loadedSDNConfig
 	}
 
 	for _, inputPort := range sdnConfig.Ports {
-		port := ports.Port{
+		port := topoPorts.Port{
 			ID:            inputPort.ID,
 			Name:          inputPort.Name,
 			Configuration: inputPort.Configuration,
@@ -347,7 +346,7 @@ func (c ConfigurationManagementServer) createNetworkElements(sdnConfig *loadedSD
 			return err
 		}
 
-		if err := networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement); err != nil {
+		if err := model.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement); err != nil {
 			return err
 		}
 	}
diff --git a/controller/northbound/server/csbi.go b/controller/northbound/server/csbi.go
index 14ba9a371df51418501bcd57dbd10c98b8197127..8fe870d9519d3d44ea6b5e6c0f9c521688a5bc77 100644
--- a/controller/northbound/server/csbi.go
+++ b/controller/northbound/server/csbi.go
@@ -11,9 +11,9 @@ import (
 	log "github.com/sirupsen/logrus"
 
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
-	"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/metrics"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/peer"
@@ -23,12 +23,12 @@ import (
 // CsbiServer represents a csbi server.
 type CsbiServer struct {
 	cpb.UnimplementedCsbiServiceServer
-	pndStore       networkdomain.PndStore
+	pndStore       ports.PndStore
 	protoValidator *protovalidate.Validator
 }
 
 // NewCsbiServer receives a pndStore and returns a new csbiServer.
-func NewCsbiServer(pndStore networkdomain.PndStore, protoValidator *protovalidate.Validator) *CsbiServer {
+func NewCsbiServer(pndStore ports.PndStore, protoValidator *protovalidate.Validator) *CsbiServer {
 	return &CsbiServer{
 		pndStore:       pndStore,
 		protoValidator: protoValidator,
diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go
index 2120c9287b2d590ed3991bedb2c92ee418a31509..f0e09bd7beba7dd5d6eeb2cb899aa12dee1468d0 100644
--- a/controller/northbound/server/nbi.go
+++ b/controller/northbound/server/nbi.go
@@ -4,15 +4,14 @@ import (
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
 	rpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
 	"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/plugin"
 	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
 	"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"
+	topoPorts "code.fbi.h-da.de/danet/gosdn/controller/topology/ports"
 	routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
@@ -42,19 +41,19 @@ type NorthboundInterface struct {
 
 // NewNBI receives a PndStore and returns a new gRPC *NorthboundInterface.
 func NewNBI(
-	pnds networkdomain.PndStore,
-	pndService networkdomain.Service,
-	mneService networkelement.Service,
+	pnds ports.PndStore,
+	pndService ports.PndService,
+	mneService ports.NetworkElementService,
 	changeStore store.ChangeStore,
 	users rbacInterfaces.UserService,
 	roles rbacInterfaces.RoleService,
 	jwt rbac.JWTManager,
 	topologyService topology.Service,
 	nodeService nodes.Service,
-	portService ports.Service,
+	portService topoPorts.Service,
 	routeService routingtables.Service,
 	apps app.ManagementService,
-	pluginService plugin.Service,
+	pluginService ports.PluginService,
 	pluginRegistryClient rpb.PluginRegistryServiceClient,
 	csbiClient cpb.CsbiServiceClient,
 	pndCallbackFn func(uuid.UUID, chan networkelement.Details),
diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go
index f9263239bc64990f0dee3c49c56bf2dcb607b176..ce6b9ba38d01bf00d82731b5559b6e972914e925 100644
--- a/controller/northbound/server/networkElement.go
+++ b/controller/northbound/server/networkElement.go
@@ -12,11 +12,9 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
-	"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/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
 	util "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
@@ -36,18 +34,18 @@ import (
 // NetworkElementServer represents a NetworkElementServer.
 type NetworkElementServer struct {
 	mnepb.UnimplementedNetworkElementServiceServer
-	mneService     networkelement.Service
-	pndService     networkdomain.Service
-	pluginService  plugin.Service
+	mneService     ports.NetworkElementService
+	pndService     ports.PndService
+	pluginService  ports.PluginService
 	changeStore    store.ChangeStore
 	protoValidator *protovalidate.Validator
 }
 
 // NewNetworkElementServer returns a new NetWorkElementServer.
 func NewNetworkElementServer(
-	mneService networkelement.Service,
-	pndService networkdomain.Service,
-	pluginService plugin.Service,
+	mneService ports.NetworkElementService,
+	pndService ports.PndService,
+	pluginService ports.PluginService,
 	changeStore store.ChangeStore,
 	protoValidator *protovalidate.Validator,
 ) *NetworkElementServer {
@@ -219,7 +217,7 @@ func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.Update
 		return nil, err
 	}
 
-	err = networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement)
+	err = model.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement)
 	if err != nil {
 		return &mnepb.UpdateNetworkElementResponse{
 			Timestamp: time.Now().UnixNano(),
@@ -301,7 +299,7 @@ func (n *NetworkElementServer) GetFlattenedMne(ctx context.Context, request *mne
 	}, nil
 }
 
-func (n *NetworkElementServer) getMne(identifier string) (networkelement.NetworkElement, error) {
+func (n *NetworkElementServer) getMne(identifier string) (model.NetworkElement, error) {
 	id, err := uuid.Parse(identifier)
 	if err != nil {
 		id = uuid.Nil
@@ -320,7 +318,7 @@ func (n *NetworkElementServer) getMne(identifier string) (networkelement.Network
 	return mne, nil
 }
 
-func (n *NetworkElementServer) getPnd(identifier string) (networkdomain.NetworkDomain, error) {
+func (n *NetworkElementServer) getPnd(identifier string) (model.NetworkDomain, error) {
 	pid, err := uuid.Parse(identifier)
 	if err != nil {
 		return nil, err
@@ -420,7 +418,7 @@ func (n *NetworkElementServer) GetFlattenedMneList(ctx context.Context, request
 	}, nil
 }
 
-func fillMneBySpecificPath(nme networkelement.NetworkElement, path string, requestForIntendedState bool) (*mnepb.ManagedNetworkElement, error) {
+func fillMneBySpecificPath(nme model.NetworkElement, path string, requestForIntendedState bool) (*mnepb.ManagedNetworkElement, error) {
 	gnmiPath, err := ygot.StringToStructuredPath(path)
 	if err != nil {
 		log.Error(err)
@@ -483,7 +481,7 @@ func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPa
 	}, nil
 }
 
-func (n *NetworkElementServer) getPath(ctx context.Context, mne networkelement.NetworkElement, path string) (*gnmi.GetResponse, error) {
+func (n *NetworkElementServer) getPath(ctx context.Context, mne model.NetworkElement, path string) (*gnmi.GetResponse, error) {
 	res, err := mne.Transport().Get(ctx, path)
 	if err != nil {
 		return nil, err
@@ -707,7 +705,14 @@ func (n *NetworkElementServer) SetMneList(ctx context.Context, request *mnepb.Se
 	}, nil
 }
 
-func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb.TransportOption, requestPluginFunc func(uuid.UUID) (plugin.Plugin, error), pluginID uuid.UUID, pndID uuid.UUID, optionalNetworkElementID ...uuid.UUID) (uuid.UUID, error) {
+func (n *NetworkElementServer) addMne(
+	ctx context.Context,
+	name string,
+	opt *tpb.TransportOption,
+	requestPluginFunc func(uuid.UUID) (*model.Plugin, error),
+	pluginID uuid.UUID, pndID uuid.UUID,
+	optionalNetworkElementID ...uuid.UUID,
+) (uuid.UUID, error) {
 	var err error
 
 	// Note: cSBI not supported currently, so this is commented fow now.
@@ -1014,7 +1019,7 @@ func (n *NetworkElementServer) SubscribePath(request *mnepb.SubscribePathRequest
 	return nil
 }
 
-func (n *NetworkElementServer) subscribePath(networkElement networkelement.NetworkElement, subList *mnepb.SubscriptionList) error {
+func (n *NetworkElementServer) subscribePath(networkElement model.NetworkElement, subList *mnepb.SubscriptionList) error {
 	mode, err := n.mapModeToAristaFork(subList.GetMode())
 	if err != nil {
 		return err
diff --git a/controller/northbound/server/plugin.go b/controller/northbound/server/plugin.go
index 3338520da281bf8817f39f7134ac4c6c141b6368..0a77cdfa038237516118a097ee9b6b93c4d09693 100644
--- a/controller/northbound/server/plugin.go
+++ b/controller/northbound/server/plugin.go
@@ -9,8 +9,8 @@ import (
 
 	pipb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-internal"
 	rpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/plugin/shared"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/bufbuild/protovalidate-go"
@@ -24,13 +24,13 @@ import (
 type PluginInternalServer struct {
 	pipb.UnimplementedPluginInternalServiceServer
 	pluginRegistryClient rpb.PluginRegistryServiceClient
-	pluginService        plugin.Service
+	pluginService        ports.PluginService
 	protoValidator       *protovalidate.Validator
 }
 
 func NewPluginInternalServer(
 	pluginRegistryClient rpb.PluginRegistryServiceClient,
-	pluginService plugin.Service,
+	pluginService ports.PluginService,
 	protoValidator *protovalidate.Validator,
 ) *PluginInternalServer {
 	return &PluginInternalServer{
diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go
index 239c7335554175f65225a4223f928e9fbbc1b8f6..c6a9744b20d8cb15888b09b4af8b1c5a10a4f478 100644
--- a/controller/northbound/server/pnd.go
+++ b/controller/northbound/server/pnd.go
@@ -6,11 +6,10 @@ import (
 
 	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
 	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/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/bufbuild/protovalidate-go"
 	"github.com/google/uuid"
@@ -22,8 +21,8 @@ import (
 // PndServer represents a core server.
 type PndServer struct {
 	ppb.UnimplementedPndServiceServer
-	pndService     networkdomain.Service
-	pluginService  plugin.Service
+	pndService     ports.PndService
+	pluginService  ports.PluginService
 	csbiClient     cpb.CsbiServiceClient
 	pndCallbackFn  func(uuid.UUID, chan networkelement.Details)
 	protoValidator *protovalidate.Validator
@@ -31,8 +30,8 @@ type PndServer struct {
 
 // NewPndServer receives a pndStore and returns a new PndServer.
 func NewPndServer(
-	pndService networkdomain.Service,
-	pluginService plugin.Service,
+	pndService ports.PndService,
+	pluginService ports.PluginService,
 	pndCallbackFn func(uuid.UUID,
 		chan networkelement.Details),
 	csbiClient cpb.CsbiServiceClient,
diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go
index cc97284f059f08bf1b34969e4c136045a0490e33..dda4256fff3fa68806605957245c7f07f80070b6 100644
--- a/controller/northbound/server/pnd_test.go
+++ b/controller/northbound/server/pnd_test.go
@@ -17,7 +17,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"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/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"github.com/bufbuild/protovalidate-go"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
diff --git a/controller/nucleus/genericService.go b/controller/nucleus/domain/application/service/genericService.go
similarity index 99%
rename from controller/nucleus/genericService.go
rename to controller/nucleus/domain/application/service/genericService.go
index af0193d532fc826f2258c09ccacfa4c73b342c75..47d5fcad329427de37541c55e1e77749d444b89d 100644
--- a/controller/nucleus/genericService.go
+++ b/controller/nucleus/domain/application/service/genericService.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
diff --git a/controller/nucleus/networkElementService.go b/controller/nucleus/domain/application/service/networkElementService.go
similarity index 84%
rename from controller/nucleus/networkElementService.go
rename to controller/nucleus/domain/application/service/networkElementService.go
index 6974d70b466d62a89b8a0547431b0eafadf59efe..c4796771fec3d6deaaa732ce6bd1fef974af5476 100644
--- a/controller/nucleus/networkElementService.go
+++ b/controller/nucleus/domain/application/service/networkElementService.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"fmt"
@@ -6,9 +6,8 @@ import (
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/event"
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/openconfig/gnmi/proto/gnmi"
@@ -26,17 +25,17 @@ const (
 // NetworkElementService provides a network element service implementation.
 // This services provides abstraction between the user (e.g a PND) and the matching store (e.g. networkElementStore).
 type NetworkElementService struct {
-	networkElementStore networkelement.Store
-	pluginService       plugin.Service
+	networkElementStore ports.NetworkElementStore
+	pluginService       ports.PluginService
 	eventService        eventInterfaces.Service
 }
 
 // NewNetworkElementService creates a network element service.
 func NewNetworkElementService(
-	networkElementStore networkelement.Store,
-	pluginService plugin.Service,
+	networkElementStore ports.NetworkElementStore,
+	pluginService ports.PluginService,
 	eventService eventInterfaces.Service,
-) networkelement.Service {
+) ports.NetworkElementService {
 	return &NetworkElementService{
 		networkElementStore: networkElementStore,
 		pluginService:       pluginService,
@@ -45,7 +44,7 @@ func NewNetworkElementService(
 }
 
 // Get takes a network element's UUID or name and returns the network element.
-func (s *NetworkElementService) Get(query store.Query) (networkelement.NetworkElement, error) {
+func (s *NetworkElementService) Get(query store.Query) (model.NetworkElement, error) {
 	loadedNetworkElement, err := s.networkElementStore.Get(query)
 	if err != nil {
 		return nil, err
@@ -60,8 +59,8 @@ func (s *NetworkElementService) Get(query store.Query) (networkelement.NetworkEl
 }
 
 // GetAll returns all stored network elements.
-func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error) {
-	var mnes []networkelement.NetworkElement
+func (s *NetworkElementService) GetAll() ([]model.NetworkElement, error) {
+	var mnes []model.NetworkElement
 
 	loadedNetworkElements, err := s.networkElementStore.GetAll()
 	if err != nil {
@@ -81,10 +80,10 @@ func (s *NetworkElementService) GetAll() ([]networkelement.NetworkElement, error
 }
 
 // GetAllAsLoaded returns all stored network elements as LoadedNetworkElement.
-// This method should be used if there is no need for a networkelement.NetworkElement, since
+// This method should be used if there is no need for a model.NetworkElement, since
 // requesting network element information through this method is a lot faster than the
 // usual `GetAll` method.
-func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetworkElement, error) {
+func (s *NetworkElementService) GetAllAsLoaded() ([]model.LoadedNetworkElement, error) {
 	loadedNetworkElements, err := s.networkElementStore.GetAll()
 	if err != nil {
 		return nil, err
@@ -94,7 +93,7 @@ func (s *NetworkElementService) GetAllAsLoaded() ([]networkelement.LoadedNetwork
 }
 
 // Add adds a network element to the network element store.
-func (s *NetworkElementService) Add(networkElementToAdd networkelement.NetworkElement) error {
+func (s *NetworkElementService) Add(networkElementToAdd model.NetworkElement) error {
 	err := s.networkElementStore.Add(networkElementToAdd)
 	if err != nil {
 		return err
@@ -163,7 +162,7 @@ func (s *NetworkElementService) UpdateModel(networkElementID uuid.UUID, modelAsS
 }
 
 // Update updates a existing network element.
-func (s *NetworkElementService) Update(networkElementToUpdate networkelement.NetworkElement) error {
+func (s *NetworkElementService) Update(networkElementToUpdate model.NetworkElement) error {
 	err := s.networkElementStore.Update(networkElementToUpdate)
 	if err != nil {
 		return err
@@ -186,7 +185,7 @@ func (s *NetworkElementService) Update(networkElementToUpdate networkelement.Net
 }
 
 // Delete deletes a network element from the network element store.
-func (s *NetworkElementService) Delete(networkElementToDelete networkelement.NetworkElement) error {
+func (s *NetworkElementService) Delete(networkElementToDelete model.NetworkElement) error {
 	err := s.networkElementStore.Delete(networkElementToDelete)
 	if err != nil {
 		return err
@@ -207,7 +206,7 @@ func (s *NetworkElementService) Delete(networkElementToDelete networkelement.Net
 	return nil
 }
 
-func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkElement networkelement.LoadedNetworkElement) (networkelement.NetworkElement, error) {
+func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkElement model.LoadedNetworkElement) (model.NetworkElement, error) {
 	if loadedNetworkElement.Plugin == "" {
 		return nil, fmt.Errorf("can not get device, no running plugin found for network element")
 	}
@@ -240,7 +239,7 @@ func (s *NetworkElementService) createNetworkElementFromStore(loadedNetworkEleme
 
 	// if the plugin is not initialized, we need to initialize it with the
 	// model data from the associated network element.
-	if mne.GetPlugin().State() != plugin.INITIALIZED {
+	if mne.GetPlugin().State() != model.INITIALIZED {
 		// Create 'root' path to be able to load the whole model from the store.
 		path, err := ygot.StringToPath("/", ygot.StructuredPath)
 		if err != nil {
diff --git a/controller/nucleus/networkElementServiceMock.go b/controller/nucleus/domain/application/service/networkElementServiceMock.go
similarity index 99%
rename from controller/nucleus/networkElementServiceMock.go
rename to controller/nucleus/domain/application/service/networkElementServiceMock.go
index 4735109b86c53ab5e841aa4478af9d3042b5cffc..aec91d05237d279484ca957442edefbdde0c5a78 100644
--- a/controller/nucleus/networkElementServiceMock.go
+++ b/controller/nucleus/domain/application/service/networkElementServiceMock.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
diff --git a/controller/nucleus/networkElementService_test.go b/controller/nucleus/domain/application/service/networkElementService_test.go
similarity index 97%
rename from controller/nucleus/networkElementService_test.go
rename to controller/nucleus/domain/application/service/networkElementService_test.go
index 0b084969364635f16f2044fbb819a44b145dbab1..0306b6a6e4285bcce26d0be00bfa41e8cc4571d8 100644
--- a/controller/nucleus/networkElementService_test.go
+++ b/controller/nucleus/domain/application/service/networkElementService_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"testing"
@@ -8,7 +8,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
diff --git a/controller/nucleus/pluginService.go b/controller/nucleus/domain/application/service/pluginService.go
similarity index 82%
rename from controller/nucleus/pluginService.go
rename to controller/nucleus/domain/application/service/pluginService.go
index 565d32a6acd0624ac635ac0d6236ce127dcdcb02..d1e2f082c7e154612115ad900e4648bbdbfe1d65 100644
--- a/controller/nucleus/pluginService.go
+++ b/controller/nucleus/domain/application/service/pluginService.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"context"
@@ -15,8 +15,8 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/event"
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
@@ -33,14 +33,19 @@ const (
 
 // PluginService provides a plugin service implementation.
 type PluginService struct {
-	pluginStore             plugin.Store
+	pluginStore             ports.PluginStore
 	eventService            eventInterfaces.Service
-	createPluginFromStoreFn func(plugin.LoadedPlugin) (plugin.Plugin, error)
+	createPluginFromStoreFn func(model.LoadedPlugin) (*model.Plugin, error)
 	pluginRegistryClient    rpb.PluginRegistryServiceClient
 }
 
 // NewPluginService creates a plugin service.
-func NewPluginService(pluginStore plugin.Store, eventService eventInterfaces.Service, createPluginFromStoreFn func(plugin.LoadedPlugin) (plugin.Plugin, error), pluginRegistryClient rpb.PluginRegistryServiceClient) plugin.Service {
+func NewPluginService(
+	pluginStore ports.PluginStore,
+	eventService eventInterfaces.Service,
+	createPluginFromStoreFn func(model.LoadedPlugin) (*model.Plugin, error),
+	pluginRegistryClient rpb.PluginRegistryServiceClient,
+) ports.PluginService {
 	return &PluginService{
 		pluginStore:             pluginStore,
 		eventService:            eventService,
@@ -50,7 +55,7 @@ func NewPluginService(pluginStore plugin.Store, eventService eventInterfaces.Ser
 }
 
 // Get takes a Plugin's UUID or name and returns the Plugin.
-func (s *PluginService) Get(query store.Query) (plugin.Plugin, error) {
+func (s *PluginService) Get(query store.Query) (*model.Plugin, error) {
 	loadedPlugin, err := s.pluginStore.Get(query)
 	if err != nil {
 		return nil, err
@@ -58,15 +63,15 @@ func (s *PluginService) Get(query store.Query) (plugin.Plugin, error) {
 
 	plugin, err := s.createPluginFromStore(loadedPlugin)
 	if err != nil {
-		return nil, err
+		return plugin, err
 	}
 
 	return plugin, nil
 }
 
 // GetAll returns all stored plugins.
-func (s *PluginService) GetAll() ([]plugin.Plugin, error) {
-	var plugins []plugin.Plugin
+func (s *PluginService) GetAll() ([]*model.Plugin, error) {
+	var plugins []*model.Plugin
 
 	loadedPlugins, err := s.pluginStore.GetAll()
 	if err != nil {
@@ -86,7 +91,7 @@ func (s *PluginService) GetAll() ([]plugin.Plugin, error) {
 }
 
 // Add adds a plugin to the plugin store.
-func (s *PluginService) Add(pluginToAdd plugin.Plugin) error {
+func (s *PluginService) Add(pluginToAdd *model.Plugin) error {
 	err := s.pluginStore.Add(pluginToAdd)
 	if err != nil {
 		return err
@@ -100,7 +105,7 @@ func (s *PluginService) Add(pluginToAdd plugin.Plugin) error {
 }
 
 // Delete deletes a plugin from the plugin store.
-func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error {
+func (s *PluginService) Delete(pluginToDelete *model.Plugin) error {
 	err := s.pluginStore.Delete(pluginToDelete)
 	if err != nil {
 		return err
@@ -116,15 +121,15 @@ func (s *PluginService) Delete(pluginToDelete plugin.Plugin) error {
 	return nil
 }
 
-func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin) (plugin.Plugin, error) {
+func (s *PluginService) createPluginFromStore(loadedPlugin model.LoadedPlugin) (*model.Plugin, error) {
 	plugin, err := s.createPluginFromStoreFn(loadedPlugin)
 	if err != nil {
 		if errors.Is(err, hcplugin.ErrProcessNotFound) {
-			plugin, err = model.NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath)
+			plugin, err := model.NewPlugin(uuid.MustParse(loadedPlugin.ID), loadedPlugin.ExecPath)
 			if err != nil {
 				return nil, err
 			}
-			err := s.pluginStore.Update(plugin)
+			err = s.pluginStore.Update(plugin)
 			if err != nil {
 				return nil, err
 			}
@@ -137,7 +142,7 @@ func (s *PluginService) createPluginFromStore(loadedPlugin plugin.LoadedPlugin)
 }
 
 // RequestPlugin request a plugin from the plugin-registry.
-func (s *PluginService) RequestPlugin(requestID uuid.UUID) (plugin.Plugin, error) {
+func (s *PluginService) RequestPlugin(requestID uuid.UUID) (*model.Plugin, error) {
 	ctx, cancel := context.WithTimeout(context.Background(), time.Minute*1)
 	defer cancel()
 
diff --git a/controller/nucleus/pluginServiceMock.go b/controller/nucleus/domain/application/service/pluginServiceMock.go
similarity index 98%
rename from controller/nucleus/pluginServiceMock.go
rename to controller/nucleus/domain/application/service/pluginServiceMock.go
index a580657fcd7c203ea0bcbb51260c021f3f71d124..6873e65075aa1bd7a11e3b759a71d786af185c51 100644
--- a/controller/nucleus/pluginServiceMock.go
+++ b/controller/nucleus/domain/application/service/pluginServiceMock.go
@@ -1,4 +1,4 @@
-package nucleus
+package service
 
 import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
diff --git a/controller/nucleus/pndService.go b/controller/nucleus/domain/application/service/pndService.go
similarity index 59%
rename from controller/nucleus/pndService.go
rename to controller/nucleus/domain/application/service/pndService.go
index a35a6eff4f64d5fce46ce84617537f3cca58056b..da3251f299a51b488760caa340d1957f39c9bdcb 100644
--- a/controller/nucleus/pndService.go
+++ b/controller/nucleus/domain/application/service/pndService.go
@@ -1,19 +1,19 @@
-package nucleus
+package service
 
 import (
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 )
 
 // PndService provides a PND service implementation.
 type PndService struct {
-	pndStore networkdomain.PndStore
+	pndStore ports.PndStore
 }
 
 // NewPndService creates a PND service.
-func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service {
+func NewPndService(pndStore ports.PndStore) ports.PndService {
 	pndService := &PndService{
 		pndStore: pndStore,
 	}
@@ -22,7 +22,7 @@ func NewPndService(pndStore networkdomain.PndStore) networkdomain.Service {
 }
 
 // Add adds a PND to the PND store.
-func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error {
+func (p *PndService) Add(pndToAdd model.NetworkDomain) error {
 	err := p.pndStore.Add(pndToAdd)
 	if err != nil {
 		return err
@@ -32,7 +32,7 @@ func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error {
 }
 
 // Delete deletes a PND from the PND store.
-func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error {
+func (p *PndService) Delete(pndToDelete model.NetworkDomain) error {
 	err := p.pndStore.Delete(pndToDelete)
 	if err != nil {
 		return err
@@ -42,7 +42,7 @@ func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error {
 }
 
 // Get takes a PND's UUID or name and returns the PND.
-func (p *PndService) Get(query store.Query) (networkdomain.NetworkDomain, error) {
+func (p *PndService) Get(query store.Query) (model.NetworkDomain, error) {
 	loadedPnd, err := p.pndStore.Get(query)
 	if err != nil {
 		return nil, err
@@ -52,8 +52,8 @@ func (p *PndService) Get(query store.Query) (networkdomain.NetworkDomain, error)
 }
 
 // GetAll returns all stores PNDs.
-func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) {
-	var pnds []networkdomain.NetworkDomain
+func (p *PndService) GetAll() ([]model.NetworkDomain, error) {
+	var pnds []model.NetworkDomain
 
 	loadedPnds, err := p.pndStore.GetAll()
 	if err != nil {
@@ -67,6 +67,6 @@ func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) {
 	return pnds, nil
 }
 
-func (p *PndService) createPndFromStore(loadedPnd networkdomain.LoadedPnd) networkdomain.NetworkDomain {
+func (p *PndService) createPndFromStore(loadedPnd model.LoadedPnd) model.NetworkDomain {
 	return model.NewPND(uuid.MustParse(loadedPnd.ID), loadedPnd.Name, loadedPnd.Description)
 }
diff --git a/controller/nucleus/model/change.go b/controller/nucleus/domain/model/change.go
similarity index 100%
rename from controller/nucleus/model/change.go
rename to controller/nucleus/domain/model/change.go
diff --git a/controller/nucleus/model/change_test.go b/controller/nucleus/domain/model/change_test.go
similarity index 100%
rename from controller/nucleus/model/change_test.go
rename to controller/nucleus/domain/model/change_test.go
diff --git a/controller/nucleus/domain/model/events.go b/controller/nucleus/domain/model/events.go
new file mode 100644
index 0000000000000000000000000000000000000000..e3f10f15777132a2475a459a4d911c75c6fae942
--- /dev/null
+++ b/controller/nucleus/domain/model/events.go
@@ -0,0 +1,6 @@
+package model
+
+const (
+	// NetworkElementEventTopic is the used topic for network element related entity changes.
+	NetworkElementEventTopic = "managedNetworkElement"
+)
diff --git a/controller/nucleus/model/gnmi_transport.go b/controller/nucleus/domain/model/gnmi_transport.go
similarity index 100%
rename from controller/nucleus/model/gnmi_transport.go
rename to controller/nucleus/domain/model/gnmi_transport.go
diff --git a/controller/nucleus/model/gnmi_transport_test.go b/controller/nucleus/domain/model/gnmi_transport_test.go
similarity index 100%
rename from controller/nucleus/model/gnmi_transport_test.go
rename to controller/nucleus/domain/model/gnmi_transport_test.go
diff --git a/controller/nucleus/model/networkElement.go b/controller/nucleus/domain/model/networkElement.go
similarity index 73%
rename from controller/nucleus/model/networkElement.go
rename to controller/nucleus/domain/model/networkElement.go
index 5ad9b6054c85b0d7451c2575a487eb02591a858c..40552cc46f5656420ac8b99e64aa46adc0bbe934 100644
--- a/controller/nucleus/model/networkElement.go
+++ b/controller/nucleus/domain/model/networkElement.go
@@ -1,28 +1,74 @@
 package model
 
 import (
+	"context"
 	"encoding/json"
 
-	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
 	"github.com/docker/docker/pkg/namesgenerator"
 	"github.com/google/uuid"
+	"github.com/openconfig/ygot/ygot"
+	log "github.com/sirupsen/logrus"
 	"go.mongodb.org/mongo-driver/bson"
 	"google.golang.org/protobuf/proto"
+
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
 )
 
+// NetworkElement represents an Managed Network Element (MNE) which is managed by
+// nucleus.
+type NetworkElement interface {
+	ID() uuid.UUID
+	GetModel() ([]byte, error)
+	GetPlugin() PluginIface
+	GetModelAsFilteredCopy() ([]byte, error)
+	Transport() transport.Transport
+	Name() string
+	ProcessResponse(proto.Message) error
+	IsTransportValid() bool
+	GetModelAsString() (string, error)
+	TransportAddress() string
+	GetMetadata() conflict.Metadata
+	PndID() uuid.UUID
+}
+
+type LoadedNetworkElement struct {
+	// ID represents the UUID of the LoadedNetworkElement.
+	ID string `json:"id" bson:"_id"`
+	// Name represents the name of the LoadedNetworkElement.
+	Name string `json:"name,omitempty"`
+	// TransportType represent the type of the transport in use of the LoadedNetworkElement.
+	TransportType string `json:"transport_type,omitempty" bson:"transport_type,omitempty"`
+	// TransportAddress represents the address from which the network element can be reached via the transport method.
+	TransportAddress string `json:"transport_address,omitempty" bson:"transport_address,omitempty"`
+	// TransportUsername is used for authentication via the transport method in use.
+	TransportUsername string `json:"transport_username,omitempty" bson:"transport_username,omitempty"`
+	// TransportPassword is used for authentication via the transport method in use.
+	TransportPassword string `json:"transport_password,omitempty" bson:"transport_password,omitempty"`
+	// Note: deprecated, should be removed.
+	TransportOptionCsbi bool `json:"transport_option_csbi,omitempty" bson:"transport_option_csbi,omitempty"`
+	// TransportTLS uses TLS from the client side when if true.
+	TransportTLS bool `json:"transport_tls,omitempty" bson:"transport_tls,omitempty"`
+
+	// SBI indicates the southbound interface, which is used by this network element as UUID.
+	Plugin string `json:"plugin"`
+	Model  string `json:"model,omitempty" bson:"model,omitempty"`
+
+	Metadata conflict.Metadata `json:"metadata" bson:"metadata"`
+
+	PndID string `json:"pnd_id" bson:"pnd_id"`
+}
+
 // NewNetworkElement creates a network element.
 func NewNetworkElement(
 	name string,
 	uuidInput uuid.UUID,
 	opt *tpb.TransportOption,
 	pndID uuid.UUID,
-	plugin plugin.Plugin,
-	metadata conflict.Metadata) (networkelement.NetworkElement, error) {
+	plugin PluginIface,
+	metadata conflict.Metadata) (NetworkElement, error) {
 	t, err := NewTransport(opt, plugin)
 	if err != nil {
 		return nil, err
@@ -38,19 +84,19 @@ func NewNetworkElement(
 		name = namesgenerator.GetRandomName(0)
 	}
 
-	if opt.Type == spb.Type_TYPE_CONTAINERISED {
-		return &CsbiNetworkElement{
-			CommonNetworkElement: CommonNetworkElement{
-				UUID:             uuidInput,
-				Plugin:           plugin,
-				transport:        t,
-				name:             name,
-				transportOptions: opt,
-				Metadata:         metadata,
-				pndID:            pndID,
-			},
-		}, nil
-	}
+	// if opt.Type == spb.Type_TYPE_CONTAINERISED {
+	// 	return &CsbiNetworkElement{
+	// 		CommonNetworkElement: CommonNetworkElement{
+	// 			UUID:             uuidInput,
+	// 			Plugin:           plugin,
+	// 			transport:        t,
+	// 			name:             name,
+	// 			transportOptions: opt,
+	// 			Metadata:         metadata,
+	// 			pndID:            pndID,
+	// 		},
+	// 	}, nil
+	// }
 
 	return &CommonNetworkElement{
 		UUID:             uuidInput,
@@ -71,7 +117,7 @@ type CommonNetworkElement struct {
 	// Plugin embeds a gosdn ygot plugin. Allows to work on a devices config
 	// based its supported YANG models. The code for this is generated through
 	// ygot.
-	Plugin plugin.Plugin
+	Plugin PluginIface
 
 	// Transport is the network element's Transport implementation
 	transport transport.Transport
@@ -109,7 +155,7 @@ func (n *CommonNetworkElement) Transport() transport.Transport {
 }
 
 // Transport returns the Transport of the network element.
-func (d *CommonNetworkElement) GetPlugin() plugin.Plugin {
+func (d *CommonNetworkElement) GetPlugin() PluginIface {
 	return d.Plugin
 }
 
@@ -189,7 +235,7 @@ func (n *CsbiNetworkElement) Transport() transport.Transport {
 }
 
 // Transport returns the Transport of the device.
-func (d *CsbiNetworkElement) GetPlugin() plugin.Plugin {
+func (d *CsbiNetworkElement) GetPlugin() PluginIface {
 	return d.Plugin
 }
 
@@ -350,3 +396,34 @@ func (d *CommonNetworkElement) GetModelAsString() (string, error) {
 	byteModel, err := d.Plugin.Model(false)
 	return string(byteModel), err
 }
+
+// EnsureIntendedConfigurationIsAppliedOnNetworkElement pushes the stored
+// configuration to a network element.
+// TODO: find a better place for this function.
+func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne NetworkElement) error {
+	model, err := mne.GetModelAsFilteredCopy()
+	if err != nil {
+		return err
+	}
+
+	req := &gpb.SetRequest{}
+	path, err := ygot.StringToStructuredPath("/")
+	if err != nil {
+		return err
+	}
+
+	req.Update = []*gpb.Update{{
+		Path: path,
+		Val: &gpb.TypedValue{
+			Value: &gpb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(model)},
+		},
+	}}
+
+	response, err := mne.Transport().CustomSet(context.Background(), req)
+	if err != nil {
+		log.Errorf("Failed to apply model of network element err=%+v, response=%+v", err, response)
+		return err
+	}
+
+	return nil
+}
diff --git a/controller/nucleus/model/networkElement_test.go b/controller/nucleus/domain/model/networkElement_test.go
similarity index 100%
rename from controller/nucleus/model/networkElement_test.go
rename to controller/nucleus/domain/model/networkElement_test.go
diff --git a/controller/nucleus/domain/model/plugin.go b/controller/nucleus/domain/model/plugin.go
new file mode 100644
index 0000000000000000000000000000000000000000..f2a2c72fba4fbc68296eab3e8a77e8cf7384860f
--- /dev/null
+++ b/controller/nucleus/domain/model/plugin.go
@@ -0,0 +1,403 @@
+package model
+
+import (
+	"encoding/json"
+	"fmt"
+	"net"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"regexp"
+
+	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util"
+	"code.fbi.h-da.de/danet/gosdn/controller/plugin/shared"
+	"github.com/google/uuid"
+	hcplugin "github.com/hashicorp/go-plugin"
+	"go.mongodb.org/mongo-driver/bson"
+	"gopkg.in/yaml.v3"
+)
+
+// State represents the current state of a plugin within the controller. Since
+// the plugins used within the controller are basic go plugins, they can be
+// CREATED, BUILT, LOADED or FAULTY. A plugin can not be unloaded (this is a
+// limitation of go plugins in general).
+type State int64
+
+const (
+	//CREATED state describes a plugin which has been created but is not yet
+	//built.
+	CREATED State = iota
+	// INITIALIZED state describes a plugin which is running and has been
+	// initialized with the model data of the associated network element.
+	INITIALIZED
+	// FAULTY state describes a plugin which couldn't be built or loaded.
+	FAULTY
+)
+
+// Plugin describes an interface for a plugin within the controller. A plugin
+// is based on hashicorp's `go plugin`.
+type PluginIface interface {
+	ID() uuid.UUID
+	GetClient() *hcplugin.Client
+	State() State
+	Manifest() *Manifest
+	ExecPath() string
+	Update() error
+	Ping() error
+	Restart() error
+	Close()
+	shared.DeviceModel
+}
+
+// Manifest represents the manifest of a plugin.
+type Manifest struct {
+	// Name of the plugin
+	Name string `yaml:"name" json:"name" bson:"name"`
+	// Name of the plugin
+	Firmware string `yaml:"firmware" json:"firmware" bson:"firmware"`
+	// Author of the plugin
+	Author string `yaml:"author" json:"author" bson:"author"`
+	// Version of the plugin
+	Version string `yaml:"version" json:"version" bson:"version"`
+}
+
+// Validate is a method to check if the manifest is valid and is compliant with
+// the requirements.
+func (m *Manifest) Validate() error {
+	errs := []error{}
+	if m.Name == "" {
+		errs = append(errs, fmt.Errorf("Name is required"))
+	}
+	if m.Firmware == "" {
+		errs = append(errs, fmt.Errorf("Firmware is required"))
+	}
+	if m.Author == "" {
+		errs = append(errs, fmt.Errorf("Author is required"))
+	}
+	if m.Version == "" {
+		errs = append(errs, fmt.Errorf("Version is required"))
+	}
+	// regex from: https://stackoverflow.com/a/68921827
+	validVersion, err := regexp.MatchString(`^([1-9]\d*|0)(\.(([1-9]\d*)|0)){2}$`,
+		m.Version)
+	if err != nil {
+		errs = append(errs, err)
+	}
+	if !validVersion {
+		errs = append(errs, fmt.Errorf("Version has to be of form: X.X.X"))
+	}
+	if len(errs) != 0 {
+		return customerrs.CombinedErrListError{Errors: errs}
+	}
+	return nil
+}
+
+// ReadManifestFromFile reads a manifest file and returns a pointer to a newly
+// created Manifest.
+func ReadManifestFromFile(path string) (*Manifest, error) {
+	manifest := &Manifest{}
+
+	manifestFile, err := os.ReadFile(filepath.Join(path, util.ManifestFileName))
+	if err != nil {
+		return nil, err
+	}
+
+	err = yaml.Unmarshal(manifestFile, manifest)
+	if err != nil {
+		return nil, err
+	}
+
+	// validate the loaded manifest
+	if err := manifest.Validate(); err != nil {
+		return nil, err
+	}
+
+	return manifest, nil
+}
+
+type LoadedPlugin struct {
+	// ID represents the UUID of the LoadedPlugin.
+	ID string `json:"id" bson:"_id"`
+	// Manifest represents the manifest of the LoadedPlugin.
+	Manifest Manifest `json:"manifest" bson:"manifest"`
+	// State represents the state of the LoadedPlugin.
+	State State `json:"state,omitempty" bson:"state"`
+	// ExecPath represents the path to the executable of the plugin.
+	ExecPath string `json:"exec_path,omitempty" bson:"exec_path"`
+	// ReattachConfig represents the configuration to reattach to a already
+	// running plugin.
+	ReattachConfig hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
+}
+
+func (lp *LoadedPlugin) UnmarshalBSON(data []byte) error {
+	loadedPluginHelper := new(LoadedPluginHelper)
+	if err := bson.Unmarshal(data, loadedPluginHelper); err != nil {
+		return err
+	}
+
+	lp.ID = loadedPluginHelper.ID
+	lp.Manifest = loadedPluginHelper.Manifest
+	lp.State = loadedPluginHelper.State
+	lp.ExecPath = loadedPluginHelper.ExecPath
+	lp.ReattachConfig = hcplugin.ReattachConfig{
+		Protocol:        hcplugin.Protocol(loadedPluginHelper.ReattachConfig.Protocol),
+		ProtocolVersion: loadedPluginHelper.ReattachConfig.ProtocolVersion,
+		Addr: &net.UnixAddr{
+			Name: loadedPluginHelper.ReattachConfig.Addr.Name,
+			Net:  loadedPluginHelper.ReattachConfig.Addr.Net,
+		},
+		Pid:  loadedPluginHelper.ReattachConfig.Pid,
+		Test: loadedPluginHelper.ReattachConfig.Test,
+	}
+
+	return nil
+}
+
+func (lp *LoadedPlugin) UnmarshalJSON(data []byte) error {
+	loadedPluginHelper := new(LoadedPluginHelper)
+	if err := json.Unmarshal(data, loadedPluginHelper); err != nil {
+		return err
+	}
+
+	lp.ID = loadedPluginHelper.ID
+	lp.Manifest = loadedPluginHelper.Manifest
+	lp.State = loadedPluginHelper.State
+	lp.ExecPath = loadedPluginHelper.ExecPath
+	lp.ReattachConfig = hcplugin.ReattachConfig{
+		Protocol:        hcplugin.Protocol(loadedPluginHelper.ReattachConfig.Protocol),
+		ProtocolVersion: loadedPluginHelper.ReattachConfig.ProtocolVersion,
+		Addr: &net.UnixAddr{
+			Name: loadedPluginHelper.ReattachConfig.Addr.Name,
+			Net:  loadedPluginHelper.ReattachConfig.Addr.Net,
+		},
+		Pid:  loadedPluginHelper.ReattachConfig.Pid,
+		Test: loadedPluginHelper.ReattachConfig.Test,
+	}
+
+	return nil
+}
+
+type LoadedPluginHelper struct {
+	ID             string               `json:"id" bson:"_id"`
+	Manifest       Manifest             `json:"manifest" bson:"manifest"`
+	State          State                `json:"state,omitempty" bson:"state"`
+	ExecPath       string               `json:"exec_path,omitempty" bson:"exec_path"`
+	ReattachConfig LoadedReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
+}
+
+type LoadedReattachConfig struct {
+	Protocol        string
+	ProtocolVersion int
+	Addr            LoadedAddress
+	Pid             int
+	Test            bool
+}
+
+type LoadedAddress struct {
+	Name string
+	Net  string
+}
+
+// Plugin is the controllers internal representation of a plugin.
+type Plugin struct {
+	UUID     uuid.UUID
+	state    State
+	execPath string
+	manifest *Manifest
+	client   *hcplugin.Client
+	shared.DeviceModel
+}
+
+// NewPlugin creates a new Plugin.
+func NewPlugin(id uuid.UUID, execPath string) (*Plugin, error) {
+	client := hcplugin.NewClient(&hcplugin.ClientConfig{
+		HandshakeConfig:  shared.Handshake,
+		Plugins:          shared.PluginMap,
+		Cmd:              exec.Command("sh", "-c", filepath.Join(execPath, util.PluginExecutableName)),
+		AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC},
+	})
+
+	manifest, err := ReadManifestFromFile(execPath)
+	if err != nil {
+		return nil, err
+	}
+
+	// create a client that is within the AllowedProtocols. In this case this
+	// returns a gRPCClient. Allows to connect through gRPC.
+	gRPCClient, err := client.Client()
+	if err != nil {
+		return nil, err
+	}
+
+	// Request the plugin. This returns the gRPC client from the
+	// DeviceModelPlugin. This can then be casted to the interface that we are
+	// exposing through the plugin (in this case "DeviceModel").
+	raw, err := gRPCClient.Dispense("deviceModel")
+	if err != nil {
+		return nil, err
+	}
+
+	// cast the raw plugin to the DeviceModel interface. This allows to call
+	// methods on the plugin as if it were a normal DeviceModel instance but
+	// actually they are executed on the plugin sent through gRPC.
+	model, ok := raw.(shared.DeviceModel)
+	if !ok {
+		return nil, customerrs.InvalidTypeAssertionError{
+			Value: raw,
+			Type:  (*shared.DeviceModel)(nil),
+		}
+	}
+
+	return &Plugin{
+		UUID:        id,
+		client:      client,
+		execPath:    execPath,
+		DeviceModel: model,
+		manifest:    manifest,
+		state:       CREATED,
+	}, nil
+}
+
+// NewPluginThroughReattachConfig creates a new Plugin through a reattach config.
+func NewPluginThroughReattachConfig(loadedPlugin LoadedPlugin) (*Plugin, error) {
+	client := hcplugin.NewClient(&hcplugin.ClientConfig{
+		HandshakeConfig:  shared.Handshake,
+		Plugins:          shared.PluginMap,
+		Reattach:         &loadedPlugin.ReattachConfig,
+		AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC},
+	})
+
+	// create a client that is within the AllowedProtocols. In this case this
+	// returns a gRPCClient. Allows to connect through gRPC.
+	gRPCClient, err := client.Client()
+	if err != nil {
+		return nil, err
+	}
+
+	// Request the plugin. This returns the gRPC client from the
+	// DeviceModelPlugin. This can then be casted to the interface that we are
+	// exposing through the plugin (in this case "DeviceModel").
+	raw, err := gRPCClient.Dispense("deviceModel")
+	if err != nil {
+		return nil, err
+	}
+
+	// cast the raw plugin to the DeviceModel interface. This allows to call
+	// methods on the plugin as if it were a normal DeviceModel instance but
+	// actually they are executed on the plugin sent through gRPC.
+	model, ok := raw.(shared.DeviceModel)
+	if !ok {
+		return nil, customerrs.InvalidTypeAssertionError{
+			Value: model,
+			Type:  (*shared.DeviceModel)(nil),
+		}
+	}
+
+	return &Plugin{
+		UUID:        uuid.MustParse(loadedPlugin.ID),
+		client:      client,
+		DeviceModel: model,
+		manifest:    &loadedPlugin.Manifest,
+		state:       INITIALIZED,
+	}, nil
+}
+
+// ID returns the ID of the plugin.
+func (p *Plugin) ID() uuid.UUID {
+	return p.UUID
+}
+
+// ID returns the ID of the plugin.
+func (p *Plugin) ReattachConfig() *hcplugin.ReattachConfig {
+	return p.client.ReattachConfig()
+}
+
+// State returns the current state of the plugin.
+// Different states of the plugin can be:
+//   - created
+//   - initialized
+//   - faulty
+func (p *Plugin) State() State {
+	return p.state
+}
+
+// ExecPath returns the path to the executable of the plugin.
+func (p *Plugin) ExecPath() string {
+	return p.execPath
+}
+
+// GetClient returns the client of the plugin.
+func (p *Plugin) GetClient() *hcplugin.Client {
+	return p.client
+}
+
+// Manifest returns the manifest of the plugin.
+func (p *Plugin) Manifest() *Manifest {
+	return p.manifest
+}
+
+// Update updates the plugin to the latest available version.
+func (p *Plugin) Update() error {
+	return fmt.Errorf("not implemented yet")
+}
+
+// Restart restarts the plugin.
+func (p *Plugin) Restart() error {
+	return fmt.Errorf("not implemented yet")
+}
+
+// Close ends the execution of the plugin.
+func (p *Plugin) Close() {
+	p.client.Kill()
+}
+
+// Ping checks if the client connection is healthy.
+func (p *Plugin) Ping() error {
+	protocolClient, err := p.client.Client()
+	if err != nil {
+		return err
+	}
+	return protocolClient.Ping()
+}
+
+// TODO: update for the new way of handling plugins
+// UpdatePlugin updates a given Plugin. Therefore the version of the
+// `plugin.yml` manifest file is compared to the version in use. If a new
+// version is within the plugin folder, the new version of the plugin is built.
+func UpdatePlugin(p plugin.Plugin) (updated bool, err error) {
+	return false, fmt.Errorf("not implemented yet")
+}
+
+func (p *Plugin) MarshalJSON() ([]byte, error) {
+	return json.Marshal(&struct {
+		ID             uuid.UUID                `json:"id,omitempty"`
+		Manifest       *Manifest                `json:"manifest" bson:"manifest"`
+		State          State                    `json:"state,omitempty" bson:"state"`
+		ExecPath       string                   `json:"exec_path,omitempty" bson:"exec_path"`
+		ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
+	}{
+		ID:             p.ID(),
+		Manifest:       p.Manifest(),
+		State:          p.State(),
+		ExecPath:       p.ExecPath(),
+		ReattachConfig: p.ReattachConfig(),
+	})
+}
+
+func (p *Plugin) MarshalBSON() ([]byte, error) {
+	return bson.Marshal(&struct {
+		ID             string                   `bson:"_id,omitempty"`
+		Manifest       *Manifest                `json:"manifest" bson:"manifest"`
+		State          State                    `json:"state,omitempty" bson:"state"`
+		ExecPath       string                   `json:"exec_path,omitempty" bson:"exec_path"`
+		ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
+	}{
+		ID:             p.ID().String(),
+		Manifest:       p.Manifest(),
+		State:          p.State(),
+		ExecPath:       p.ExecPath(),
+		ReattachConfig: p.ReattachConfig(),
+	})
+}
diff --git a/controller/nucleus/model/plugin_test.go b/controller/nucleus/domain/model/plugin_test.go
similarity index 100%
rename from controller/nucleus/model/plugin_test.go
rename to controller/nucleus/domain/model/plugin_test.go
diff --git a/controller/nucleus/model/principalNetworkDomain.go b/controller/nucleus/domain/model/principalNetworkDomain.go
similarity index 93%
rename from controller/nucleus/model/principalNetworkDomain.go
rename to controller/nucleus/domain/model/principalNetworkDomain.go
index dbb3291079e3c342b2e4dd30094d7e2a1f4501c5..27c501f3c42efe3f49330c5a9bd99734e6ad090b 100644
--- a/controller/nucleus/model/principalNetworkDomain.go
+++ b/controller/nucleus/domain/model/principalNetworkDomain.go
@@ -9,6 +9,21 @@ import (
 	log "github.com/sirupsen/logrus"
 )
 
+// NetworkDomain provides an interface for network domain implementations
+// like principal network domain or logical network domain.
+type NetworkDomain interface {
+	GetName() string
+	GetDescription() string
+	ID() uuid.UUID
+}
+
+// LoadedPnd represents a PND that was loaded.
+type LoadedPnd struct {
+	ID          string `json:"id" bson:"_id,omitempty"`
+	Name        string `json:"name,omitempty"`
+	Description string `json:"description,omitempty"`
+}
+
 // NewPNDEntity creates a PND object as it is stored in the storage.
 func NewPND(pndID uuid.UUID, name string, description string) networkdomain.NetworkDomain {
 	pnd := &pndImplementation{
diff --git a/controller/nucleus/model/principalNetworkDomain_test.go b/controller/nucleus/domain/model/principalNetworkDomain_test.go
similarity index 100%
rename from controller/nucleus/model/principalNetworkDomain_test.go
rename to controller/nucleus/domain/model/principalNetworkDomain_test.go
diff --git a/controller/nucleus/model/restconf_transport.go b/controller/nucleus/domain/model/restconf_transport.go
similarity index 100%
rename from controller/nucleus/model/restconf_transport.go
rename to controller/nucleus/domain/model/restconf_transport.go
diff --git a/controller/nucleus/model/restconf_transport_test.go b/controller/nucleus/domain/model/restconf_transport_test.go
similarity index 100%
rename from controller/nucleus/model/restconf_transport_test.go
rename to controller/nucleus/domain/model/restconf_transport_test.go
diff --git a/controller/nucleus/model/transport.go b/controller/nucleus/domain/model/transport.go
similarity index 100%
rename from controller/nucleus/model/transport.go
rename to controller/nucleus/domain/model/transport.go
diff --git a/controller/nucleus/model/transport_test.go b/controller/nucleus/domain/model/transport_test.go
similarity index 100%
rename from controller/nucleus/model/transport_test.go
rename to controller/nucleus/domain/model/transport_test.go
diff --git a/controller/nucleus/domain/ports/ports.go b/controller/nucleus/domain/ports/ports.go
new file mode 100644
index 0000000000000000000000000000000000000000..a64a8bb3382cb76f59594807557e43d1808cd12e
--- /dev/null
+++ b/controller/nucleus/domain/ports/ports.go
@@ -0,0 +1,69 @@
+package ports
+
+import (
+	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
+	"github.com/google/uuid"
+)
+
+// Store describes an interface for network element store implementations.
+type NetworkElementStore interface {
+	Add(model.NetworkElement) error
+	Update(model.NetworkElement) error
+	Delete(model.NetworkElement) error
+	Get(store.Query) (model.LoadedNetworkElement, error)
+	GetAll() ([]model.LoadedNetworkElement, error)
+}
+
+// Store describes an interface for plugin store implementations.
+type PluginStore interface {
+	Add(*model.Plugin) error
+	Update(*model.Plugin) error
+	Delete(*model.Plugin) error
+	Get(store.Query) (model.LoadedPlugin, error)
+	GetAll() ([]model.LoadedPlugin, error)
+}
+
+// PndStore describes an interface for pnd store implementations.
+type PndStore interface {
+	Add(model.NetworkDomain) error
+	Delete(model.NetworkDomain) error
+	Get(store.Query) (model.LoadedPnd, error)
+	GetAll() ([]model.LoadedPnd, error)
+	PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error)
+	AddPendingChannel(id uuid.UUID, ch chan networkelement.Details)
+	RemovePendingChannel(id uuid.UUID)
+}
+
+// Service describes an interface for network element service implementations.
+type NetworkElementService interface {
+	Add(model.NetworkElement) error
+	Update(model.NetworkElement) error
+	UpdateModel(uuid.UUID, string) error
+	Delete(model.NetworkElement) error
+	Get(store.Query) (model.NetworkElement, error)
+	GetAll() ([]model.NetworkElement, error)
+	GetAllAsLoaded() ([]model.LoadedNetworkElement, error)
+}
+
+// Service describes an interface for plugin service implementations.
+type PluginService interface {
+	Add(*model.Plugin) error
+	Delete(*model.Plugin) error
+	Get(store.Query) (*model.Plugin, error)
+	GetAll() ([]*model.Plugin, error)
+	RequestPlugin(uuid.UUID) (*model.Plugin, error)
+}
+
+// Service describes an interface for PND service implementation.
+type PndService interface {
+	Add(model.NetworkDomain) error
+	Delete(model.NetworkDomain) error
+	Get(store.Query) (model.NetworkDomain, error)
+	GetAll() ([]model.NetworkDomain, error)
+	// Note: Implement these in case we want to use cSBI again.
+	// PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error)
+	// AddPendingChannel(id uuid.UUID, ch chan networkelement.Details)
+	// RemovePendingChannel(id uuid.UUID)
+}
diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go
index 7b98e690a2c1d65a48ad349ea03d87fcc92d209e..7255423eb200f717bbc26b0e9b7c0fdd9adaae5c 100644
--- a/controller/nucleus/initialise_test.go
+++ b/controller/nucleus/initialise_test.go
@@ -12,7 +12,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto"
 	"code.fbi.h-da.de/danet/gosdn/controller/test"
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
diff --git a/controller/nucleus/model/plugin.go b/controller/nucleus/model/plugin.go
deleted file mode 100644
index 2fe4e0eaf121c017dd25549550b2315928fa5293..0000000000000000000000000000000000000000
--- a/controller/nucleus/model/plugin.go
+++ /dev/null
@@ -1,218 +0,0 @@
-package model
-
-import (
-	"encoding/json"
-	"fmt"
-	"os/exec"
-	"path/filepath"
-
-	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util"
-	"code.fbi.h-da.de/danet/gosdn/controller/plugin/shared"
-	"github.com/google/uuid"
-	hcplugin "github.com/hashicorp/go-plugin"
-	"go.mongodb.org/mongo-driver/bson"
-)
-
-// Plugin is the controllers internal representation of a plugin.
-type Plugin struct {
-	UUID     uuid.UUID
-	state    plugin.State
-	execPath string
-	manifest *plugin.Manifest
-	client   *hcplugin.Client
-	shared.DeviceModel
-}
-
-// NewPlugin creates a new Plugin.
-func NewPlugin(id uuid.UUID, execPath string) (*Plugin, error) {
-	client := hcplugin.NewClient(&hcplugin.ClientConfig{
-		HandshakeConfig:  shared.Handshake,
-		Plugins:          shared.PluginMap,
-		Cmd:              exec.Command("sh", "-c", filepath.Join(execPath, util.PluginExecutableName)),
-		AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC},
-	})
-
-	manifest, err := plugin.ReadManifestFromFile(execPath)
-	if err != nil {
-		return nil, err
-	}
-
-	// create a client that is within the AllowedProtocols. In this case this
-	// returns a gRPCClient. Allows to connect through gRPC.
-	gRPCClient, err := client.Client()
-	if err != nil {
-		return nil, err
-	}
-
-	// Request the plugin. This returns the gRPC client from the
-	// DeviceModelPlugin. This can then be casted to the interface that we are
-	// exposing through the plugin (in this case "DeviceModel").
-	raw, err := gRPCClient.Dispense("deviceModel")
-	if err != nil {
-		return nil, err
-	}
-
-	// cast the raw plugin to the DeviceModel interface. This allows to call
-	// methods on the plugin as if it were a normal DeviceModel instance but
-	// actually they are executed on the plugin sent through gRPC.
-	model, ok := raw.(shared.DeviceModel)
-	if !ok {
-		return nil, customerrs.InvalidTypeAssertionError{
-			Value: raw,
-			Type:  (*shared.DeviceModel)(nil),
-		}
-	}
-
-	return &Plugin{
-		UUID:        id,
-		client:      client,
-		execPath:    execPath,
-		DeviceModel: model,
-		manifest:    manifest,
-		state:       plugin.CREATED,
-	}, nil
-}
-
-// NewPluginThroughReattachConfig creates a new Plugin through a reattach config.
-func NewPluginThroughReattachConfig(loadedPlugin plugin.LoadedPlugin) (plugin.Plugin, error) {
-	client := hcplugin.NewClient(&hcplugin.ClientConfig{
-		HandshakeConfig:  shared.Handshake,
-		Plugins:          shared.PluginMap,
-		Reattach:         &loadedPlugin.ReattachConfig,
-		AllowedProtocols: []hcplugin.Protocol{hcplugin.ProtocolGRPC},
-	})
-
-	// create a client that is within the AllowedProtocols. In this case this
-	// returns a gRPCClient. Allows to connect through gRPC.
-	gRPCClient, err := client.Client()
-	if err != nil {
-		return nil, err
-	}
-
-	// Request the plugin. This returns the gRPC client from the
-	// DeviceModelPlugin. This can then be casted to the interface that we are
-	// exposing through the plugin (in this case "DeviceModel").
-	raw, err := gRPCClient.Dispense("deviceModel")
-	if err != nil {
-		return nil, err
-	}
-
-	// cast the raw plugin to the DeviceModel interface. This allows to call
-	// methods on the plugin as if it were a normal DeviceModel instance but
-	// actually they are executed on the plugin sent through gRPC.
-	model, ok := raw.(shared.DeviceModel)
-	if !ok {
-		return nil, customerrs.InvalidTypeAssertionError{
-			Value: model,
-			Type:  (*shared.DeviceModel)(nil),
-		}
-	}
-
-	return &Plugin{
-		UUID:        uuid.MustParse(loadedPlugin.ID),
-		client:      client,
-		DeviceModel: model,
-		manifest:    &loadedPlugin.Manifest,
-		state:       plugin.INITIALIZED,
-	}, nil
-}
-
-// ID returns the ID of the plugin.
-func (p *Plugin) ID() uuid.UUID {
-	return p.UUID
-}
-
-// ID returns the ID of the plugin.
-func (p *Plugin) ReattachConfig() *hcplugin.ReattachConfig {
-	return p.client.ReattachConfig()
-}
-
-// State returns the current state of the plugin.
-// Different states of the plugin can be:
-//   - created
-//   - initialized
-//   - faulty
-func (p *Plugin) State() plugin.State {
-	return p.state
-}
-
-// ExecPath returns the path to the executable of the plugin.
-func (p *Plugin) ExecPath() string {
-	return p.execPath
-}
-
-// GetClient returns the client of the plugin.
-func (p *Plugin) GetClient() *hcplugin.Client {
-	return p.client
-}
-
-// Manifest returns the manifest of the plugin.
-func (p *Plugin) Manifest() *plugin.Manifest {
-	return p.manifest
-}
-
-// Update updates the plugin to the latest available version.
-func (p *Plugin) Update() error {
-	return fmt.Errorf("not implemented yet")
-}
-
-// Restart restarts the plugin.
-func (p *Plugin) Restart() error {
-	return fmt.Errorf("not implemented yet")
-}
-
-// Close ends the execution of the plugin.
-func (p *Plugin) Close() {
-	p.client.Kill()
-}
-
-// Ping checks if the client connection is healthy.
-func (p *Plugin) Ping() error {
-	protocolClient, err := p.client.Client()
-	if err != nil {
-		return err
-	}
-	return protocolClient.Ping()
-}
-
-// TODO: update for the new way of handling plugins
-// UpdatePlugin updates a given Plugin. Therefore the version of the
-// `plugin.yml` manifest file is compared to the version in use. If a new
-// version is within the plugin folder, the new version of the plugin is built.
-func UpdatePlugin(p plugin.Plugin) (updated bool, err error) {
-	return false, fmt.Errorf("not implemented yet")
-}
-
-func (p *Plugin) MarshalJSON() ([]byte, error) {
-	return json.Marshal(&struct {
-		ID             uuid.UUID                `json:"id,omitempty"`
-		Manifest       *plugin.Manifest         `json:"manifest" bson:"manifest"`
-		State          plugin.State             `json:"state,omitempty" bson:"state"`
-		ExecPath       string                   `json:"exec_path,omitempty" bson:"exec_path"`
-		ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
-	}{
-		ID:             p.ID(),
-		Manifest:       p.Manifest(),
-		State:          p.State(),
-		ExecPath:       p.ExecPath(),
-		ReattachConfig: p.ReattachConfig(),
-	})
-}
-
-func (p *Plugin) MarshalBSON() ([]byte, error) {
-	return bson.Marshal(&struct {
-		ID             string                   `bson:"_id,omitempty"`
-		Manifest       *plugin.Manifest         `json:"manifest" bson:"manifest"`
-		State          plugin.State             `json:"state,omitempty" bson:"state"`
-		ExecPath       string                   `json:"exec_path,omitempty" bson:"exec_path"`
-		ReattachConfig *hcplugin.ReattachConfig `json:"reattatch_config,omitempty" bson:"reattatch_config"`
-	}{
-		ID:             p.ID().String(),
-		Manifest:       p.Manifest(),
-		State:          p.State(),
-		ExecPath:       p.ExecPath(),
-		ReattachConfig: p.ReattachConfig(),
-	})
-}
diff --git a/controller/nucleus/networkElementStore.go b/controller/nucleus/networkElementStore.go
deleted file mode 100644
index 3d1449c204a5cee0f3706444681d6e8ce41fbac9..0000000000000000000000000000000000000000
--- a/controller/nucleus/networkElementStore.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package nucleus
-
-import (
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/store"
-
-	log "github.com/sirupsen/logrus"
-)
-
-// NewNetworkElementStore returns a NetworkElementStore.
-func NewNetworkElementStore() networkelement.Store {
-	storeMode := store.GetStoreMode()
-	log.Debugf("StoreMode: %s", storeMode)
-
-	switch storeMode {
-	case store.Database:
-		return &DatabaseNetworkElementStore{
-			storeName: "networkElement-store.json",
-		}
-
-	default:
-		store := NewFilesystemNetworkElementStore()
-		return store
-	}
-}
diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go
index 3c88f4f1bb64ccb2fa4e07f5a1fa2fc03d24cb46..f2822883e0d2c0c9e8459c3e366f3489850c2ab3 100644
--- a/controller/nucleus/networkElementWatcher.go
+++ b/controller/nucleus/networkElementWatcher.go
@@ -9,8 +9,9 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/event"
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
-	"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/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
 	"code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	"github.com/google/uuid"
@@ -30,7 +31,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 {
-	mneService                 networkelement.Service
+	mneService                 ports.NetworkElementService
 	networkelementSubcriptions map[uuid.UUID]*networkelementSubscriptionHelper
 	eventService               eventInterfaces.Service
 }
@@ -42,7 +43,7 @@ type networkelementSubscriptionHelper struct {
 }
 
 // NewNetworkElementWatcher allows to subscribe to network element paths.
-func NewNetworkElementWatcher(mneService networkelement.Service, eventService eventInterfaces.Service) *NetworkElementWatcher {
+func NewNetworkElementWatcher(mneService ports.NetworkElementService, eventService eventInterfaces.Service) *NetworkElementWatcher {
 	return &NetworkElementWatcher{
 		mneService:                 mneService,
 		networkelementSubcriptions: make(map[uuid.UUID]*networkelementSubscriptionHelper),
@@ -74,7 +75,7 @@ func (n *NetworkElementWatcher) SubscribeToNetworkElements(paths [][]string, opt
 	}
 }
 
-func (n *NetworkElementWatcher) subscribeToNetworkElement(mne networkelement.NetworkElement, opts *gnmi.SubscribeOptions) {
+func (n *NetworkElementWatcher) subscribeToNetworkElement(mne model.NetworkElement, opts *gnmi.SubscribeOptions) {
 	subID := uuid.New()
 
 	stopContext, cancel := context.WithCancel(context.Background())
@@ -88,7 +89,7 @@ func (n *NetworkElementWatcher) subscribeToNetworkElement(mne networkelement.Net
 
 // callSubscribe spawns a worker pool to handle gNMI subscription updates for each individual subscription
 // and then sets up the gNMI subscription listener.
-func (n *NetworkElementWatcher) callSubscribe(stopContext context.Context, mne networkelement.NetworkElement, opts *gnmi.SubscribeOptions) {
+func (n *NetworkElementWatcher) callSubscribe(stopContext context.Context, mne model.NetworkElement, opts *gnmi.SubscribeOptions) {
 	gNMIOptionsCtx := context.Background()
 	gNMIOptionsCtx = context.WithValue(gNMIOptionsCtx, types.CtxKeyOpts, opts)
 
@@ -187,11 +188,11 @@ func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.Subscrib
 	}
 
 	pubEvent := event.NewMneUpdateEvent(mneID, pathsAndValues)
-	if err := n.eventService.PublishEvent(NetworkElementEventTopic, pubEvent); err != nil {
+	if err := n.eventService.PublishEvent(model.NetworkElementEventTopic, pubEvent); err != nil {
 		go func() {
 			n.eventService.Reconnect()
 
-			retryErr := n.eventService.RetryPublish(NetworkElementEventTopic, pubEvent)
+			retryErr := n.eventService.RetryPublish(model.NetworkElementEventTopic, pubEvent)
 			if retryErr != nil {
 				log.Error(retryErr)
 			}
diff --git a/controller/nucleus/networkElementFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go
similarity index 80%
rename from controller/nucleus/networkElementFilesystemStore.go
rename to controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go
index d4b5850cd0e33126db0708855ac63554c9fe12f7..c15b40aef4e504fe1b7e79b4547effa0bbb069d0 100644
--- a/controller/nucleus/networkElementFilesystemStore.go
+++ b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore.go
@@ -1,4 +1,4 @@
-package nucleus
+package filesystem
 
 import (
 	"encoding/json"
@@ -6,7 +6,8 @@ import (
 	"sync"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	log "github.com/sirupsen/logrus"
 )
@@ -18,7 +19,7 @@ type FilesystemNetworkElementStore struct {
 }
 
 // NewFilesystemNetworkElementStore returns a filesystem implementation for a pnd store.
-func NewFilesystemNetworkElementStore() networkelement.Store {
+func NewFilesystemNetworkElementStore() ports.NetworkElementStore {
 	if err := store.EnsureFilesystemStorePathExists(store.NetworkElementFilenameSuffix); err != nil {
 		log.Error(err)
 	}
@@ -28,8 +29,8 @@ func NewFilesystemNetworkElementStore() networkelement.Store {
 	}
 }
 
-func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]networkelement.LoadedNetworkElement, error) {
-	var loadedNetworkElements []networkelement.LoadedNetworkElement
+func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]model.LoadedNetworkElement, error) {
+	var loadedNetworkElements []model.LoadedNetworkElement
 
 	content, err := os.ReadFile(s.pathToNetworkElementFile)
 	if err != nil {
@@ -44,7 +45,7 @@ func (s *FilesystemNetworkElementStore) readAllNetworkElementsFromFile() ([]netw
 	return loadedNetworkElements, nil
 }
 
-func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []networkelement.LoadedNetworkElement) error {
+func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []model.LoadedNetworkElement) error {
 	serializedData, err := json.Marshal(mnes)
 	if err != nil {
 		return err
@@ -59,11 +60,11 @@ func (s *FilesystemNetworkElementStore) writeAllNetworkElementsToFile(mnes []net
 }
 
 // Get takes a network element's UUID or name and returns the network element.
-func (s *FilesystemNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) {
+func (s *FilesystemNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
-	var lMNE networkelement.LoadedNetworkElement
+	var lMNE model.LoadedNetworkElement
 
 	mnes, err := s.readAllNetworkElementsFromFile()
 	if err != nil {
@@ -80,7 +81,7 @@ func (s *FilesystemNetworkElementStore) Get(query store.Query) (networkelement.L
 }
 
 // GetAll returns all stored network elements.
-func (s *FilesystemNetworkElementStore) GetAll() ([]networkelement.LoadedNetworkElement, error) {
+func (s *FilesystemNetworkElementStore) GetAll() ([]model.LoadedNetworkElement, error) {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
@@ -90,7 +91,7 @@ func (s *FilesystemNetworkElementStore) GetAll() ([]networkelement.LoadedNetwork
 }
 
 // Add adds a network element to the network element store.
-func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.NetworkElement) error {
+func (s *FilesystemNetworkElementStore) Add(networkElementToAdd model.NetworkElement) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
@@ -99,8 +100,8 @@ func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.N
 		return err
 	}
 
-	var loadedNetworkElement networkelement.LoadedNetworkElement
-	loadedNetworkElement, err = store.TransformObjectToLoadedObject[networkelement.NetworkElement, networkelement.LoadedNetworkElement](networkElementToAdd)
+	var loadedNetworkElement model.LoadedNetworkElement
+	loadedNetworkElement, err = store.TransformObjectToLoadedObject[model.NetworkElement, model.LoadedNetworkElement](networkElementToAdd)
 	if err != nil {
 		return err
 	}
@@ -116,11 +117,11 @@ func (s *FilesystemNetworkElementStore) Add(networkElementToAdd networkelement.N
 }
 
 // Update updates a existing network element.
-func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate networkelement.NetworkElement) error {
+func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate model.NetworkElement) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
-	loadedNetworkElementToUpdate, err := store.TransformObjectToLoadedObject[networkelement.NetworkElement, networkelement.LoadedNetworkElement](networkElementToUpdate)
+	loadedNetworkElementToUpdate, err := store.TransformObjectToLoadedObject[model.NetworkElement, model.LoadedNetworkElement](networkElementToUpdate)
 	if err != nil {
 		return err
 	}
@@ -145,7 +146,7 @@ func (s *FilesystemNetworkElementStore) Update(networkElementToUpdate networkele
 }
 
 // Delete deletes a network element from the network element store.
-func (s *FilesystemNetworkElementStore) Delete(networkElementToDelete networkelement.NetworkElement) error {
+func (s *FilesystemNetworkElementStore) Delete(networkElementToDelete model.NetworkElement) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
diff --git a/controller/nucleus/networkElementFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go
similarity index 98%
rename from controller/nucleus/networkElementFilesystemStore_test.go
rename to controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go
index eb83bd32d818a090504f243fac65d07c1269640c..b4c630a41567727ace3849f72d7e4dd054026e9a 100644
--- a/controller/nucleus/networkElementFilesystemStore_test.go
+++ b/controller/nucleus/pkg/persistence/filesystem/networkElementFilesystemStore_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package filesystem
 
 import (
 	"testing"
@@ -7,7 +7,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/mocks"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/mock"
diff --git a/controller/nucleus/pluginFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go
similarity index 70%
rename from controller/nucleus/pluginFilesystemStore.go
rename to controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go
index cc48af4a242bbac3001ae6e668ec58fb6a82f658..c1e74b4fe5b726d0d648d450d1b400f974cd9799 100644
--- a/controller/nucleus/pluginFilesystemStore.go
+++ b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore.go
@@ -1,4 +1,4 @@
-package nucleus
+package filesystem
 
 import (
 	"encoding/json"
@@ -6,7 +6,8 @@ import (
 	"sync"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 
 	log "github.com/sirupsen/logrus"
@@ -19,7 +20,7 @@ type FilesystemPluginStore struct {
 }
 
 // NewFilesystemPluginStore returns a filesystem implementation for a plugin store.
-func NewFilesystemPluginStore() plugin.Store {
+func NewFilesystemPluginStore() ports.PluginStore {
 	if err := store.EnsureFilesystemStorePathExists(store.PluginFilenameSuffix); err != nil {
 		log.Error(err)
 	}
@@ -30,8 +31,8 @@ func NewFilesystemPluginStore() plugin.Store {
 	}
 }
 
-func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]plugin.LoadedPlugin, error) {
-	var loadedPlugins []plugin.LoadedPlugin
+func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]model.LoadedPlugin, error) {
+	var loadedPlugins []model.LoadedPlugin
 
 	content, err := os.ReadFile(s.pathToPluginFile)
 	if err != nil {
@@ -45,7 +46,7 @@ func (s *FilesystemPluginStore) readAllPluginsFromFile() ([]plugin.LoadedPlugin,
 	return loadedPlugins, nil
 }
 
-func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []plugin.LoadedPlugin) error {
+func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []model.LoadedPlugin) error {
 	serializedData, err := json.Marshal(plugins)
 	if err != nil {
 		return err
@@ -59,7 +60,7 @@ func (s *FilesystemPluginStore) writeAllPluginsToFile(plugins []plugin.LoadedPlu
 }
 
 // Add adds a Plugin.
-func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error {
+func (s *FilesystemPluginStore) Add(pluginToAdd *model.Plugin) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
@@ -68,8 +69,8 @@ func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error {
 		return err
 	}
 
-	var loadedPlugin plugin.LoadedPlugin
-	loadedPlugin, err = store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToAdd)
+	var loadedPlugin model.LoadedPlugin
+	loadedPlugin, err = s.transformObjectToLoadedObject(pluginToAdd)
 	if err != nil {
 		return err
 	}
@@ -85,11 +86,11 @@ func (s *FilesystemPluginStore) Add(pluginToAdd plugin.Plugin) error {
 }
 
 // Update updates an existing plugin.
-func (s *FilesystemPluginStore) Update(pluginToUpdate plugin.Plugin) error {
+func (s *FilesystemPluginStore) Update(pluginToUpdate *model.Plugin) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
-	loadedPluginToUpdate, err := store.TransformObjectToLoadedObject[plugin.Plugin, plugin.LoadedPlugin](pluginToUpdate)
+	loadedPluginToUpdate, err := s.transformObjectToLoadedObject(pluginToUpdate)
 	if err != nil {
 		return err
 	}
@@ -114,7 +115,7 @@ func (s *FilesystemPluginStore) Update(pluginToUpdate plugin.Plugin) error {
 }
 
 // Delete deletes an Plugin.
-func (s *FilesystemPluginStore) Delete(pluginToDelete plugin.Plugin) error {
+func (s *FilesystemPluginStore) Delete(pluginToDelete *model.Plugin) error {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
@@ -142,11 +143,11 @@ func (s *FilesystemPluginStore) Delete(pluginToDelete plugin.Plugin) error {
 
 // Get takes a Plugin's UUID or name and returns the Plugin. If the requested
 // Plugin does not exist an error is returned.
-func (s *FilesystemPluginStore) Get(query store.Query) (plugin.LoadedPlugin, error) {
+func (s *FilesystemPluginStore) Get(query store.Query) (model.LoadedPlugin, error) {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
-	var plugin plugin.LoadedPlugin
+	var plugin model.LoadedPlugin
 
 	plugins, err := s.readAllPluginsFromFile()
 	if err != nil {
@@ -163,7 +164,7 @@ func (s *FilesystemPluginStore) Get(query store.Query) (plugin.LoadedPlugin, err
 }
 
 // GetAll returns all Plugins.
-func (s *FilesystemPluginStore) GetAll() ([]plugin.LoadedPlugin, error) {
+func (s *FilesystemPluginStore) GetAll() ([]model.LoadedPlugin, error) {
 	s.fileMutex.Lock()
 	defer s.fileMutex.Unlock()
 
@@ -171,3 +172,19 @@ func (s *FilesystemPluginStore) GetAll() ([]plugin.LoadedPlugin, error) {
 
 	return plugins, err
 }
+
+func (s *FilesystemPluginStore) transformObjectToLoadedObject(plugin *model.Plugin) (model.LoadedPlugin, error) {
+	var loadedObject model.LoadedPlugin
+
+	serializedData, err := json.Marshal(plugin)
+	if err != nil {
+		return loadedObject, err
+	}
+
+	err = json.Unmarshal(serializedData, &loadedObject)
+	if err != nil {
+		return loadedObject, err
+	}
+
+	return loadedObject, err
+}
diff --git a/controller/nucleus/pluginFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go
similarity index 99%
rename from controller/nucleus/pluginFilesystemStore_test.go
rename to controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go
index 195feba8afdb584b5b6f8aa38d10109499628131..ac2881c804720a224fb35514c882b38612e089a9 100644
--- a/controller/nucleus/pluginFilesystemStore_test.go
+++ b/controller/nucleus/pkg/persistence/filesystem/pluginFilesystemStore_test.go
@@ -1,4 +1,4 @@
-package nucleus
+package filesystem
 
 import (
 	"testing"
diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go
similarity index 79%
rename from controller/nucleus/pndFilesystemStore.go
rename to controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go
index 31c49239d8123a7c500cbefee4c6a23f9d394aec..eca2a0a91ede2309a9ee20149839868da3e1ee82 100644
--- a/controller/nucleus/pndFilesystemStore.go
+++ b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore.go
@@ -1,4 +1,4 @@
-package nucleus
+package filesystem
 
 import (
 	"encoding/json"
@@ -6,10 +6,9 @@ import (
 	"sync"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"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/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -18,19 +17,19 @@ import (
 // FilesystemPndStore provides a filesystem implementation for a pnd store.
 type FilesystemPndStore struct {
 	pendingChannels map[uuid.UUID]chan networkelement.Details
-	pluginService   plugin.Service
+	pluginService   ports.PluginService
 	// csbiClient      cpb.CsbiServiceClient
 	pathToPndFile string
 	fileMutex     sync.Mutex
 }
 
 // NewFilesystemPndStore returns a filesystem implementation for a pnd store.
-func NewFilesystemPndStore(pluginService plugin.Service) FilesystemPndStore {
+func NewFilesystemPndStore(pluginService ports.PluginService) ports.PndStore {
 	if err := store.EnsureFilesystemStorePathExists(store.PndFilename); err != nil {
 		log.Error(err)
 	}
 
-	return FilesystemPndStore{
+	return &FilesystemPndStore{
 		pendingChannels: make(map[uuid.UUID]chan networkelement.Details),
 		pathToPndFile:   store.GetCompletePathToFileStore(store.PndFilename),
 		fileMutex:       sync.Mutex{},
@@ -38,8 +37,8 @@ func NewFilesystemPndStore(pluginService plugin.Service) FilesystemPndStore {
 	}
 }
 
-func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, error) {
-	var loadedPnds []networkdomain.LoadedPnd
+func (t *FilesystemPndStore) readAllPndsFromFile() ([]model.LoadedPnd, error) {
+	var loadedPnds []model.LoadedPnd
 
 	content, err := os.ReadFile(t.pathToPndFile)
 	if err != nil {
@@ -51,7 +50,7 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, e
 		return nil, err
 	}
 
-	pnds := make([]networkdomain.NetworkDomain, len(loadedPnds))
+	pnds := make([]model.NetworkDomain, len(loadedPnds))
 
 	// csbiClient, err := t.getCsbiClient()
 	// if err != nil {
@@ -73,7 +72,7 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, e
 	return loadedPnds, nil
 }
 
-func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.LoadedPnd) error {
+func (t *FilesystemPndStore) writeAllPndsToFile(pnds []model.LoadedPnd) error {
 	serializedData, err := json.Marshal(pnds)
 	if err != nil {
 		return err
@@ -88,7 +87,7 @@ func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.LoadedPnd)
 }
 
 // Add a pnd to the store.
-func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error {
+func (t *FilesystemPndStore) Add(pndToAdd model.NetworkDomain) error {
 	t.fileMutex.Lock()
 	defer t.fileMutex.Unlock()
 
@@ -97,8 +96,8 @@ func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error {
 		return err
 	}
 
-	var loadedPnd networkdomain.LoadedPnd
-	loadedPnd, err = store.TransformObjectToLoadedObject[networkdomain.NetworkDomain, networkdomain.LoadedPnd](pndToAdd)
+	var loadedPnd model.LoadedPnd
+	loadedPnd, err = store.TransformObjectToLoadedObject[model.NetworkDomain, model.LoadedPnd](pndToAdd)
 	if err != nil {
 		return err
 	}
@@ -114,7 +113,7 @@ func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error {
 }
 
 // Delete deletes a pnd from the store.
-func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) error {
+func (t *FilesystemPndStore) Delete(pndToDelete model.NetworkDomain) error {
 	t.fileMutex.Lock()
 	defer t.fileMutex.Unlock()
 
@@ -142,11 +141,11 @@ func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) err
 }
 
 // Get provides a the query interface to find a stored pnd.
-func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) {
+func (t *FilesystemPndStore) Get(query store.Query) (model.LoadedPnd, error) {
 	t.fileMutex.Lock()
 	defer t.fileMutex.Unlock()
 
-	var loadedPND networkdomain.LoadedPnd
+	var loadedPND model.LoadedPnd
 
 	pnds, err := t.readAllPndsFromFile()
 	if err != nil {
@@ -163,7 +162,7 @@ func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.LoadedPnd, er
 }
 
 // GetAll returns all pnds currently on the store.
-func (t *FilesystemPndStore) GetAll() ([]networkdomain.LoadedPnd, error) {
+func (t *FilesystemPndStore) GetAll() ([]model.LoadedPnd, error) {
 	t.fileMutex.Lock()
 	defer t.fileMutex.Unlock()
 
diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go
similarity index 97%
rename from controller/nucleus/pndFilesystemStore_test.go
rename to controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go
index 0ced4bf3e4d3efb350e0a490e883a5c58dab0b13..01e6aff9b40c546773d8e13779e6d82b237a5262 100644
--- a/controller/nucleus/pndFilesystemStore_test.go
+++ b/controller/nucleus/pkg/persistence/filesystem/pndFilesystemStore_test.go
@@ -1,10 +1,10 @@
-package nucleus
+package filesystem
 
 import (
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 )
diff --git a/controller/nucleus/memoryNetworkElementStore.go b/controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go
similarity index 68%
rename from controller/nucleus/memoryNetworkElementStore.go
rename to controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go
index 100410af71bffe51c7e8f46404194d2e780f4a73..1144dc9baa9df9883397edad024fa4dd65851fc7 100644
--- a/controller/nucleus/memoryNetworkElementStore.go
+++ b/controller/nucleus/pkg/persistence/memory/memoryNetworkElementStore.go
@@ -1,30 +1,31 @@
-package nucleus
+package memory
 
 import (
 	"encoding/json"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 )
 
 // MemoryNetworkElementStore provides a in-memory implementation for network elements.
 type MemoryNetworkElementStore struct {
-	Store           map[string]networkelement.LoadedNetworkElement
+	Store           map[string]model.LoadedNetworkElement
 	nameLookupTable map[string]string
 }
 
 // NewMemoryNetworkElementStore returns a specific in-memory store for network elements.
-func NewMemoryNetworkElementStore() networkelement.Store {
+func NewMemoryNetworkElementStore() ports.NetworkElementStore {
 	return &MemoryNetworkElementStore{
-		Store:           make(map[string]networkelement.LoadedNetworkElement),
+		Store:           make(map[string]model.LoadedNetworkElement),
 		nameLookupTable: make(map[string]string),
 	}
 }
 
 // Add adds a item to the store.
-func (t *MemoryNetworkElementStore) Add(item networkelement.NetworkElement) error {
-	var mne networkelement.LoadedNetworkElement
+func (t *MemoryNetworkElementStore) Add(item model.NetworkElement) error {
+	var mne model.LoadedNetworkElement
 
 	b, err := json.Marshal(item)
 	if err != nil {
@@ -47,13 +48,13 @@ func (t *MemoryNetworkElementStore) Add(item networkelement.NetworkElement) erro
 }
 
 // Update updates a existing network element.
-func (t *MemoryNetworkElementStore) Update(item networkelement.NetworkElement) error {
+func (t *MemoryNetworkElementStore) Update(item model.NetworkElement) error {
 	_, ok := t.Store[item.ID().String()]
 	if !ok {
 		return customerrs.CouldNotFindError{ID: item.ID(), Name: item.Name()}
 	}
 
-	var mne networkelement.LoadedNetworkElement
+	var mne model.LoadedNetworkElement
 
 	b, err := json.Marshal(item)
 	if err != nil {
@@ -71,14 +72,14 @@ func (t *MemoryNetworkElementStore) Update(item networkelement.NetworkElement) e
 }
 
 // Delete deletes a network element from the network element store.
-func (t *MemoryNetworkElementStore) Delete(item networkelement.NetworkElement) error {
+func (t *MemoryNetworkElementStore) Delete(item model.NetworkElement) error {
 	delete(t.Store, item.ID().String())
 
 	return nil
 }
 
 // Get takes a network element's UUID or name and returns the network element.
-func (t *MemoryNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) {
+func (t *MemoryNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) {
 	// First search for direct hit on UUID.
 	item, ok := t.Store[query.ID.String()]
 	if !ok {
@@ -100,8 +101,8 @@ func (t *MemoryNetworkElementStore) Get(query store.Query) (networkelement.Loade
 }
 
 // GetAll returns all stored network elements.
-func (t *MemoryNetworkElementStore) GetAll() ([]networkelement.LoadedNetworkElement, error) {
-	var allItems []networkelement.LoadedNetworkElement
+func (t *MemoryNetworkElementStore) GetAll() ([]model.LoadedNetworkElement, error) {
+	var allItems []model.LoadedNetworkElement
 
 	for _, item := range t.Store {
 		allItems = append(allItems, item)
diff --git a/controller/nucleus/memoryPluginStore.go b/controller/nucleus/pkg/persistence/memory/memoryPluginStore.go
similarity index 99%
rename from controller/nucleus/memoryPluginStore.go
rename to controller/nucleus/pkg/persistence/memory/memoryPluginStore.go
index 8c32b009ab5c4bdebb231d463fa34257909aca9b..1a346aec0752d41fa54299e78a5224037ead29c8 100644
--- a/controller/nucleus/memoryPluginStore.go
+++ b/controller/nucleus/pkg/persistence/memory/memoryPluginStore.go
@@ -1,4 +1,4 @@
-package nucleus
+package memory
 
 import (
 	"encoding/json"
diff --git a/controller/nucleus/memoryPndStore.go b/controller/nucleus/pkg/persistence/memory/memoryPndStore.go
similarity index 75%
rename from controller/nucleus/memoryPndStore.go
rename to controller/nucleus/pkg/persistence/memory/memoryPndStore.go
index 8fe4286e95ba819ccf099b38ae8f819364a6817b..f63abc7a3d11c69e945e8f650ab1ada28295aaef 100644
--- a/controller/nucleus/memoryPndStore.go
+++ b/controller/nucleus/pkg/persistence/memory/memoryPndStore.go
@@ -1,32 +1,33 @@
-package nucleus
+package memory
 
 import (
 	"encoding/json"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"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/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 )
 
 // MemoryPndStore provides a in-memory implementation for a pnd store.
 type MemoryPndStore struct {
-	Store           map[uuid.UUID]networkdomain.LoadedPnd
+	Store           map[uuid.UUID]model.LoadedPnd
 	pendingChannels map[uuid.UUID]chan networkelement.Details
 }
 
 // NewMemoryPndStore returns a in-memory implementation for a pnd store.
-func NewMemoryPndStore() networkdomain.PndStore {
+func NewMemoryPndStore() ports.PndStore {
 	return &MemoryPndStore{
-		Store:           make(map[uuid.UUID]networkdomain.LoadedPnd),
+		Store:           make(map[uuid.UUID]model.LoadedPnd),
 		pendingChannels: make(map[uuid.UUID]chan networkelement.Details),
 	}
 }
 
 // Add adds a pnd to the store.
-func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error {
-	var pnd networkdomain.LoadedPnd
+func (t *MemoryPndStore) Add(item model.NetworkDomain) error {
+	var pnd model.LoadedPnd
 
 	b, err := json.Marshal(item)
 	if err != nil {
@@ -49,14 +50,14 @@ func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error {
 }
 
 // Delete deletes a pnd from the store.
-func (t *MemoryPndStore) Delete(item networkdomain.NetworkDomain) error {
+func (t *MemoryPndStore) Delete(item model.NetworkDomain) error {
 	delete(t.Store, item.ID())
 
 	return nil
 }
 
 // Get provides a the query interface to find a stored pnd.
-func (t *MemoryPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) {
+func (t *MemoryPndStore) Get(query store.Query) (model.LoadedPnd, error) {
 	// First search for direct hit on UUID.
 	item, ok := t.Store[query.ID]
 	if !ok {
@@ -67,8 +68,8 @@ func (t *MemoryPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error)
 }
 
 // GetAll returns all pnds currently on the store.
-func (t *MemoryPndStore) GetAll() ([]networkdomain.LoadedPnd, error) {
-	var allItems []networkdomain.LoadedPnd
+func (t *MemoryPndStore) GetAll() ([]model.LoadedPnd, error) {
+	var allItems []model.LoadedPnd
 
 	for _, item := range t.Store {
 		allItems = append(allItems, item)
diff --git a/controller/nucleus/databaseNetworkElementStore.go b/controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go
similarity index 80%
rename from controller/nucleus/databaseNetworkElementStore.go
rename to controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go
index ac23cbad7d37ffe739d73f5053831d8856c0762c..dd62e53e8b861d5421bc24b72c17a7015dbe4013 100644
--- a/controller/nucleus/databaseNetworkElementStore.go
+++ b/controller/nucleus/pkg/persistence/mongodb/databaseNetworkElementStore.go
@@ -1,13 +1,13 @@
-package nucleus
+package mongodb
 
 import (
 	"fmt"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
+
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 	"go.mongodb.org/mongo-driver/mongo"
@@ -24,15 +24,15 @@ type DatabaseNetworkElementStore struct {
 }
 
 // NewDatabaseNetworkElementStore returns a NetworkElementStore.
-func NewDatabaseNetworkElementStore(pndUUID uuid.UUID) networkelement.Store {
+func NewDatabaseNetworkElementStore() ports.NetworkElementStore {
 	return &DatabaseNetworkElementStore{
-		storeName: fmt.Sprintf("networkElement-store-%s.json", pndUUID.String()),
+		storeName: fmt.Sprintf("networkElement-store.json"),
 	}
 }
 
 // Get takes a NetworkElement's UUID or name and returns the NetworkElement.
-func (s *DatabaseNetworkElementStore) Get(query store.Query) (networkelement.LoadedNetworkElement, error) {
-	var loadedNetworkElement networkelement.LoadedNetworkElement
+func (s *DatabaseNetworkElementStore) Get(query store.Query) (model.LoadedNetworkElement, error) {
+	var loadedNetworkElement model.LoadedNetworkElement
 
 	if query.ID.String() != "" {
 		loadedNetworkElement, err := s.getByID(query.ID)
@@ -51,8 +51,8 @@ func (s *DatabaseNetworkElementStore) Get(query store.Query) (networkelement.Loa
 	return loadedNetworkElement, nil
 }
 
-func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loadedNetworkElement networkelement.LoadedNetworkElement, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loadedNetworkElement model.LoadedNetworkElement, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -60,7 +60,7 @@ func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loa
 			err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
 		}
 	}()
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfNetworkElement.String()}})
 	if result == nil {
@@ -76,8 +76,8 @@ func (s *DatabaseNetworkElementStore) getByID(idOfNetworkElement uuid.UUID) (loa
 	return loadedNetworkElement, nil
 }
 
-func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (loadedNetworkElement networkelement.LoadedNetworkElement, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (loadedNetworkElement model.LoadedNetworkElement, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -85,7 +85,7 @@ func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (lo
 			err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
 		}
 	}()
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfNetworkElement}})
 	if result == nil {
@@ -102,8 +102,8 @@ func (s *DatabaseNetworkElementStore) getByName(nameOfNetworkElement string) (lo
 }
 
 // GetAll returns all stored network elements.
-func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networkelement.LoadedNetworkElement, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []model.LoadedNetworkElement, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -112,7 +112,7 @@ func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networke
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -137,8 +137,8 @@ func (s *DatabaseNetworkElementStore) GetAll() (loadedNetworkElements []networke
 }
 
 // Add adds a network element to the network element store.
-func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.NetworkElement) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabaseNetworkElementStore) Add(networkElementToAdd model.NetworkElement) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -147,7 +147,7 @@ func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.Net
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, networkElementToAdd)
 	if err != nil {
@@ -159,10 +159,10 @@ func (s *DatabaseNetworkElementStore) Add(networkElementToAdd networkelement.Net
 }
 
 // Update updates a existing network element.
-func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkelement.NetworkElement) (err error) {
-	var updatedLoadedNetworkElement networkelement.LoadedNetworkElement
+func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate model.NetworkElement) (err error) {
+	var updatedLoadedNetworkElement model.LoadedNetworkElement
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -175,7 +175,7 @@ func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkeleme
 	wcMajority := writeconcern.Majority()
 
 	wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority)
-	userCollection := client.Database(database.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts)
+	userCollection := client.Database(DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts)
 
 	session, err := client.StartSession()
 	if err != nil {
@@ -241,8 +241,8 @@ func (s *DatabaseNetworkElementStore) Update(networkElementToUpdate networkeleme
 }
 
 // Delete deletes a network element from the network element store.
-func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete networkelement.NetworkElement) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete model.NetworkElement) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -251,7 +251,7 @@ func (s *DatabaseNetworkElementStore) Delete(networkElementToDelete networkeleme
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: networkElementToDelete.ID().String()}})
diff --git a/controller/nucleus/databasePluginStore.go b/controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go
similarity index 78%
rename from controller/nucleus/databasePluginStore.go
rename to controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go
index 8c98e5a15e2750852815b2f0ae4d3527d0ebfeda..19f9cd5fa876d409467cbf2ca3265e32fa459e36 100644
--- a/controller/nucleus/databasePluginStore.go
+++ b/controller/nucleus/pkg/persistence/mongodb/databasePluginStore.go
@@ -1,11 +1,11 @@
-package nucleus
+package mongodb
 
 import (
 	"fmt"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
@@ -20,9 +20,15 @@ type DatabasePluginStore struct {
 	pluginStoreName string
 }
 
+func NewDatabasePluginStore() ports.PluginStore {
+	return &DatabasePluginStore{
+		pluginStoreName: store.PluginFilenameSuffix,
+	}
+}
+
 // Add adds a plugin.
-func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePluginStore) Add(pluginToAdd *model.Plugin) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -31,7 +37,7 @@ func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(DatabaseName).
 		Collection(s.pluginStoreName).
 		InsertOne(ctx, pluginToAdd)
 	if err != nil {
@@ -46,10 +52,10 @@ func (s *DatabasePluginStore) Add(pluginToAdd plugin.Plugin) (err error) {
 }
 
 // Update updates an existing plugin.
-func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) {
-	var updatedLoadedPlugin plugin.LoadedPlugin
+func (s *DatabasePluginStore) Update(pluginToUpdate *model.Plugin) (err error) {
+	var updatedLoadedPlugin model.LoadedPlugin
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -67,7 +73,7 @@ func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) {
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(DatabaseName).
 		Collection(s.pluginStoreName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": pluginToUpdate.ID().String()}, update, &opt).
@@ -82,8 +88,8 @@ func (s *DatabasePluginStore) Update(pluginToUpdate plugin.Plugin) (err error) {
 }
 
 // Delete deletes an plugin.
-func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePluginStore) Delete(pluginToDelete *model.Plugin) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -92,7 +98,7 @@ func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(DatabaseName).
 		Collection(s.pluginStoreName).
 		DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: pluginToDelete.ID().String()}})
 	if err != nil {
@@ -104,8 +110,8 @@ func (s *DatabasePluginStore) Delete(pluginToDelete plugin.Plugin) (err error) {
 
 // Get takes a SouthboundInterface's UUID or name and returns the SouthboundInterface. If the requested
 // SouthboundInterface does not exist an error is returned.
-func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.LoadedPlugin, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin model.LoadedPlugin, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -116,7 +122,7 @@ func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.Loaded
 
 	log.Debugf("Plugin-Search-ID: %+v\n", query.ID.String())
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.pluginStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: query.ID.String()}})
 	if result == nil {
@@ -134,8 +140,8 @@ func (s *DatabasePluginStore) Get(query store.Query) (loadedPlugin plugin.Loaded
 }
 
 // GetAll returns all plugin.
-func (s *DatabasePluginStore) GetAll() (loadedPlugins []plugin.LoadedPlugin, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePluginStore) GetAll() (loadedPlugins []model.LoadedPlugin, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -143,7 +149,7 @@ func (s *DatabasePluginStore) GetAll() (loadedPlugins []plugin.LoadedPlugin, err
 			err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
 		}
 	}()
-	db := client.Database(database.DatabaseName)
+	db := client.Database(DatabaseName)
 	collection := db.Collection(s.pluginStoreName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/pkg/persistence/mongodb/databasePndStore.go
similarity index 77%
rename from controller/nucleus/databasePndStore.go
rename to controller/nucleus/pkg/persistence/mongodb/databasePndStore.go
index c5497a000e130713c4b1cc20ce7103ed5d259081..5b82e904935b9dbe3505e7268f0d4021a8946fb3 100644
--- a/controller/nucleus/databasePndStore.go
+++ b/controller/nucleus/pkg/persistence/mongodb/databasePndStore.go
@@ -1,14 +1,13 @@
-package nucleus
+package mongodb
 
 import (
 	"fmt"
 
-	"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/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -18,15 +17,15 @@ import (
 
 // DatabasePndStore is used to store PrincipalNetworkDomains.
 type DatabasePndStore struct {
-	pndStoreName    string
-	pendingChannels map[uuid.UUID]chan networkelement.Details
-	pluginService   plugin.Service
+	PndStoreName            string
+	InternalPendingChannels map[uuid.UUID]chan networkelement.Details
+	PluginService           ports.PluginService
 }
 
 // Get takes a PrincipalNetworkDomain's UUID or name and returns the PrincipalNetworkDomain. If the requested
 // PrincipalNetworkDomain does not exist an error is returned.
-func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.LoadedPnd, err error) {
-	var loadedPND networkdomain.LoadedPnd
+func (s *DatabasePndStore) Get(query store.Query) (newPnd model.LoadedPnd, err error) {
+	var loadedPND model.LoadedPnd
 
 	if query.ID != uuid.Nil {
 		loadedPND, err := s.getByID(query.ID)
@@ -57,8 +56,8 @@ func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.LoadedPn
 	return loadedPND, nil
 }
 
-func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.LoadedPnd, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd model.LoadedPnd, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -67,8 +66,8 @@ func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.L
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
-	collection := db.Collection(s.pndStoreName)
+	db := client.Database(DatabaseName)
+	collection := db.Collection(s.PndStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfPnd.String()}})
 	if result == nil {
 		return loadedPnd, customerrs.CouldNotFindError{ID: idOfPnd}
@@ -83,8 +82,8 @@ func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.L
 	return loadedPnd, nil
 }
 
-func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain.LoadedPnd, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd model.LoadedPnd, err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -93,8 +92,8 @@ func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain.
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
-	collection := db.Collection(s.pndStoreName)
+	db := client.Database(DatabaseName)
+	collection := db.Collection(s.PndStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfPnd}})
 	if result == nil {
 		return loadedPnd, customerrs.CouldNotFindError{ID: nameOfPnd}
@@ -110,10 +109,10 @@ func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain.
 }
 
 // GetAll returns all stored pnds.
-func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error) {
-	var loadedPnds []networkdomain.LoadedPnd
+func (s *DatabasePndStore) GetAll() (pnds []model.LoadedPnd, err error) {
+	var loadedPnds []model.LoadedPnd
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -122,8 +121,8 @@ func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error)
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
-	collection := db.Collection(s.pndStoreName)
+	db := client.Database(DatabaseName)
+	collection := db.Collection(s.PndStoreName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
 	if err != nil {
@@ -168,8 +167,8 @@ func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error)
 }
 
 // Add adds a pnd to the pnd store.
-func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePndStore) Add(pndToAdd model.NetworkDomain) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -178,8 +177,8 @@ func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error)
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
-		Collection(s.pndStoreName).
+	_, err = client.Database(DatabaseName).
+		Collection(s.PndStoreName).
 		InsertOne(ctx, pndToAdd)
 	if err != nil {
 		return customerrs.CouldNotCreateError{Identifier: pndToAdd.ID(), Type: pndToAdd, Err: err}
@@ -190,8 +189,8 @@ func (s *DatabasePndStore) Add(pndToAdd networkdomain.NetworkDomain) (err error)
 
 // Delete deletes a pnd.
 // It also deletes all assosicated devices and sbis.
-func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+func (s *DatabasePndStore) Delete(pndToDelete model.NetworkDomain) (err error) {
+	client, ctx, cancel := GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -199,8 +198,8 @@ func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err
 			err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
 		}
 	}()
-	db := client.Database(database.DatabaseName)
-	collection := db.Collection(s.pndStoreName)
+	db := client.Database(DatabaseName)
+	collection := db.Collection(s.PndStoreName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: pndToDelete.ID().String()}})
 	if err != nil {
 		return customerrs.CouldNotDeleteError{Identifier: pndToDelete.ID(), Type: pndToDelete, Err: err}
@@ -214,7 +213,7 @@ func (s *DatabasePndStore) Delete(pndToDelete networkdomain.NetworkDomain) (err
 // PendingChannels holds channels used communicate with pending
 // cSBI deployments.
 func (s *DatabasePndStore) PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) {
-	ch, ok := s.pendingChannels[id]
+	ch, ok := s.InternalPendingChannels[id]
 	if !ok {
 		return nil, &customerrs.CouldNotFindError{ID: id}
 	}
@@ -223,12 +222,12 @@ func (s *DatabasePndStore) PendingChannels(id uuid.UUID, parseErrors ...error) (
 
 // AddPendingChannel adds a pending channel to the map.
 func (s *DatabasePndStore) AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) {
-	s.pendingChannels[id] = ch
+	s.InternalPendingChannels[id] = ch
 }
 
 // RemovePendingChannel removes a pending channel from the map.
 func (s *DatabasePndStore) RemovePendingChannel(id uuid.UUID) {
-	delete(s.pendingChannels, id)
+	delete(s.InternalPendingChannels, id)
 }
 
 // func (s *DatabasePndStore) callback(id uuid.UUID, ch chan networkelement.Details) {
diff --git a/controller/nucleus/database/mongo-connection.go b/controller/nucleus/pkg/persistence/mongodb/mongo-connection.go
similarity index 98%
rename from controller/nucleus/database/mongo-connection.go
rename to controller/nucleus/pkg/persistence/mongodb/mongo-connection.go
index 8e4bde62074e5f8e6217982fa49abdcdba487d35..2d89e3e46ddc4a22dd3a948d22cd95ac89451d1b 100644
--- a/controller/nucleus/database/mongo-connection.go
+++ b/controller/nucleus/pkg/persistence/mongodb/mongo-connection.go
@@ -1,4 +1,4 @@
-package database
+package mongodb
 
 import (
 	"context"
diff --git a/controller/nucleus/pkg/persistence/networkElementStore.go b/controller/nucleus/pkg/persistence/networkElementStore.go
new file mode 100644
index 0000000000000000000000000000000000000000..0c6a51450e93c6203b0b549abd7f13eae0fab58c
--- /dev/null
+++ b/controller/nucleus/pkg/persistence/networkElementStore.go
@@ -0,0 +1,25 @@
+package persistence
+
+import (
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
+
+	log "github.com/sirupsen/logrus"
+)
+
+// NewNetworkElementStore returns a NetworkElementStore.
+func NewNetworkElementStore() ports.NetworkElementStore {
+	storeMode := store.GetStoreMode()
+	log.Debugf("StoreMode: %s", storeMode)
+
+	switch storeMode {
+	case store.Database:
+		return mongodb.NewDatabaseNetworkElementStore()
+
+	default:
+		store := filesystem.NewFilesystemNetworkElementStore()
+		return store
+	}
+}
diff --git a/controller/nucleus/pkg/persistence/pluginStore.go b/controller/nucleus/pkg/persistence/pluginStore.go
new file mode 100644
index 0000000000000000000000000000000000000000..1d0385114c5e9f129761764b8a3a12e7b6fab6a4
--- /dev/null
+++ b/controller/nucleus/pkg/persistence/pluginStore.go
@@ -0,0 +1,22 @@
+package persistence
+
+import (
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
+)
+
+// NewPluginStore returns a pluginStore.
+func NewPluginStore() ports.PluginStore {
+	storeMode := store.GetStoreMode()
+
+	switch storeMode {
+	case store.Database:
+		return mongodb.NewDatabasePluginStore()
+
+	default:
+		store := filesystem.NewFilesystemPluginStore()
+		return store
+	}
+}
diff --git a/controller/nucleus/pndStore.go b/controller/nucleus/pkg/persistence/pndStore.go
similarity index 56%
rename from controller/nucleus/pndStore.go
rename to controller/nucleus/pkg/persistence/pndStore.go
index c865a26e20e241782ec5fbe26c7afd82a623db39..e690c626aa9ba04f0f2b682501b830cb19eadd34 100644
--- a/controller/nucleus/pndStore.go
+++ b/controller/nucleus/pkg/persistence/pndStore.go
@@ -1,9 +1,10 @@
-package nucleus
+package persistence
 
 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/plugin"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/ports"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/filesystem"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -22,20 +23,19 @@ type PndStore struct {
 }
 
 // NewPndStore returns a PndStore.
-func NewPndStore(pluginService plugin.Service) networkdomain.PndStore {
+func NewPndStore(pluginService ports.PluginService) ports.PndStore {
 	storeMode := store.GetStoreMode()
 	log.Debugf("StoreMode: %s", storeMode)
 
 	switch storeMode {
 	case store.Database:
-		return &DatabasePndStore{
-			pendingChannels: make(map[uuid.UUID]chan networkelement.Details),
-			pndStoreName:    "pnd-store.json",
-			pluginService:   pluginService,
+		return &mongodb.DatabasePndStore{
+			InternalPendingChannels: make(map[uuid.UUID]chan networkelement.Details),
+			PndStoreName:            "pnd-store.json",
+			PluginService:           pluginService,
 		}
 
 	default:
-		store := NewFilesystemPndStore(pluginService)
-		return &store
+		return filesystem.NewFilesystemPndStore(pluginService)
 	}
 }
diff --git a/controller/nucleus/pluginStore.go b/controller/nucleus/pluginStore.go
deleted file mode 100644
index cc68ab041fe7c22541a5f3a42cacd556b326310a..0000000000000000000000000000000000000000
--- a/controller/nucleus/pluginStore.go
+++ /dev/null
@@ -1,22 +0,0 @@
-package nucleus
-
-import (
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
-	"code.fbi.h-da.de/danet/gosdn/controller/store"
-)
-
-// NewPluginStore returns a pluginStore.
-func NewPluginStore() plugin.Store {
-	storeMode := store.GetStoreMode()
-
-	switch storeMode {
-	case store.Database:
-		return &DatabasePluginStore{
-			pluginStoreName: store.PluginFilenameSuffix,
-		}
-
-	default:
-		store := NewFilesystemPluginStore()
-		return store
-	}
-}
diff --git a/controller/rbac/databaseRoleStore.go b/controller/rbac/databaseRoleStore.go
index a28fd8251968a2f9aeff6c90d943b15ccc13a5a5..e263690f8855a90176b25141a342ecadf1915bef 100644
--- a/controller/rbac/databaseRoleStore.go
+++ b/controller/rbac/databaseRoleStore.go
@@ -5,7 +5,7 @@ import (
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -22,7 +22,7 @@ type DatabaseRoleStore struct {
 
 // Add adds a Role.
 func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -31,7 +31,7 @@ func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.roleStoreName).
 		InsertOne(ctx, roleToAdd)
 	if err != nil {
@@ -47,7 +47,7 @@ func (s *DatabaseRoleStore) Add(roleToAdd rbac.Role) (err error) {
 
 // Delete deletes a Role.
 func (s *DatabaseRoleStore) Delete(roleToDelete rbac.Role) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -56,7 +56,7 @@ func (s *DatabaseRoleStore) Delete(roleToDelete rbac.Role) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.roleStoreName).
 		DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: roleToDelete.ID().String()}})
 	if err != nil {
@@ -89,7 +89,7 @@ func (s *DatabaseRoleStore) Get(query store.Query) (rbac.LoadedRole, error) {
 }
 
 func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedRole, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -98,7 +98,7 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedR
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.roleStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRole.String()}})
 	if result == nil {
@@ -115,7 +115,7 @@ func (s *DatabaseRoleStore) getByID(idOfRole uuid.UUID) (loadedRole rbac.LoadedR
 }
 
 func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.LoadedRole, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -124,7 +124,7 @@ func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.Loaded
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.roleStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "rolename", Value: nameOfRole}})
 	if result == nil {
@@ -142,7 +142,7 @@ func (s *DatabaseRoleStore) getByName(nameOfRole string) (loadedRole rbac.Loaded
 
 // GetAll returns all Roles.
 func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -151,7 +151,7 @@ func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error)
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.roleStoreName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -178,7 +178,7 @@ func (s *DatabaseRoleStore) GetAll() (loadedRoles []rbac.LoadedRole, err error)
 func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) {
 	var updatedLoadedRole rbac.LoadedRole
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -195,7 +195,7 @@ func (s *DatabaseRoleStore) Update(roleToUpdate rbac.Role) (err error) {
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(mongodb.DatabaseName).
 		Collection(s.roleStoreName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": roleToUpdate.ID().String()}, update, &opt).
diff --git a/controller/rbac/databaseUserStore.go b/controller/rbac/databaseUserStore.go
index 42451c64674a3def7a936513b33a6169a4bd5f5a..0788697f67a0553d571af3780e8a06c1429db880 100644
--- a/controller/rbac/databaseUserStore.go
+++ b/controller/rbac/databaseUserStore.go
@@ -5,7 +5,7 @@ import (
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -23,7 +23,7 @@ type DatabaseUserStore struct {
 
 // Add adds an User.
 func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -32,7 +32,7 @@ func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.userStoreName).
 		InsertOne(ctx, userToAdd)
 	if err != nil {
@@ -48,7 +48,7 @@ func (s *DatabaseUserStore) Add(userToAdd rbac.User) (err error) {
 
 // Delete deletes an User.
 func (s *DatabaseUserStore) Delete(userToDelete rbac.User) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -57,7 +57,7 @@ func (s *DatabaseUserStore) Delete(userToDelete rbac.User) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.userStoreName).
 		DeleteOne(ctx, bson.D{primitive.E{Key: "_id", Value: userToDelete.ID().String()}})
 	if err != nil {
@@ -90,7 +90,7 @@ func (s *DatabaseUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
 }
 
 func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedUser, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -99,7 +99,7 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedU
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.userStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfUser.String()}})
 	if result == nil {
@@ -116,7 +116,7 @@ func (s *DatabaseUserStore) getByID(idOfUser uuid.UUID) (loadedUser rbac.LoadedU
 }
 
 func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.LoadedUser, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -125,7 +125,7 @@ func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.Loaded
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.userStoreName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "username", Value: nameOfUser}})
 	if result == nil {
@@ -143,7 +143,7 @@ func (s *DatabaseUserStore) getByName(nameOfUser string) (loadedUser rbac.Loaded
 
 // GetAll returns all Users.
 func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -152,7 +152,7 @@ func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error)
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.userStoreName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -179,7 +179,7 @@ func (s *DatabaseUserStore) GetAll() (loadedUsers []rbac.LoadedUser, err error)
 func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) {
 	var updatedLoadedUser rbac.LoadedUser
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -191,7 +191,7 @@ func (s *DatabaseUserStore) Update(userToUpdate rbac.User) (err error) {
 	// 1. Start Transaction
 	wcMajority := writeconcern.Majority()
 	wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority)
-	userCollection := client.Database(database.DatabaseName).Collection(s.userStoreName, wcMajorityCollectionOpts)
+	userCollection := client.Database(mongodb.DatabaseName).Collection(s.userStoreName, wcMajorityCollectionOpts)
 
 	session, err := client.StartSession()
 	if err != nil {
diff --git a/controller/topology/nodes/nodeStore.go b/controller/topology/nodes/nodeStore.go
index f6f637e940bf257b7504886f068f0d7c297d94ab..7f53f179282b0969a5025e56e8faff0e1820cf52 100644
--- a/controller/topology/nodes/nodeStore.go
+++ b/controller/topology/nodes/nodeStore.go
@@ -5,7 +5,7 @@ import (
 	"time"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	query "code.fbi.h-da.de/danet/gosdn/controller/store"
 
 	"github.com/google/uuid"
@@ -59,7 +59,7 @@ func (s *DatabaseNodeStore) Get(query query.Query) (Node, error) {
 }
 
 func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -70,7 +70,7 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err er
 
 	idAsByteArray, _ := idOfNode.MarshalBinary()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idAsByteArray}})
 	if result == nil {
@@ -86,7 +86,7 @@ func (s *DatabaseNodeStore) getByID(idOfNode uuid.UUID) (loadedNode Node, err er
 }
 
 func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -95,7 +95,7 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err e
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfNode}})
 	if result == nil {
@@ -112,7 +112,7 @@ func (s *DatabaseNodeStore) getByName(nameOfNode string) (loadedNode Node, err e
 
 // GetAll returns all stored nodes.
 func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -120,7 +120,7 @@ func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) {
 			err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString)
 		}
 	}()
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -144,7 +144,7 @@ func (s *DatabaseNodeStore) GetAll() (loadedNode []Node, err error) {
 
 // Add adds a node to the node store.
 func (s *DatabaseNodeStore) Add(node Node) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -157,7 +157,7 @@ func (s *DatabaseNodeStore) Add(node Node) (err error) {
 	node.Metadata.CreatedAt = time.Now()
 	node.Metadata.LastUpdated = time.Now()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, node)
 	if err != nil {
@@ -171,7 +171,7 @@ func (s *DatabaseNodeStore) Add(node Node) (err error) {
 func (s *DatabaseNodeStore) Update(node Node) (err error) {
 	var updatedLoadedNodes Node
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -183,7 +183,7 @@ func (s *DatabaseNodeStore) Update(node Node) (err error) {
 	// 1. Start Transaction
 	wcMajority := writeconcern.Majority()
 	wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority)
-	nodeCollection := client.Database(database.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts)
+	nodeCollection := client.Database(mongodb.DatabaseName).Collection(s.storeName, wcMajorityCollectionOpts)
 
 	session, err := client.StartSession()
 	if err != nil {
@@ -244,7 +244,7 @@ func (s *DatabaseNodeStore) Update(node Node) (err error) {
 
 // Delete deletes a node from the node store.
 func (s *DatabaseNodeStore) Delete(node Node) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -253,7 +253,7 @@ func (s *DatabaseNodeStore) Delete(node Node) (err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: node.ID.String()}})
 	if err != nil {
diff --git a/controller/topology/ports/portStore.go b/controller/topology/ports/portStore.go
index 024c0f9114f2d2c297a433df163f8b00d97b22e6..cadda73fce3f2e4127db7e983803ae2583831ca6 100644
--- a/controller/topology/ports/portStore.go
+++ b/controller/topology/ports/portStore.go
@@ -5,7 +5,7 @@ import (
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	query "code.fbi.h-da.de/danet/gosdn/controller/store"
 
 	"github.com/google/uuid"
@@ -57,7 +57,7 @@ func (s *DatabasePortStore) Get(query query.Query) (Port, error) {
 }
 
 func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -68,7 +68,7 @@ func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err er
 
 	idAsByteArray, _ := idOfPort.MarshalBinary()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idAsByteArray}})
 	if result == nil {
@@ -84,7 +84,7 @@ func (s *DatabasePortStore) getByID(idOfPort uuid.UUID) (loadedPort Port, err er
 }
 
 func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -93,7 +93,7 @@ func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err e
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfPort}})
 	if result == nil {
@@ -110,7 +110,7 @@ func (s *DatabasePortStore) getByName(nameOfPort string) (loadedPort Port, err e
 
 // GetAll returns all stored ports.
 func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -119,7 +119,7 @@ func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -143,7 +143,7 @@ func (s *DatabasePortStore) GetAll() (loadedPorts []Port, err error) {
 
 // Add adds a port to the port store.
 func (s *DatabasePortStore) Add(port Port) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -152,7 +152,7 @@ func (s *DatabasePortStore) Add(port Port) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, port)
 	if err != nil {
@@ -166,7 +166,7 @@ func (s *DatabasePortStore) Add(port Port) (err error) {
 func (s *DatabasePortStore) Update(port Port) (err error) {
 	var updatedLoadedNetworkElement networkelement.LoadedNetworkElement
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -184,7 +184,7 @@ func (s *DatabasePortStore) Update(port Port) (err error) {
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": port.ID.String()}, update, &opt).
@@ -198,7 +198,7 @@ func (s *DatabasePortStore) Update(port Port) (err error) {
 
 // Delete deletes a port from the port store.
 func (s *DatabasePortStore) Delete(port Port) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -207,7 +207,7 @@ func (s *DatabasePortStore) Delete(port Port) (err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: port.ID.String()}})
 	if err != nil {
diff --git a/controller/topology/routing-tables/routingTableStore.go b/controller/topology/routing-tables/routingTableStore.go
index 1c70c68a1d2965f5daa6877cf7056854fbfecc93..ca80c52d0d181c7b662cf5f6ecc1684b304e91d5 100644
--- a/controller/topology/routing-tables/routingTableStore.go
+++ b/controller/topology/routing-tables/routingTableStore.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	query "code.fbi.h-da.de/danet/gosdn/controller/store"
 
 	"github.com/google/uuid"
@@ -56,7 +56,7 @@ func (s *DatabaseRoutingTableStore) Get(query query.Query) (RoutingTable, error)
 }
 
 func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routingTable RoutingTable, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -65,7 +65,7 @@ func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routing
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfRoutingTable.String()}})
 	if result == nil {
@@ -81,7 +81,7 @@ func (s *DatabaseRoutingTableStore) getByID(idOfRoutingTable uuid.UUID) (routing
 }
 
 func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loadedRoutingTable RoutingTable, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -90,7 +90,7 @@ func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loaded
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfRoutingTable}})
 	if result == nil {
@@ -107,7 +107,7 @@ func (s *DatabaseRoutingTableStore) getByName(nameOfRoutingTable string) (loaded
 
 // GetAll returns all stored routingTables.
 func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -116,7 +116,7 @@ func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable,
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -140,7 +140,7 @@ func (s *DatabaseRoutingTableStore) GetAll() (loadedRoutingTable []RoutingTable,
 
 // Add adds a RoutingTable to the store.
 func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -149,7 +149,7 @@ func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, routingTable)
 	if err != nil {
@@ -163,7 +163,7 @@ func (s *DatabaseRoutingTableStore) Add(routingTable RoutingTable) (err error) {
 func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error) {
 	var updatedLoadedRoutingTable RoutingTable
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -181,7 +181,7 @@ func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": routingTable.ID.String()}, update, &opt).
@@ -195,7 +195,7 @@ func (s *DatabaseRoutingTableStore) Update(routingTable RoutingTable) (err error
 
 // Delete deletes a node from the node store.
 func (s *DatabaseRoutingTableStore) Delete(routingTable RoutingTable) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -204,7 +204,7 @@ func (s *DatabaseRoutingTableStore) Delete(routingTable RoutingTable) (err error
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: routingTable.ID.String()}})
 	if err != nil {
diff --git a/controller/topology/topologyStore.go b/controller/topology/topologyStore.go
index e8118388eb96b6ce504e29b3cb942c9a18d861b1..375f85226b8956a7b7bb0aaf7bfd5a7e755489be 100644
--- a/controller/topology/topologyStore.go
+++ b/controller/topology/topologyStore.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/database"
+	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/pkg/persistence/mongodb"
 	query "code.fbi.h-da.de/danet/gosdn/controller/store"
 	"code.fbi.h-da.de/danet/gosdn/controller/topology/links"
 
@@ -57,7 +57,7 @@ func (s *DatabaseTopologyStore) Get(query query.Query) (links.Link, error) {
 }
 
 func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology links.Link, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -66,7 +66,7 @@ func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfTopology.String()}})
 	if result == nil {
@@ -82,7 +82,7 @@ func (s *DatabaseTopologyStore) getByID(idOfTopology uuid.UUID) (loadedTopology
 }
 
 func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology links.Link, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -91,7 +91,7 @@ func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfTopology}})
 	if result == nil {
@@ -108,7 +108,7 @@ func (s *DatabaseTopologyStore) getByName(nameOfTopology string) (loadedTopology
 
 // GetAll returns all stored links.
 func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -117,7 +117,7 @@ func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 
 	cursor, err := collection.Find(ctx, bson.D{})
@@ -141,7 +141,7 @@ func (s *DatabaseTopologyStore) GetAll() (loadedTopology []links.Link, err error
 
 // Add adds a link to the link store.
 func (s *DatabaseTopologyStore) Add(link links.Link) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -150,7 +150,7 @@ func (s *DatabaseTopologyStore) Add(link links.Link) (err error) {
 		}
 	}()
 
-	_, err = client.Database(database.DatabaseName).
+	_, err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		InsertOne(ctx, link)
 	if err != nil {
@@ -164,7 +164,7 @@ func (s *DatabaseTopologyStore) Add(link links.Link) (err error) {
 func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) {
 	var updatedLink links.Link
 
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -182,7 +182,7 @@ func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) {
 		ReturnDocument: &after,
 	}
 
-	err = client.Database(database.DatabaseName).
+	err = client.Database(mongodb.DatabaseName).
 		Collection(s.storeName).
 		FindOneAndUpdate(
 			ctx, bson.M{"_id": linkToUpdate.ID.String()}, update, &opt).
@@ -196,7 +196,7 @@ func (s *DatabaseTopologyStore) Update(linkToUpdate links.Link) (err error) {
 
 // Delete deletes a link from the link store.
 func (s *DatabaseTopologyStore) Delete(linkToDelete links.Link) (err error) {
-	client, ctx, cancel := database.GetMongoConnection()
+	client, ctx, cancel := mongodb.GetMongoConnection()
 	defer cancel()
 	defer func() {
 		if ferr := client.Disconnect(ctx); ferr != nil {
@@ -205,7 +205,7 @@ func (s *DatabaseTopologyStore) Delete(linkToDelete links.Link) (err error) {
 		}
 	}()
 
-	db := client.Database(database.DatabaseName)
+	db := client.Database(mongodb.DatabaseName)
 	collection := db.Collection(s.storeName)
 	_, err = collection.DeleteOne(ctx, bson.D{primitive.E{Key: linkToDelete.ID.String()}})
 	if err != nil {
diff --git a/go.mod b/go.mod
index b475b85312810ea1929543cdce529afa19172b9b..9ebfce26f96b34d51efd0b09fe11b16a0cf04b91 100644
--- a/go.mod
+++ b/go.mod
@@ -89,12 +89,12 @@ require (
 )
 
 require (
-	buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1
-	github.com/bufbuild/protovalidate-go v0.3.1
+	buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1
+	github.com/bufbuild/protovalidate-go v0.3.2
 	github.com/hashicorp/go-multierror v1.1.1
 	github.com/hashicorp/go-plugin v1.4.10
 	github.com/lesismal/nbio v1.3.17
-	google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d
+	google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb
 )
 
 require (
@@ -104,7 +104,7 @@ require (
 	github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 // indirect
 	github.com/containerd/console v1.0.3 // indirect
 	github.com/fatih/color v1.15.0 // indirect
-	github.com/google/cel-go v0.17.4 // indirect
+	github.com/google/cel-go v0.18.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/go-hclog v1.5.0 // indirect
 	github.com/hashicorp/yamux v0.1.1 // indirect
@@ -115,6 +115,6 @@ require (
 	github.com/moby/sys/sequential v0.5.0 // indirect
 	github.com/oklog/run v1.1.0 // indirect
 	github.com/stoewer/go-strcase v1.3.0 // indirect
-	golang.org/x/exp v0.0.0-20230809094429-853ea248256d // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
+	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect
 )
diff --git a/go.sum b/go.sum
index f6e3b67641a92a8ee1bb6acc2641c9a472c3a600..4107f8fb753ac847dc750e12c5e70d86737ad7ca 100644
--- a/go.sum
+++ b/go.sum
@@ -8,10 +8,8 @@ atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs=
 atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU=
 bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
 bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1 h1:9Ea7lsYYvoyqmq79GbCy6POXHrZbC+pHs+6lGNx9IBQ=
-buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230824200731-b9b8148056b9.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
+buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1 h1:2gmp+PRca1fqQHf/WMKOgu9inVb0R0N07TucgY3QZCQ=
+buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230914171853-63dfe56cc2c4.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -150,10 +148,8 @@ github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
 github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
-github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s=
-github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA=
-github.com/bufbuild/protovalidate-go v0.3.1 h1:+jbgQXo+7SzttLbGwVClpHowXKEgwK1QG/bK4xrmUy8=
-github.com/bufbuild/protovalidate-go v0.3.1/go.mod h1:oD/fAR3ojBAunOmY3SGFJ4jhILpUtnuIalI4Id9rluY=
+github.com/bufbuild/protovalidate-go v0.3.2 h1:7sG1R83PkCzOZb3P187gAchWFLHY6LQ8aVoUw6Wp9es=
+github.com/bufbuild/protovalidate-go v0.3.2/go.mod h1:ywZqKUjMhQA8fmhsc+0DUlMfan8/umJ+5mKvjdxAD3M=
 github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
 github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
@@ -338,8 +334,6 @@ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
 github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY=
-github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE=
 github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
@@ -485,10 +479,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/cel-go v0.17.1 h1:s2151PDGy/eqpCI80/8dl4VL3xTkqI/YubXLXCFw0mw=
-github.com/google/cel-go v0.17.1/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
-github.com/google/cel-go v0.17.4 h1:9556LOjSyIZlgnT0oaCYGq2uk9BM6fzuTXhzYHskonk=
-github.com/google/cel-go v0.17.4/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY=
+github.com/google/cel-go v0.18.0 h1:u74MPiEC8mejBrkXqrTWT102g5IFEUjxOngzQIijMzU=
+github.com/google/cel-go v0.18.0/go.mod h1:PVAybmSnWkNMUZR/tEWFUiJ1Np4Hz0MHsZJcgC4zln4=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -555,8 +547,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
@@ -1115,8 +1105,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1129,8 +1117,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20230809094429-853ea248256d h1:wu5bD43Ana/nF1ZmaLr3lW/FQeJU8CcI+Ln7yWHViXE=
-golang.org/x/exp v0.0.0-20230809094429-853ea248256d/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1218,8 +1206,6 @@ golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
 golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -1363,8 +1349,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
@@ -1373,8 +1357,6 @@ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9sn
 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
-golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
 golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1389,8 +1371,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1557,10 +1537,10 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc
 google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 h1:Tyk/35yqszRCvaragTn5NnkY6IiKk/XvHzEWepo71N0=
 google.golang.org/genproto v0.0.0-20230807174057-1744710a1577/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
-google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q=
-google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
+google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI=
+google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
 google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -1589,8 +1569,6 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
 google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
 google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.58.0-dev h1:BggFp6joqwbgXlqFIogQr6r35o+BnzYw54An5wzoSLA=
-google.golang.org/grpc v1.58.0-dev/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
 google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o=
 google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=