diff --git a/controller/Makefile b/controller/Makefile
index d558d5c617e0f643a8510cbd1c5b4b99d3a96cc9..8d89b1bb179df60d116de3acb48fb338119df161 100644
--- a/controller/Makefile
+++ b/controller/Makefile
@@ -66,4 +66,4 @@ integration-test-api:
 	go test -race -v -run TestApiIntegration
 
 generate-mocks: install-tools
-	./$(TOOLS_DIR)/mockery --all --dir "./interfaces/"
+	./$(TOOLS_DIR)/mockery --all --dir "./nucleus/domain/"
diff --git a/controller/mocks/EventService.go b/controller/mocks/EventService.go
new file mode 100644
index 0000000000000000000000000000000000000000..509ad88478524805b7ad68785248b833c8fc96aa
--- /dev/null
+++ b/controller/mocks/EventService.go
@@ -0,0 +1,66 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	event "code.fbi.h-da.de/danet/gosdn/controller/event"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// EventService is an autogenerated mock type for the EventService type
+type EventService struct {
+	mock.Mock
+}
+
+// CloseConnection provides a mock function with given fields:
+func (_m *EventService) CloseConnection() {
+	_m.Called()
+}
+
+// PublishEvent provides a mock function with given fields: topic, _a1
+func (_m *EventService) PublishEvent(topic string, _a1 event.Event) error {
+	ret := _m.Called(topic, _a1)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(string, event.Event) error); ok {
+		r0 = rf(topic, _a1)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Reconnect provides a mock function with given fields:
+func (_m *EventService) Reconnect() {
+	_m.Called()
+}
+
+// RetryPublish provides a mock function with given fields: topic, _a1
+func (_m *EventService) RetryPublish(topic string, _a1 event.Event) error {
+	ret := _m.Called(topic, _a1)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(string, event.Event) error); ok {
+		r0 = rf(topic, _a1)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewEventService interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewEventService creates a new instance of EventService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewEventService(t mockConstructorTestingTNewEventService) *EventService {
+	mock := &EventService{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/HandleSubscribeResponse.go b/controller/mocks/HandleSubscribeResponse.go
index bdac495cb5269f065f243682253d00e9f3d54af5..5dc196b9930ff79ebf30277753826474765ee6bd 100644
--- a/controller/mocks/HandleSubscribeResponse.go
+++ b/controller/mocks/HandleSubscribeResponse.go
@@ -6,7 +6,7 @@ import (
 	gnmi "github.com/openconfig/gnmi/proto/gnmi"
 	mock "github.com/stretchr/testify/mock"
 
-	transport "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 )
 
 // HandleSubscribeResponse is an autogenerated mock type for the HandleSubscribeResponse type
@@ -15,7 +15,7 @@ type HandleSubscribeResponse struct {
 }
 
 // Execute provides a mock function with given fields: _a0, _a1
-func (_m *HandleSubscribeResponse) Execute(_a0 *gnmi.SubscribeResponse, _a1 *transport.SubscriptionInformation) {
+func (_m *HandleSubscribeResponse) Execute(_a0 *gnmi.SubscribeResponse, _a1 *model.SubscriptionInformation) {
 	_m.Called(_a0, _a1)
 }
 
diff --git a/controller/mocks/NetworkElement.go b/controller/mocks/NetworkElement.go
index a8ccd7fba27dd568e5bbbb93eeda0b954f04f918..f93d929597fd9869f0461fcb9ee7dbf4646e5024 100644
--- a/controller/mocks/NetworkElement.go
+++ b/controller/mocks/NetworkElement.go
@@ -6,12 +6,10 @@ import (
 	conflict "code.fbi.h-da.de/danet/gosdn/controller/conflict"
 	mock "github.com/stretchr/testify/mock"
 
-	plugin "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 
-	transport "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
-
 	uuid "github.com/google/uuid"
 )
 
@@ -111,15 +109,15 @@ func (_m *NetworkElement) GetModelAsString() (string, error) {
 }
 
 // GetPlugin provides a mock function with given fields:
-func (_m *NetworkElement) GetPlugin() plugin.Plugin {
+func (_m *NetworkElement) GetPlugin() model.PluginIface {
 	ret := _m.Called()
 
-	var r0 plugin.Plugin
-	if rf, ok := ret.Get(0).(func() plugin.Plugin); ok {
+	var r0 model.PluginIface
+	if rf, ok := ret.Get(0).(func() model.PluginIface); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(plugin.Plugin)
+			r0 = ret.Get(0).(model.PluginIface)
 		}
 	}
 
@@ -201,15 +199,15 @@ func (_m *NetworkElement) ProcessResponse(_a0 protoreflect.ProtoMessage) error {
 }
 
 // Transport provides a mock function with given fields:
-func (_m *NetworkElement) Transport() transport.Transport {
+func (_m *NetworkElement) Transport() model.Transport {
 	ret := _m.Called()
 
-	var r0 transport.Transport
-	if rf, ok := ret.Get(0).(func() transport.Transport); ok {
+	var r0 model.Transport
+	if rf, ok := ret.Get(0).(func() model.Transport); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(transport.Transport)
+			r0 = ret.Get(0).(model.Transport)
 		}
 	}
 
diff --git a/controller/mocks/NetworkElementService.go b/controller/mocks/NetworkElementService.go
new file mode 100644
index 0000000000000000000000000000000000000000..54f3809fcd7e4474bbc1bea2122760cd4a957eef
--- /dev/null
+++ b/controller/mocks/NetworkElementService.go
@@ -0,0 +1,164 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+)
+
+// NetworkElementService is an autogenerated mock type for the NetworkElementService type
+type NetworkElementService struct {
+	mock.Mock
+}
+
+// Add provides a mock function with given fields: _a0
+func (_m *NetworkElementService) Add(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Delete provides a mock function with given fields: _a0
+func (_m *NetworkElementService) Delete(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Get provides a mock function with given fields: _a0
+func (_m *NetworkElementService) Get(_a0 model.Query) (model.NetworkElement, error) {
+	ret := _m.Called(_a0)
+
+	var r0 model.NetworkElement
+	var r1 error
+	if rf, ok := ret.Get(0).(func(model.Query) (model.NetworkElement, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(model.Query) model.NetworkElement); ok {
+		r0 = rf(_a0)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(model.NetworkElement)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAll provides a mock function with given fields:
+func (_m *NetworkElementService) GetAll() ([]model.NetworkElement, error) {
+	ret := _m.Called()
+
+	var r0 []model.NetworkElement
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]model.NetworkElement, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []model.NetworkElement); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]model.NetworkElement)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAllAsLoaded provides a mock function with given fields:
+func (_m *NetworkElementService) GetAllAsLoaded() ([]model.LoadedNetworkElement, error) {
+	ret := _m.Called()
+
+	var r0 []model.LoadedNetworkElement
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]model.LoadedNetworkElement, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []model.LoadedNetworkElement); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]model.LoadedNetworkElement)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Update provides a mock function with given fields: _a0
+func (_m *NetworkElementService) Update(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// UpdateModel provides a mock function with given fields: _a0, _a1
+func (_m *NetworkElementService) UpdateModel(_a0 uuid.UUID, _a1 string) error {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(uuid.UUID, string) error); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewNetworkElementService interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewNetworkElementService creates a new instance of NetworkElementService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewNetworkElementService(t mockConstructorTestingTNewNetworkElementService) *NetworkElementService {
+	mock := &NetworkElementService{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/NetworkElementStore.go b/controller/mocks/NetworkElementStore.go
new file mode 100644
index 0000000000000000000000000000000000000000..a3dd9fde3835ebbad355b250938263f60bc6b756
--- /dev/null
+++ b/controller/mocks/NetworkElementStore.go
@@ -0,0 +1,120 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// NetworkElementStore is an autogenerated mock type for the NetworkElementStore type
+type NetworkElementStore struct {
+	mock.Mock
+}
+
+// Add provides a mock function with given fields: _a0
+func (_m *NetworkElementStore) Add(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Delete provides a mock function with given fields: _a0
+func (_m *NetworkElementStore) Delete(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Get provides a mock function with given fields: _a0
+func (_m *NetworkElementStore) Get(_a0 model.Query) (model.LoadedNetworkElement, error) {
+	ret := _m.Called(_a0)
+
+	var r0 model.LoadedNetworkElement
+	var r1 error
+	if rf, ok := ret.Get(0).(func(model.Query) (model.LoadedNetworkElement, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(model.Query) model.LoadedNetworkElement); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Get(0).(model.LoadedNetworkElement)
+	}
+
+	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAll provides a mock function with given fields:
+func (_m *NetworkElementStore) GetAll() ([]model.LoadedNetworkElement, error) {
+	ret := _m.Called()
+
+	var r0 []model.LoadedNetworkElement
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]model.LoadedNetworkElement, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []model.LoadedNetworkElement); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]model.LoadedNetworkElement)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Update provides a mock function with given fields: _a0
+func (_m *NetworkElementStore) Update(_a0 model.NetworkElement) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(model.NetworkElement) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewNetworkElementStore interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewNetworkElementStore creates a new instance of NetworkElementStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewNetworkElementStore(t mockConstructorTestingTNewNetworkElementStore) *NetworkElementStore {
+	mock := &NetworkElementStore{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/Plugin.go b/controller/mocks/PluginIface.go
similarity index 75%
rename from controller/mocks/Plugin.go
rename to controller/mocks/PluginIface.go
index 9af1bf4b7fdd6d3d10638d114607774656129649..6f0f0cbfed0e3f16685aa672e6e288d23d4b1c3d 100644
--- a/controller/mocks/Plugin.go
+++ b/controller/mocks/PluginIface.go
@@ -3,30 +3,30 @@
 package mocks
 
 import (
-	go_plugin "github.com/hashicorp/go-plugin"
 	gnmi "github.com/openconfig/gnmi/proto/gnmi"
-
 	mock "github.com/stretchr/testify/mock"
 
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+
 	networkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 
-	plugin "code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
+	plugin "github.com/hashicorp/go-plugin"
 
 	uuid "github.com/google/uuid"
 )
 
-// Plugin is an autogenerated mock type for the Plugin type
-type Plugin struct {
+// PluginIface is an autogenerated mock type for the PluginIface type
+type PluginIface struct {
 	mock.Mock
 }
 
 // Close provides a mock function with given fields:
-func (_m *Plugin) Close() {
+func (_m *PluginIface) Close() {
 	_m.Called()
 }
 
 // DeleteNode provides a mock function with given fields: path
-func (_m *Plugin) DeleteNode(path *gnmi.Path) error {
+func (_m *PluginIface) DeleteNode(path *gnmi.Path) error {
 	ret := _m.Called(path)
 
 	var r0 error
@@ -40,7 +40,7 @@ func (_m *Plugin) DeleteNode(path *gnmi.Path) error {
 }
 
 // Diff provides a mock function with given fields: original, modified
-func (_m *Plugin) Diff(original []byte, modified []byte) (*gnmi.Notification, error) {
+func (_m *PluginIface) Diff(original []byte, modified []byte) (*gnmi.Notification, error) {
 	ret := _m.Called(original, modified)
 
 	var r0 *gnmi.Notification
@@ -66,7 +66,7 @@ func (_m *Plugin) Diff(original []byte, modified []byte) (*gnmi.Notification, er
 }
 
 // ExecPath provides a mock function with given fields:
-func (_m *Plugin) ExecPath() string {
+func (_m *PluginIface) ExecPath() string {
 	ret := _m.Called()
 
 	var r0 string
@@ -80,15 +80,15 @@ func (_m *Plugin) ExecPath() string {
 }
 
 // GetClient provides a mock function with given fields:
-func (_m *Plugin) GetClient() *go_plugin.Client {
+func (_m *PluginIface) GetClient() *plugin.Client {
 	ret := _m.Called()
 
-	var r0 *go_plugin.Client
-	if rf, ok := ret.Get(0).(func() *go_plugin.Client); ok {
+	var r0 *plugin.Client
+	if rf, ok := ret.Get(0).(func() *plugin.Client); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*go_plugin.Client)
+			r0 = ret.Get(0).(*plugin.Client)
 		}
 	}
 
@@ -96,7 +96,7 @@ func (_m *Plugin) GetClient() *go_plugin.Client {
 }
 
 // GetNode provides a mock function with given fields: path, requestForIntendedState
-func (_m *Plugin) GetNode(path *gnmi.Path, requestForIntendedState bool) ([]*gnmi.Notification, error) {
+func (_m *PluginIface) GetNode(path *gnmi.Path, requestForIntendedState bool) ([]*gnmi.Notification, error) {
 	ret := _m.Called(path, requestForIntendedState)
 
 	var r0 []*gnmi.Notification
@@ -122,7 +122,7 @@ func (_m *Plugin) GetNode(path *gnmi.Path, requestForIntendedState bool) ([]*gnm
 }
 
 // ID provides a mock function with given fields:
-func (_m *Plugin) ID() uuid.UUID {
+func (_m *PluginIface) ID() uuid.UUID {
 	ret := _m.Called()
 
 	var r0 uuid.UUID
@@ -138,15 +138,15 @@ func (_m *Plugin) ID() uuid.UUID {
 }
 
 // Manifest provides a mock function with given fields:
-func (_m *Plugin) Manifest() *plugin.Manifest {
+func (_m *PluginIface) Manifest() *model.Manifest {
 	ret := _m.Called()
 
-	var r0 *plugin.Manifest
-	if rf, ok := ret.Get(0).(func() *plugin.Manifest); ok {
+	var r0 *model.Manifest
+	if rf, ok := ret.Get(0).(func() *model.Manifest); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*plugin.Manifest)
+			r0 = ret.Get(0).(*model.Manifest)
 		}
 	}
 
@@ -154,7 +154,7 @@ func (_m *Plugin) Manifest() *plugin.Manifest {
 }
 
 // Model provides a mock function with given fields: filterReadOnly
-func (_m *Plugin) Model(filterReadOnly bool) ([]byte, error) {
+func (_m *PluginIface) Model(filterReadOnly bool) ([]byte, error) {
 	ret := _m.Called(filterReadOnly)
 
 	var r0 []byte
@@ -180,7 +180,7 @@ func (_m *Plugin) Model(filterReadOnly bool) ([]byte, error) {
 }
 
 // Ping provides a mock function with given fields:
-func (_m *Plugin) Ping() error {
+func (_m *PluginIface) Ping() error {
 	ret := _m.Called()
 
 	var r0 error
@@ -194,7 +194,7 @@ func (_m *Plugin) Ping() error {
 }
 
 // PruneConfigFalse provides a mock function with given fields: value
-func (_m *Plugin) PruneConfigFalse(value []byte) ([]byte, error) {
+func (_m *PluginIface) PruneConfigFalse(value []byte) ([]byte, error) {
 	ret := _m.Called(value)
 
 	var r0 []byte
@@ -220,7 +220,7 @@ func (_m *Plugin) PruneConfigFalse(value []byte) ([]byte, error) {
 }
 
 // Restart provides a mock function with given fields:
-func (_m *Plugin) Restart() error {
+func (_m *PluginIface) Restart() error {
 	ret := _m.Called()
 
 	var r0 error
@@ -234,7 +234,7 @@ func (_m *Plugin) Restart() error {
 }
 
 // SchemaTreeGzip provides a mock function with given fields:
-func (_m *Plugin) SchemaTreeGzip() ([]byte, error) {
+func (_m *PluginIface) SchemaTreeGzip() ([]byte, error) {
 	ret := _m.Called()
 
 	var r0 []byte
@@ -260,7 +260,7 @@ func (_m *Plugin) SchemaTreeGzip() ([]byte, error) {
 }
 
 // SetNode provides a mock function with given fields: path, value
-func (_m *Plugin) SetNode(path *gnmi.Path, value *gnmi.TypedValue) error {
+func (_m *PluginIface) SetNode(path *gnmi.Path, value *gnmi.TypedValue) error {
 	ret := _m.Called(path, value)
 
 	var r0 error
@@ -274,21 +274,21 @@ func (_m *Plugin) SetNode(path *gnmi.Path, value *gnmi.TypedValue) error {
 }
 
 // State provides a mock function with given fields:
-func (_m *Plugin) State() plugin.State {
+func (_m *PluginIface) State() model.State {
 	ret := _m.Called()
 
-	var r0 plugin.State
-	if rf, ok := ret.Get(0).(func() plugin.State); ok {
+	var r0 model.State
+	if rf, ok := ret.Get(0).(func() model.State); ok {
 		r0 = rf()
 	} else {
-		r0 = ret.Get(0).(plugin.State)
+		r0 = ret.Get(0).(model.State)
 	}
 
 	return r0
 }
 
 // Unmarshal provides a mock function with given fields: json, path
-func (_m *Plugin) Unmarshal(json []byte, path *gnmi.Path) error {
+func (_m *PluginIface) Unmarshal(json []byte, path *gnmi.Path) error {
 	ret := _m.Called(json, path)
 
 	var r0 error
@@ -302,7 +302,7 @@ func (_m *Plugin) Unmarshal(json []byte, path *gnmi.Path) error {
 }
 
 // Update provides a mock function with given fields:
-func (_m *Plugin) Update() error {
+func (_m *PluginIface) Update() error {
 	ret := _m.Called()
 
 	var r0 error
@@ -316,7 +316,7 @@ func (_m *Plugin) Update() error {
 }
 
 // ValidateChange provides a mock function with given fields: operation, path, value
-func (_m *Plugin) ValidateChange(operation networkelement.ApiOperation, path *gnmi.Path, value *gnmi.TypedValue) ([]byte, error) {
+func (_m *PluginIface) ValidateChange(operation networkelement.ApiOperation, path *gnmi.Path, value *gnmi.TypedValue) ([]byte, error) {
 	ret := _m.Called(operation, path, value)
 
 	var r0 []byte
@@ -341,14 +341,14 @@ func (_m *Plugin) ValidateChange(operation networkelement.ApiOperation, path *gn
 	return r0, r1
 }
 
-type mockConstructorTestingTNewPlugin interface {
+type mockConstructorTestingTNewPluginIface interface {
 	mock.TestingT
 	Cleanup(func())
 }
 
-// NewPlugin creates a new instance of Plugin. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewPlugin(t mockConstructorTestingTNewPlugin) *Plugin {
-	mock := &Plugin{}
+// NewPluginIface creates a new instance of PluginIface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewPluginIface(t mockConstructorTestingTNewPluginIface) *PluginIface {
+	mock := &PluginIface{}
 	mock.Mock.Test(t)
 
 	t.Cleanup(func() { mock.AssertExpectations(t) })
diff --git a/controller/mocks/PluginService.go b/controller/mocks/PluginService.go
new file mode 100644
index 0000000000000000000000000000000000000000..a71694b33411c0eca018d7a1202b645ac4709dce
--- /dev/null
+++ b/controller/mocks/PluginService.go
@@ -0,0 +1,136 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+)
+
+// PluginService is an autogenerated mock type for the PluginService type
+type PluginService struct {
+	mock.Mock
+}
+
+// Add provides a mock function with given fields: _a0
+func (_m *PluginService) Add(_a0 *model.Plugin) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*model.Plugin) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Delete provides a mock function with given fields: _a0
+func (_m *PluginService) Delete(_a0 *model.Plugin) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*model.Plugin) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Get provides a mock function with given fields: _a0
+func (_m *PluginService) Get(_a0 model.Query) (*model.Plugin, error) {
+	ret := _m.Called(_a0)
+
+	var r0 *model.Plugin
+	var r1 error
+	if rf, ok := ret.Get(0).(func(model.Query) (*model.Plugin, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(model.Query) *model.Plugin); ok {
+		r0 = rf(_a0)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*model.Plugin)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAll provides a mock function with given fields:
+func (_m *PluginService) GetAll() ([]*model.Plugin, error) {
+	ret := _m.Called()
+
+	var r0 []*model.Plugin
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]*model.Plugin, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []*model.Plugin); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*model.Plugin)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// RequestPlugin provides a mock function with given fields: _a0
+func (_m *PluginService) RequestPlugin(_a0 uuid.UUID) (*model.Plugin, error) {
+	ret := _m.Called(_a0)
+
+	var r0 *model.Plugin
+	var r1 error
+	if rf, ok := ret.Get(0).(func(uuid.UUID) (*model.Plugin, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(uuid.UUID) *model.Plugin); ok {
+		r0 = rf(_a0)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*model.Plugin)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(uuid.UUID) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+type mockConstructorTestingTNewPluginService interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewPluginService creates a new instance of PluginService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewPluginService(t mockConstructorTestingTNewPluginService) *PluginService {
+	mock := &PluginService{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/PluginStore.go b/controller/mocks/PluginStore.go
new file mode 100644
index 0000000000000000000000000000000000000000..b5fdb9e5999a2b35ff99d2a861299e674d23ec68
--- /dev/null
+++ b/controller/mocks/PluginStore.go
@@ -0,0 +1,120 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// PluginStore is an autogenerated mock type for the PluginStore type
+type PluginStore struct {
+	mock.Mock
+}
+
+// Add provides a mock function with given fields: _a0
+func (_m *PluginStore) Add(_a0 *model.Plugin) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*model.Plugin) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Delete provides a mock function with given fields: _a0
+func (_m *PluginStore) Delete(_a0 *model.Plugin) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*model.Plugin) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Get provides a mock function with given fields: _a0
+func (_m *PluginStore) Get(_a0 model.Query) (model.LoadedPlugin, error) {
+	ret := _m.Called(_a0)
+
+	var r0 model.LoadedPlugin
+	var r1 error
+	if rf, ok := ret.Get(0).(func(model.Query) (model.LoadedPlugin, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(model.Query) model.LoadedPlugin); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Get(0).(model.LoadedPlugin)
+	}
+
+	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAll provides a mock function with given fields:
+func (_m *PluginStore) GetAll() ([]model.LoadedPlugin, error) {
+	ret := _m.Called()
+
+	var r0 []model.LoadedPlugin
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]model.LoadedPlugin, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []model.LoadedPlugin); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]model.LoadedPlugin)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Update provides a mock function with given fields: _a0
+func (_m *PluginStore) Update(_a0 *model.Plugin) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*model.Plugin) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewPluginStore interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewPluginStore creates a new instance of PluginStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewPluginStore(t mockConstructorTestingTNewPluginStore) *PluginStore {
+	mock := &PluginStore{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/PndService.go b/controller/mocks/PndService.go
index 03a006596dec8ae9cbe6aea4c73d0dd518a5dc19..4ef02ff30b7beb83912cfa1b1e87245377eb9693 100644
--- a/controller/mocks/PndService.go
+++ b/controller/mocks/PndService.go
@@ -1,10 +1,9 @@
-// Code generated by mockery v2.14.0. DO NOT EDIT.
+// Code generated by mockery v2.20.0. DO NOT EDIT.
 
 package mocks
 
 import (
-	networkdomain "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 )
 
@@ -14,11 +13,11 @@ type PndService struct {
 }
 
 // Add provides a mock function with given fields: _a0
-func (_m *PndService) Add(_a0 networkdomain.NetworkDomain) error {
+func (_m *PndService) Add(_a0 model.NetworkDomain) error {
 	ret := _m.Called(_a0)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok {
+	if rf, ok := ret.Get(0).(func(model.NetworkDomain) error); ok {
 		r0 = rf(_a0)
 	} else {
 		r0 = ret.Error(0)
@@ -28,11 +27,11 @@ func (_m *PndService) Add(_a0 networkdomain.NetworkDomain) error {
 }
 
 // Delete provides a mock function with given fields: _a0
-func (_m *PndService) Delete(_a0 networkdomain.NetworkDomain) error {
+func (_m *PndService) Delete(_a0 model.NetworkDomain) error {
 	ret := _m.Called(_a0)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok {
+	if rf, ok := ret.Get(0).(func(model.NetworkDomain) error); ok {
 		r0 = rf(_a0)
 	} else {
 		r0 = ret.Error(0)
@@ -42,19 +41,22 @@ func (_m *PndService) Delete(_a0 networkdomain.NetworkDomain) error {
 }
 
 // Get provides a mock function with given fields: _a0
-func (_m *PndService) Get(_a0 model.Query) (networkdomain.NetworkDomain, error) {
+func (_m *PndService) Get(_a0 model.Query) (model.NetworkDomain, error) {
 	ret := _m.Called(_a0)
 
-	var r0 networkdomain.NetworkDomain
-	if rf, ok := ret.Get(0).(func(model.Query) networkdomain.NetworkDomain); ok {
+	var r0 model.NetworkDomain
+	var r1 error
+	if rf, ok := ret.Get(0).(func(model.Query) (model.NetworkDomain, error)); ok {
+		return rf(_a0)
+	}
+	if rf, ok := ret.Get(0).(func(model.Query) model.NetworkDomain); ok {
 		r0 = rf(_a0)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(networkdomain.NetworkDomain)
+			r0 = ret.Get(0).(model.NetworkDomain)
 		}
 	}
 
-	var r1 error
 	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
 		r1 = rf(_a0)
 	} else {
@@ -65,19 +67,22 @@ func (_m *PndService) Get(_a0 model.Query) (networkdomain.NetworkDomain, error)
 }
 
 // GetAll provides a mock function with given fields:
-func (_m *PndService) GetAll() ([]networkdomain.NetworkDomain, error) {
+func (_m *PndService) GetAll() ([]model.NetworkDomain, error) {
 	ret := _m.Called()
 
-	var r0 []networkdomain.NetworkDomain
-	if rf, ok := ret.Get(0).(func() []networkdomain.NetworkDomain); ok {
+	var r0 []model.NetworkDomain
+	var r1 error
+	if rf, ok := ret.Get(0).(func() ([]model.NetworkDomain, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() []model.NetworkDomain); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]networkdomain.NetworkDomain)
+			r0 = ret.Get(0).([]model.NetworkDomain)
 		}
 	}
 
-	var r1 error
 	if rf, ok := ret.Get(1).(func() error); ok {
 		r1 = rf()
 	} else {
diff --git a/controller/mocks/PndStore.go b/controller/mocks/PndStore.go
index ec35a9c7845db64a72d79187898b1afdb4229755..dd3932eb9e25576d43ee9df1733ec11a72c5c0a5 100644
--- a/controller/mocks/PndStore.go
+++ b/controller/mocks/PndStore.go
@@ -3,12 +3,9 @@
 package mocks
 
 import (
-	networkdomain "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain"
-	networkelement "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
-
 	uuid "github.com/google/uuid"
 )
 
@@ -18,11 +15,11 @@ type PndStore struct {
 }
 
 // Add provides a mock function with given fields: _a0
-func (_m *PndStore) Add(_a0 networkdomain.NetworkDomain) error {
+func (_m *PndStore) Add(_a0 model.NetworkDomain) error {
 	ret := _m.Called(_a0)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok {
+	if rf, ok := ret.Get(0).(func(model.NetworkDomain) error); ok {
 		r0 = rf(_a0)
 	} else {
 		r0 = ret.Error(0)
@@ -37,11 +34,11 @@ func (_m *PndStore) AddPendingChannel(id uuid.UUID, ch chan model.Details) {
 }
 
 // Delete provides a mock function with given fields: _a0
-func (_m *PndStore) Delete(_a0 networkdomain.NetworkDomain) error {
+func (_m *PndStore) Delete(_a0 model.NetworkDomain) error {
 	ret := _m.Called(_a0)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok {
+	if rf, ok := ret.Get(0).(func(model.NetworkDomain) error); ok {
 		r0 = rf(_a0)
 	} else {
 		r0 = ret.Error(0)
@@ -51,18 +48,18 @@ func (_m *PndStore) Delete(_a0 networkdomain.NetworkDomain) error {
 }
 
 // Get provides a mock function with given fields: _a0
-func (_m *PndStore) Get(_a0 model.Query) (networkdomain.LoadedPnd, error) {
+func (_m *PndStore) Get(_a0 model.Query) (model.LoadedPnd, error) {
 	ret := _m.Called(_a0)
 
-	var r0 networkdomain.LoadedPnd
+	var r0 model.LoadedPnd
 	var r1 error
-	if rf, ok := ret.Get(0).(func(model.Query) (networkdomain.LoadedPnd, error)); ok {
+	if rf, ok := ret.Get(0).(func(model.Query) (model.LoadedPnd, error)); ok {
 		return rf(_a0)
 	}
-	if rf, ok := ret.Get(0).(func(model.Query) networkdomain.LoadedPnd); ok {
+	if rf, ok := ret.Get(0).(func(model.Query) model.LoadedPnd); ok {
 		r0 = rf(_a0)
 	} else {
-		r0 = ret.Get(0).(networkdomain.LoadedPnd)
+		r0 = ret.Get(0).(model.LoadedPnd)
 	}
 
 	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
@@ -75,19 +72,19 @@ func (_m *PndStore) Get(_a0 model.Query) (networkdomain.LoadedPnd, error) {
 }
 
 // GetAll provides a mock function with given fields:
-func (_m *PndStore) GetAll() ([]networkdomain.LoadedPnd, error) {
+func (_m *PndStore) GetAll() ([]model.LoadedPnd, error) {
 	ret := _m.Called()
 
-	var r0 []networkdomain.LoadedPnd
+	var r0 []model.LoadedPnd
 	var r1 error
-	if rf, ok := ret.Get(0).(func() ([]networkdomain.LoadedPnd, error)); ok {
+	if rf, ok := ret.Get(0).(func() ([]model.LoadedPnd, error)); ok {
 		return rf()
 	}
-	if rf, ok := ret.Get(0).(func() []networkdomain.LoadedPnd); ok {
+	if rf, ok := ret.Get(0).(func() []model.LoadedPnd); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]networkdomain.LoadedPnd)
+			r0 = ret.Get(0).([]model.LoadedPnd)
 		}
 	}
 
diff --git a/controller/mocks/RoleService.go b/controller/mocks/RoleService.go
index 7925d9676f2fed995263bc4a61bc957075b9f259..abe04dae6270a7166a5bb61747a22b9750b8dfeb 100644
--- a/controller/mocks/RoleService.go
+++ b/controller/mocks/RoleService.go
@@ -4,7 +4,7 @@ package mocks
 
 import (
 	rbac "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 )
 
diff --git a/controller/mocks/RoleStore.go b/controller/mocks/RoleStore.go
index 3467115f20f8ccd93d46cd956637060fcae19c32..4912f4ca51ed32d8ae771e6ecc9b3794abf1c818 100644
--- a/controller/mocks/RoleStore.go
+++ b/controller/mocks/RoleStore.go
@@ -4,7 +4,7 @@ package mocks
 
 import (
 	rbac "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 )
 
diff --git a/controller/mocks/Store.go b/controller/mocks/Store.go
index 3415cc22282995522b1d29438990a26c2dbcde37..cebe76b34d08330f0d126bcb83a6b04407df9287 100644
--- a/controller/mocks/Store.go
+++ b/controller/mocks/Store.go
@@ -3,8 +3,8 @@
 package mocks
 
 import (
-	networkelement "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	store "code.fbi.h-da.de/danet/gosdn/controller/interfaces/store"
+	uuid "github.com/google/uuid"
 	mock "github.com/stretchr/testify/mock"
 )
 
@@ -13,13 +13,13 @@ type Store struct {
 	mock.Mock
 }
 
-// Add provides a mock function with given fields: _a0
-func (_m *Store) Add(_a0 networkelement.NetworkElement) error {
-	ret := _m.Called(_a0)
+// Add provides a mock function with given fields: item
+func (_m *Store) Add(item store.Storable) error {
+	ret := _m.Called(item)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkelement.NetworkElement) error); ok {
-		r0 = rf(_a0)
+	if rf, ok := ret.Get(0).(func(store.Storable) error); ok {
+		r0 = rf(item)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -27,13 +27,13 @@ func (_m *Store) Add(_a0 networkelement.NetworkElement) error {
 	return r0
 }
 
-// Delete provides a mock function with given fields: _a0
-func (_m *Store) Delete(_a0 networkelement.NetworkElement) error {
-	ret := _m.Called(_a0)
+// Delete provides a mock function with given fields: id
+func (_m *Store) Delete(id uuid.UUID) error {
+	ret := _m.Called(id)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(networkelement.NetworkElement) error); ok {
-		r0 = rf(_a0)
+	if rf, ok := ret.Get(0).(func(uuid.UUID) error); ok {
+		r0 = rf(id)
 	} else {
 		r0 = ret.Error(0)
 	}
@@ -41,49 +41,39 @@ func (_m *Store) Delete(_a0 networkelement.NetworkElement) error {
 	return r0
 }
 
-// Get provides a mock function with given fields: _a0
-func (_m *Store) Get(_a0 model.Query) (networkelement.LoadedNetworkElement, error) {
-	ret := _m.Called(_a0)
+// Exists provides a mock function with given fields: id
+func (_m *Store) Exists(id uuid.UUID) bool {
+	ret := _m.Called(id)
 
-	var r0 networkelement.LoadedNetworkElement
-	var r1 error
-	if rf, ok := ret.Get(0).(func(model.Query) (networkelement.LoadedNetworkElement, error)); ok {
-		return rf(_a0)
-	}
-	if rf, ok := ret.Get(0).(func(model.Query) networkelement.LoadedNetworkElement); ok {
-		r0 = rf(_a0)
-	} else {
-		r0 = ret.Get(0).(networkelement.LoadedNetworkElement)
-	}
-
-	if rf, ok := ret.Get(1).(func(model.Query) error); ok {
-		r1 = rf(_a0)
+	var r0 bool
+	if rf, ok := ret.Get(0).(func(uuid.UUID) bool); ok {
+		r0 = rf(id)
 	} else {
-		r1 = ret.Error(1)
+		r0 = ret.Get(0).(bool)
 	}
 
-	return r0, r1
+	return r0
 }
 
-// GetAll provides a mock function with given fields:
-func (_m *Store) GetAll() ([]networkelement.LoadedNetworkElement, error) {
-	ret := _m.Called()
+// Get provides a mock function with given fields: id
+func (_m *Store) Get(id uuid.UUID) (store.Storable, error) {
+	ret := _m.Called(id)
 
-	var r0 []networkelement.LoadedNetworkElement
+	var r0 store.Storable
 	var r1 error
-	if rf, ok := ret.Get(0).(func() ([]networkelement.LoadedNetworkElement, error)); ok {
-		return rf()
+	if rf, ok := ret.Get(0).(func(uuid.UUID) (store.Storable, error)); ok {
+		return rf(id)
 	}
-	if rf, ok := ret.Get(0).(func() []networkelement.LoadedNetworkElement); ok {
-		r0 = rf()
+	if rf, ok := ret.Get(0).(func(uuid.UUID) store.Storable); ok {
+		r0 = rf(id)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]networkelement.LoadedNetworkElement)
+			r0 = ret.Get(0).(store.Storable)
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func() error); ok {
-		r1 = rf()
+	if rf, ok := ret.Get(1).(func(uuid.UUID) error); ok {
+		r1 = rf(id)
 	} else {
 		r1 = ret.Error(1)
 	}
@@ -91,15 +81,17 @@ func (_m *Store) GetAll() ([]networkelement.LoadedNetworkElement, error) {
 	return r0, r1
 }
 
-// Update provides a mock function with given fields: _a0
-func (_m *Store) Update(_a0 networkelement.NetworkElement) error {
-	ret := _m.Called(_a0)
+// UUIDs provides a mock function with given fields:
+func (_m *Store) UUIDs() []uuid.UUID {
+	ret := _m.Called()
 
-	var r0 error
-	if rf, ok := ret.Get(0).(func(networkelement.NetworkElement) error); ok {
-		r0 = rf(_a0)
+	var r0 []uuid.UUID
+	if rf, ok := ret.Get(0).(func() []uuid.UUID); ok {
+		r0 = rf()
 	} else {
-		r0 = ret.Error(0)
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]uuid.UUID)
+		}
 	}
 
 	return r0
diff --git a/controller/mocks/StreamClient.go b/controller/mocks/StreamClient.go
new file mode 100644
index 0000000000000000000000000000000000000000..ddda0b47a471ce08d20cb637e160d97bb1d1d4d4
--- /dev/null
+++ b/controller/mocks/StreamClient.go
@@ -0,0 +1,158 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	mock "github.com/stretchr/testify/mock"
+	metadata "google.golang.org/grpc/metadata"
+
+	plugin_registry "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/plugin-registry"
+)
+
+// StreamClient is an autogenerated mock type for the StreamClient type
+type StreamClient struct {
+	mock.Mock
+}
+
+// CloseSend provides a mock function with given fields:
+func (_m *StreamClient) CloseSend() error {
+	ret := _m.Called()
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func() error); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Context provides a mock function with given fields:
+func (_m *StreamClient) Context() context.Context {
+	ret := _m.Called()
+
+	var r0 context.Context
+	if rf, ok := ret.Get(0).(func() context.Context); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(context.Context)
+		}
+	}
+
+	return r0
+}
+
+// Header provides a mock function with given fields:
+func (_m *StreamClient) Header() (metadata.MD, error) {
+	ret := _m.Called()
+
+	var r0 metadata.MD
+	var r1 error
+	if rf, ok := ret.Get(0).(func() (metadata.MD, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() metadata.MD); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(metadata.MD)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Recv provides a mock function with given fields:
+func (_m *StreamClient) Recv() (*plugin_registry.GetDownloadPayload, error) {
+	ret := _m.Called()
+
+	var r0 *plugin_registry.GetDownloadPayload
+	var r1 error
+	if rf, ok := ret.Get(0).(func() (*plugin_registry.GetDownloadPayload, error)); ok {
+		return rf()
+	}
+	if rf, ok := ret.Get(0).(func() *plugin_registry.GetDownloadPayload); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*plugin_registry.GetDownloadPayload)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// RecvMsg provides a mock function with given fields: m
+func (_m *StreamClient) RecvMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SendMsg provides a mock function with given fields: m
+func (_m *StreamClient) SendMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Trailer provides a mock function with given fields:
+func (_m *StreamClient) Trailer() metadata.MD {
+	ret := _m.Called()
+
+	var r0 metadata.MD
+	if rf, ok := ret.Get(0).(func() metadata.MD); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(metadata.MD)
+		}
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewStreamClient interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewStreamClient creates a new instance of StreamClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewStreamClient(t mockConstructorTestingTNewStreamClient) *StreamClient {
+	mock := &StreamClient{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/controller/mocks/Transport.go b/controller/mocks/Transport.go
index c089f6f014d6fc870567f54bb2fc35eecc0241e2..dce20c813ad270567e1d05d57298bc846bbbb901 100644
--- a/controller/mocks/Transport.go
+++ b/controller/mocks/Transport.go
@@ -5,13 +5,10 @@ package mocks
 import (
 	context "context"
 
-	change "code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
-
 	gnmi "github.com/openconfig/gnmi/proto/gnmi"
-
 	mock "github.com/stretchr/testify/mock"
 
-	transport "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 )
 
 // Transport is an autogenerated mock type for the Transport type
@@ -20,11 +17,11 @@ type Transport struct {
 }
 
 // ControlPlaneSubscribe provides a mock function with given fields: ctx, subscriptionInfo, subInfoChannel
-func (_m *Transport) ControlPlaneSubscribe(ctx context.Context, subscriptionInfo transport.SubscriptionInformation, subInfoChannel chan transport.SubscriptionInformation) error {
+func (_m *Transport) ControlPlaneSubscribe(ctx context.Context, subscriptionInfo model.SubscriptionInformation, subInfoChannel chan model.SubscriptionInformation) error {
 	ret := _m.Called(ctx, subscriptionInfo, subInfoChannel)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(context.Context, transport.SubscriptionInformation, chan transport.SubscriptionInformation) error); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, model.SubscriptionInformation, chan model.SubscriptionInformation) error); ok {
 		r0 = rf(ctx, subscriptionInfo, subInfoChannel)
 	} else {
 		r0 = ret.Error(0)
@@ -121,11 +118,11 @@ func (_m *Transport) ProcessResponse(resp interface{}) error {
 }
 
 // Set provides a mock function with given fields: ctx, payload
-func (_m *Transport) Set(ctx context.Context, payload change.Payload) error {
+func (_m *Transport) Set(ctx context.Context, payload model.Payload) error {
 	ret := _m.Called(ctx, payload)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(context.Context, change.Payload) error); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, model.Payload) error); ok {
 		r0 = rf(ctx, payload)
 	} else {
 		r0 = ret.Error(0)
diff --git a/controller/mocks/UserService.go b/controller/mocks/UserService.go
index 83d2ddcdfd39dc6e17190f532f2b8e3e2515cd84..56c1181da91329a854c3b7390f6fee8f35719282 100644
--- a/controller/mocks/UserService.go
+++ b/controller/mocks/UserService.go
@@ -4,7 +4,7 @@ package mocks
 
 import (
 	rbac "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 )
 
diff --git a/controller/mocks/UserStore.go b/controller/mocks/UserStore.go
index c2cc5d41ec0938475a9ffdc3076148137c052587..c0676d5766b004bf7f07f8838fd51e2bb33e346b 100644
--- a/controller/mocks/UserStore.go
+++ b/controller/mocks/UserStore.go
@@ -4,7 +4,7 @@ package mocks
 
 import (
 	rbac "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
-	store "code.fbi.h-da.de/danet/gosdn/controller/store"
+	model "code.fbi.h-da.de/danet/gosdn/controller/nucleus/domain/model"
 	mock "github.com/stretchr/testify/mock"
 )
 
diff --git a/controller/mocks/storableConstraint.go b/controller/mocks/storableConstraint.go
new file mode 100644
index 0000000000000000000000000000000000000000..19c18aee73d3941dedcc4feae41d8006d82d8149
--- /dev/null
+++ b/controller/mocks/storableConstraint.go
@@ -0,0 +1,59 @@
+// Code generated by mockery v2.20.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+)
+
+// storableConstraint is an autogenerated mock type for the storableConstraint type
+type storableConstraint struct {
+	mock.Mock
+}
+
+// ID provides a mock function with given fields:
+func (_m *storableConstraint) ID() uuid.UUID {
+	ret := _m.Called()
+
+	var r0 uuid.UUID
+	if rf, ok := ret.Get(0).(func() uuid.UUID); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(uuid.UUID)
+		}
+	}
+
+	return r0
+}
+
+// Name provides a mock function with given fields:
+func (_m *storableConstraint) Name() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTnewStorableConstraint interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// newStorableConstraint creates a new instance of storableConstraint. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func newStorableConstraint(t mockConstructorTestingTnewStorableConstraint) *storableConstraint {
+	mock := &storableConstraint{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}