diff --git a/controller/api/api_test.go b/controller/api/api_test.go
index b31494fe58f26f2f68dfae573da4af54b7455b90..3555a1734ffee4069bc00963e4616c8f8d7280b9 100644
--- a/controller/api/api_test.go
+++ b/controller/api/api_test.go
@@ -2,15 +2,12 @@ package api
 
 import (
 	"context"
-	"os"
-	"path/filepath"
 	"testing"
 
 	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
-	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
 )
@@ -31,34 +28,7 @@ func Test_GetIds(t *testing.T) {
 	log.Info(resp)
 }
 
-func ensureFilesForTestsAreRemoved() {
-	ensureStoreFileForTestsIsRemoved(store.SbiFilenameSuffix)
-	ensureStoreFileForTestsIsRemoved(store.NetworkElementFilenameSuffix)
-}
-
-func ensureStoreFileForTestsIsRemoved(storeName string) {
-	if err := store.EnsureFilesystemStorePathExists(storeName); err != nil {
-		log.Println(err)
-	}
-
-	wildcartFilename := "*" + storeName
-	path := store.GetCompletePathToFileStore(wildcartFilename)
-
-	files, err := filepath.Glob(path)
-
-	if err != nil {
-		log.Println(err)
-	}
-	for _, f := range files {
-		if err := os.Remove(f); err != nil {
-			log.Println(err)
-		}
-	}
-}
-
 func Test_AddPnd(t *testing.T) {
-	defer ensureFilesForTestsAreRemoved()
-
 	sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
 	if err != nil {
 		t.Errorf("AddPnd() error = %v", err)
@@ -138,7 +108,7 @@ func Test_GetDevice(t *testing.T) {
 }
 
 func Test_Update(t *testing.T) {
-	resp, err := ChangeRequest(context.TODO(), bufnet, mneID, pndID, "", "", mnepb.ApiOperation_API_OPERATION_UPDATE)
+	resp, err := ChangeRequest(context.TODO(), bufnet, mneID, pndID, "system/config/hostname", "intendedHostname", mnepb.ApiOperation_API_OPERATION_UPDATE)
 	if err != nil {
 		t.Error(err)
 		return
@@ -147,7 +117,7 @@ func Test_Update(t *testing.T) {
 }
 
 func Test_Replace(t *testing.T) {
-	resp, err := ChangeRequest(context.TODO(), bufnet, mneID, pndID, "", "", mnepb.ApiOperation_API_OPERATION_REPLACE)
+	resp, err := ChangeRequest(context.TODO(), bufnet, mneID, pndID, "system/config/hostname", "intendedHostname", mnepb.ApiOperation_API_OPERATION_REPLACE)
 	if err != nil {
 		t.Error(err)
 		return
diff --git a/controller/api/api_test.toml b/controller/api/api_test.toml
index caa343d3b1e58f69f36ac0dfd04118ebccdcc5aa..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/controller/api/api_test.toml
+++ b/controller/api/api_test.toml
@@ -1 +0,0 @@
-cli_pnd = '2043519e-46d1-4963-9a8e-d99007e104b8'
diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go
index 8f32b7f4d26276f3d6401b723ca44769ea484b3e..e8f0a593c3762e6071222c9f27b8a713964b6ca8 100644
--- a/controller/api/initialise_test.go
+++ b/controller/api/initialise_test.go
@@ -26,12 +26,13 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto"
 	rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/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"
 	routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables"
-	"code.fbi.h-da.de/danet/gosdn/controller/topology/store"
+	topoStore "code.fbi.h-da.de/danet/gosdn/controller/topology/store"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
@@ -107,7 +108,10 @@ func bootstrapUnitTest() {
 	intendedHostname := "intendedHostname"
 
 	mockChange := &mocks.Change{}
+	mockChange.On("ID").Return(uuid.MustParse(changeID))
 	mockChange.On("Age").Return(time.Hour)
+	mockChange.On("Commit").Return(nil)
+	mockChange.On("Confirm").Return(nil)
 	mockChange.On("State").Return(mnepb.ChangeState_CHANGE_STATE_INCONSISTENT)
 	mockChange.On("PreviousState").Return(&openconfig.Device{
 		System: &openconfig.OpenconfigSystem_System{
@@ -162,16 +166,16 @@ func bootstrapUnitTest() {
 	jwtManager := rbacImpl.NewJWTManager("", (10000 * time.Hour))
 	appService := app.NewMockAppService()
 
-	nodeStore := store.NewGenericStore[nodes.Node]()
+	nodeStore := topoStore.NewGenericStore[nodes.Node]()
 	nodeService := nodes.NewNodeService(nodeStore, eventService)
 
-	portStore := store.NewGenericStore[ports.Port]()
+	portStore := topoStore.NewGenericStore[ports.Port]()
 	portService := ports.NewPortService(portStore, eventService)
 
-	topoloyStore := store.NewGenericStore[links.Link]()
+	topoloyStore := topoStore.NewGenericStore[links.Link]()
 	topologyService := topology.NewTopologyService(topoloyStore, nodeService, portService, eventService)
 
-	routeStore := store.NewGenericStore[routingtables.RoutingTable]()
+	routeStore := topoStore.NewGenericStore[routingtables.RoutingTable]()
 	routeService := routingtables.NewRoutingTableService(routeStore, nodeService, portService, eventService)
 
 	sbiService := nucleus.NewSbiService(sbiStore, eventService)
@@ -195,11 +199,21 @@ func bootstrapUnitTest() {
 	_ = networkElementService.Add(mne)
 
 	pndService := &mocks.PndService{}
+	pndService.On("GetAll").Return([]networkdomain.NetworkDomain{}, nil)
+	pndService.On("Add", mock.Anything).Return(nil)
+	pndService.On("Get", mock.Anything).Return(nucleus.NewPNDEntity(pndUUID, "test", "test"), nil)
+
+	changeStore := *store.NewChangeStore()
+	err = changeStore.Add(mockChange)
+	if err != nil {
+		log.Fatal(err)
+	}
 
 	northbound := nbi.NewNBI(
 		pndStore,
 		pndService,
 		networkElementService,
+		changeStore,
 		sbiService,
 		userService,
 		roleService,
diff --git a/controller/controller.go b/controller/controller.go
index f28216ce7b69f879a6cf7ba74a0593772acd9f92..e9198db3068ebafa18441aa38a53cee1b4fd5d58 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -61,6 +61,7 @@ type Core struct {
 	pndStore              networkdomain.PndStore
 	pndService            networkdomain.Service
 	mneService            networkelement.Service
+	changeStore           store.ChangeStore
 	sbiService            southbound.Service
 	userService           rbac.UserService
 	roleService           rbac.RoleService
@@ -111,10 +112,13 @@ func initialize() error {
 
 	sbiService := nucleus.NewSbiService(nucleus.NewSbiStore(), eventService)
 
+	changeStore := store.NewChangeStore()
+
 	c = &Core{
 		pndStore:    pndStore,
 		pndService:  nucleus.NewPndService(pndStore),
 		mneService:  nucleus.NewNetworkElementService(nucleus.NewNetworkElementStore(), sbiService, eventService),
+		changeStore: *changeStore,
 		sbiService:  sbiService,
 		userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService),
 		roleService: rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService),
@@ -184,6 +188,7 @@ func startGrpc() error {
 		c.pndStore,
 		c.pndService,
 		c.mneService,
+		c.changeStore,
 		c.sbiService,
 		c.userService,
 		c.roleService,
diff --git a/controller/interfaces/networkdomain/pnd.go b/controller/interfaces/networkdomain/pnd.go
index 52f4d235ec5422c769889f7890149b44af1b14e1..23aa3935b1ea9dc043778c2c6012c55dffc916be 100644
--- a/controller/interfaces/networkdomain/pnd.go
+++ b/controller/interfaces/networkdomain/pnd.go
@@ -3,7 +3,6 @@ package networkdomain
 import (
 	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"github.com/google/uuid"
@@ -22,7 +21,6 @@ type NetworkDomain interface {
 	UpdateNetworkElement(uuid.UUID, string) error
 	NetworkElements() []networkelement.NetworkElement
 	FlattenedNetworkElements() []networkelement.LoadedNetworkElement
-	ChangeMNE(uuid uuid.UUID, operation mnepb.ApiOperation, path string, value ...string) (uuid.UUID, error)
 	Request(uuid.UUID, string) (proto.Message, error)
 	RequestAll(string) error
 	GetName() string
@@ -31,11 +29,6 @@ type NetworkDomain interface {
 	GetSBIs() ([]southbound.SouthboundInterface, error)
 	GetSBI(uuid.UUID) (southbound.SouthboundInterface, error)
 	ID() uuid.UUID
-	PendingChanges() []uuid.UUID
-	CommittedChanges() []uuid.UUID
-	GetChange(uuid.UUID) (change.Change, error)
-	Commit(uuid.UUID) error
-	Confirm(uuid.UUID) error
 	SubscribePath(uuid.UUID, *mnepb.SubscriptionList) error
 }
 
diff --git a/controller/mocks/NetworkDomain.go b/controller/mocks/NetworkDomain.go
index 97b0d00651e6fec3b660ea6f9cbdc068c93f0623..f71b1a0d7aa72069c4f6292a129b251483438497 100644
--- a/controller/mocks/NetworkDomain.go
+++ b/controller/mocks/NetworkDomain.go
@@ -3,12 +3,10 @@
 package mocks
 
 import (
-	change "code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
-	interfacesnetworkelement "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
-
+	gosdnnetworkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 	mock "github.com/stretchr/testify/mock"
 
-	networkelement "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
+	networkelement "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement"
 
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 
@@ -61,80 +59,6 @@ func (_m *NetworkDomain) AddSbi(s southbound.SouthboundInterface) error {
 	return r0
 }
 
-// ChangeMNE provides a mock function with given fields: _a0, operation, path, value
-func (_m *NetworkDomain) ChangeMNE(_a0 uuid.UUID, operation networkelement.ApiOperation, path string, value ...string) (uuid.UUID, error) {
-	_va := make([]interface{}, len(value))
-	for _i := range value {
-		_va[_i] = value[_i]
-	}
-	var _ca []interface{}
-	_ca = append(_ca, _a0, operation, path)
-	_ca = append(_ca, _va...)
-	ret := _m.Called(_ca...)
-
-	var r0 uuid.UUID
-	if rf, ok := ret.Get(0).(func(uuid.UUID, networkelement.ApiOperation, string, ...string) uuid.UUID); ok {
-		r0 = rf(_a0, operation, path, value...)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(uuid.UUID)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(uuid.UUID, networkelement.ApiOperation, string, ...string) error); ok {
-		r1 = rf(_a0, operation, path, value...)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Commit provides a mock function with given fields: _a0
-func (_m *NetworkDomain) Commit(_a0 uuid.UUID) error {
-	ret := _m.Called(_a0)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(uuid.UUID) error); ok {
-		r0 = rf(_a0)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
-// CommittedChanges provides a mock function with given fields:
-func (_m *NetworkDomain) CommittedChanges() []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
-}
-
-// Confirm provides a mock function with given fields: _a0
-func (_m *NetworkDomain) Confirm(_a0 uuid.UUID) error {
-	ret := _m.Called(_a0)
-
-	var r0 error
-	if rf, ok := ret.Get(0).(func(uuid.UUID) error); ok {
-		r0 = rf(_a0)
-	} else {
-		r0 = ret.Error(0)
-	}
-
-	return r0
-}
-
 // Destroy provides a mock function with given fields:
 func (_m *NetworkDomain) Destroy() error {
 	ret := _m.Called()
@@ -150,44 +74,21 @@ func (_m *NetworkDomain) Destroy() error {
 }
 
 // FlattenedNetworkElements provides a mock function with given fields:
-func (_m *NetworkDomain) FlattenedNetworkElements() []interfacesnetworkelement.LoadedNetworkElement {
+func (_m *NetworkDomain) FlattenedNetworkElements() []networkelement.LoadedNetworkElement {
 	ret := _m.Called()
 
-	var r0 []interfacesnetworkelement.LoadedNetworkElement
-	if rf, ok := ret.Get(0).(func() []interfacesnetworkelement.LoadedNetworkElement); ok {
+	var r0 []networkelement.LoadedNetworkElement
+	if rf, ok := ret.Get(0).(func() []networkelement.LoadedNetworkElement); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]interfacesnetworkelement.LoadedNetworkElement)
+			r0 = ret.Get(0).([]networkelement.LoadedNetworkElement)
 		}
 	}
 
 	return r0
 }
 
-// GetChange provides a mock function with given fields: _a0
-func (_m *NetworkDomain) GetChange(_a0 uuid.UUID) (change.Change, error) {
-	ret := _m.Called(_a0)
-
-	var r0 change.Change
-	if rf, ok := ret.Get(0).(func(uuid.UUID) change.Change); ok {
-		r0 = rf(_a0)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(change.Change)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(uuid.UUID) error); ok {
-		r1 = rf(_a0)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
 // GetDescription provides a mock function with given fields:
 func (_m *NetworkDomain) GetDescription() string {
 	ret := _m.Called()
@@ -217,15 +118,15 @@ func (_m *NetworkDomain) GetName() string {
 }
 
 // GetNetworkElement provides a mock function with given fields: identifier
-func (_m *NetworkDomain) GetNetworkElement(identifier string) (interfacesnetworkelement.NetworkElement, error) {
+func (_m *NetworkDomain) GetNetworkElement(identifier string) (networkelement.NetworkElement, error) {
 	ret := _m.Called(identifier)
 
-	var r0 interfacesnetworkelement.NetworkElement
-	if rf, ok := ret.Get(0).(func(string) interfacesnetworkelement.NetworkElement); ok {
+	var r0 networkelement.NetworkElement
+	if rf, ok := ret.Get(0).(func(string) networkelement.NetworkElement); ok {
 		r0 = rf(identifier)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(interfacesnetworkelement.NetworkElement)
+			r0 = ret.Get(0).(networkelement.NetworkElement)
 		}
 	}
 
@@ -323,31 +224,15 @@ func (_m *NetworkDomain) MarshalNetworkElement(_a0 string) (string, error) {
 }
 
 // NetworkElements provides a mock function with given fields:
-func (_m *NetworkDomain) NetworkElements() []interfacesnetworkelement.NetworkElement {
-	ret := _m.Called()
-
-	var r0 []interfacesnetworkelement.NetworkElement
-	if rf, ok := ret.Get(0).(func() []interfacesnetworkelement.NetworkElement); ok {
-		r0 = rf()
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]interfacesnetworkelement.NetworkElement)
-		}
-	}
-
-	return r0
-}
-
-// PendingChanges provides a mock function with given fields:
-func (_m *NetworkDomain) PendingChanges() []uuid.UUID {
+func (_m *NetworkDomain) NetworkElements() []networkelement.NetworkElement {
 	ret := _m.Called()
 
-	var r0 []uuid.UUID
-	if rf, ok := ret.Get(0).(func() []uuid.UUID); ok {
+	var r0 []networkelement.NetworkElement
+	if rf, ok := ret.Get(0).(func() []networkelement.NetworkElement); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]uuid.UUID)
+			r0 = ret.Get(0).([]networkelement.NetworkElement)
 		}
 	}
 
@@ -420,11 +305,11 @@ func (_m *NetworkDomain) RequestAll(_a0 string) error {
 }
 
 // SubscribePath provides a mock function with given fields: _a0, _a1
-func (_m *NetworkDomain) SubscribePath(_a0 uuid.UUID, _a1 *networkelement.SubscriptionList) error {
+func (_m *NetworkDomain) SubscribePath(_a0 uuid.UUID, _a1 *gosdnnetworkelement.SubscriptionList) error {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 error
-	if rf, ok := ret.Get(0).(func(uuid.UUID, *networkelement.SubscriptionList) error); ok {
+	if rf, ok := ret.Get(0).(func(uuid.UUID, *gosdnnetworkelement.SubscriptionList) error); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		r0 = ret.Error(0)
diff --git a/controller/mocks/NetworkElement.go b/controller/mocks/NetworkElement.go
index b04f360abfc73784a100e9b18ab0b866930d1352..b0df9a497dbe9e82474632743963c5c8c9742e62 100644
--- a/controller/mocks/NetworkElement.go
+++ b/controller/mocks/NetworkElement.go
@@ -140,6 +140,22 @@ func (_m *NetworkElement) Name() string {
 	return r0
 }
 
+// PndID provides a mock function with given fields:
+func (_m *NetworkElement) PndID() 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
+}
+
 // ProcessResponse provides a mock function with given fields: _a0
 func (_m *NetworkElement) ProcessResponse(_a0 protoreflect.ProtoMessage) error {
 	ret := _m.Called(_a0)
diff --git a/controller/mocks/Pnd_Additions.go b/controller/mocks/Pnd_Additions.go
new file mode 100644
index 0000000000000000000000000000000000000000..ea0fb12ad41b949b3628c8bae810d6bfdb1f983a
--- /dev/null
+++ b/controller/mocks/Pnd_Additions.go
@@ -0,0 +1,20 @@
+package mocks
+
+import (
+	"encoding/json"
+
+	"github.com/google/uuid"
+)
+
+// MarshalJSON implements the MarshalJSON interface to store a PND as JSON.
+func (n NetworkDomain) MarshalJSON() ([]byte, error) {
+	return json.Marshal(&struct {
+		ID          uuid.UUID
+		Name        string
+		Description string
+	}{
+		ID:          n.ID(),
+		Name:        n.GetName(),
+		Description: n.GetDescription(),
+	})
+}
diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go
index 1b1f3217eb93bca3b42c264231a58ba538afa7dc..8ab1da0c63d7e9cc0a78852f3a4b9a33134d0ae6 100644
--- a/controller/northbound/server/auth_interceptor_test.go
+++ b/controller/northbound/server/auth_interceptor_test.go
@@ -29,12 +29,12 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer,
 	roleStore := rbac.NewMemoryRoleStore()
 	roleService := rbac.NewRoleService(roleStore, eventService)
 
-	mockPnd := getMockPnd(t)
-
 	pndStore := nucleus.NewMemoryPndStore()
 	pndService := nucleus.NewPndService(pndStore)
 
-	if err := pndService.Add(mockPnd); err != nil {
+	pnd := nucleus.NewPNDEntity(pndUUID, "test", "test")
+
+	if err := pndService.Add(pnd); err != nil {
 		t.Fatal(err)
 	}
 
diff --git a/controller/northbound/server/core_test.go b/controller/northbound/server/core_test.go
index 8167444e30cb0f197ee2c872fe4bd3821dc535aa..fd4996034d92ad1c756074c3c28d9628b8d254fc 100644
--- a/controller/northbound/server/core_test.go
+++ b/controller/northbound/server/core_test.go
@@ -87,6 +87,7 @@ func getTestCoreServer(t *testing.T) *CoreServer {
 	mockPnd.On("Confirm", mock.Anything).Return(nil)
 	mockPnd.On("ChangeMNE", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uuid.Nil, nil)
 	mockPnd.On("Request", mock.Anything, mock.Anything).Return(nil, nil)
+	mockPnd.On("GetAll").Return(mockPnd)
 
 	pndStore := nucleus.NewMemoryPndStore()
 
diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go
index 9d02b0b5d313a4c595d42f96f9b141203ce6514c..c0edd298a9859ea5b94c5933fe14ec83d43bc833 100644
--- a/controller/northbound/server/nbi.go
+++ b/controller/northbound/server/nbi.go
@@ -7,6 +7,7 @@ import (
 	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/rbac"
+	"code.fbi.h-da.de/danet/gosdn/controller/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"
@@ -40,6 +41,7 @@ func NewNBI(
 	pnds networkdomain.PndStore,
 	pndService networkdomain.Service,
 	mneService networkelement.Service,
+	changeStore store.ChangeStore,
 	sbiService southbound.Service,
 	users rbacInterfaces.UserService,
 	roles rbacInterfaces.RoleService,
@@ -61,7 +63,7 @@ func NewNBI(
 		Role:           NewRoleServer(&jwt, roles),
 		Topology:       NewTopologyServer(topologyService, nodeService, portService),
 		App:            NewAppServer(apps),
-		NetworkElement: NewNetworkElementServer(mneService, pndService, sbiService),
+		NetworkElement: NewNetworkElementServer(mneService, pndService, sbiService, changeStore),
 		Routes:         NewRoutingTableServiceServer(routeService, nodeService, portService),
 	}
 }
diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go
index 1dd69525e76c4cd14268e4519feb1f8d175d6590..6a1febcb38927e9d0bff1d1bfd331d0c9d7ebf1d 100644
--- a/controller/northbound/server/networkElement.go
+++ b/controller/northbound/server/networkElement.go
@@ -12,12 +12,14 @@ import (
 	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/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/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/metrics"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus"
 	"code.fbi.h-da.de/danet/gosdn/controller/nucleus/types"
+	gGnmi "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi"
 	"github.com/google/uuid"
@@ -35,17 +37,19 @@ import (
 // NetworkElementServer represents a NetworkElementServer.
 type NetworkElementServer struct {
 	mnepb.UnimplementedNetworkElementServiceServer
-	mneService networkelement.Service
-	pndService networkdomain.Service
-	sbiService southbound.Service
+	mneService  networkelement.Service
+	pndService  networkdomain.Service
+	sbiService  southbound.Service
+	changeStore store.ChangeStore
 }
 
 // NewNetworkElementServer returns a new NetWorkElementServer.
-func NewNetworkElementServer(mneService networkelement.Service, pndService networkdomain.Service, sbiService southbound.Service) *NetworkElementServer {
+func NewNetworkElementServer(mneService networkelement.Service, pndService networkdomain.Service, sbiService southbound.Service, changeStore store.ChangeStore) *NetworkElementServer {
 	return &NetworkElementServer{
-		mneService: mneService,
-		pndService: pndService,
-		sbiService: sbiService,
+		mneService:  mneService,
+		pndService:  pndService,
+		sbiService:  sbiService,
+		changeStore: changeStore,
 	}
 }
 
@@ -180,13 +184,13 @@ func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetwor
 // TODO(PND): let someone check if this makes sense!
 // Update updates a network element.
 func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) {
-	mneID, err := uuid.Parse(request.NetworkElement.Id)
-	if err != nil {
-		return &mnepb.UpdateNetworkElementResponse{
-			Timestamp: time.Now().UnixNano(),
-			Status:    mnepb.Status_STATUS_ERROR,
-		}, err
-	}
+	// mneID, err := uuid.Parse(request.NetworkElement.Id)
+	// if err != nil {
+	// 	return &mnepb.UpdateNetworkElementResponse{
+	// 		Timestamp: time.Now().UnixNano(),
+	// 		Status:    mnepb.Status_STATUS_ERROR,
+	// 	}, err
+	// }
 
 	pndID, err := uuid.Parse(request.NetworkElement.AssociatedPnd)
 	if err != nil {
@@ -236,13 +240,13 @@ func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.Update
 
 	// TODO(PND): this should probably be removed because we the model which is already applied should be
 	// stored again if I did not make a mistake here!
-	err = n.ensureIntendedConfigurationIsAppliedOnNetworkElement(mneID)
-	if err != nil {
-		return &mnepb.UpdateNetworkElementResponse{
-			Timestamp: time.Now().UnixNano(),
-			Status:    mnepb.Status_STATUS_ERROR,
-		}, err
-	}
+	// err = n.ensureIntendedConfigurationIsAppliedOnNetworkElement(mneID)
+	// if err != nil {
+	// 	return &mnepb.UpdateNetworkElementResponse{
+	// 		Timestamp: time.Now().UnixNano(),
+	// 		Status:    mnepb.Status_STATUS_ERROR,
+	// 	}, err
+	// }
 
 	return &mnepb.UpdateNetworkElementResponse{
 		Timestamp: time.Now().UnixNano(),
@@ -593,7 +597,7 @@ func (n *NetworkElementServer) GetChange(ctx context.Context, request *mnepb.Get
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
-	changes, err := fillChanges(pnd, false, request.Cuid...)
+	changes, err := n.fillChanges(false, request.Cuid...)
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -627,7 +631,7 @@ func (n *NetworkElementServer) GetChangeList(ctx context.Context, request *mnepb
 		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
-	changes, err := fillChanges(pnd, true, "")
+	changes, err := n.fillChanges(true, "")
 	if err != nil {
 		log.Error(err)
 		return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -644,18 +648,18 @@ func (n *NetworkElementServer) GetChangeList(ctx context.Context, request *mnepb
 	}, nil
 }
 
-func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*mnepb.Change, error) {
+func (n *NetworkElementServer) fillChanges(all bool, cuid ...string) ([]*mnepb.Change, error) {
 	var changeList []uuid.UUID
 
 	switch all {
 	case true:
-		changeList = pnd.PendingChanges()
-		changeList = append(changeList, pnd.CommittedChanges()...)
+		changeList = n.changeStore.Pending()
+		changeList = append(changeList, n.changeStore.Committed()...)
 	default:
 		var err error
 		if len(cuid) == 0 {
 			return nil, &customerrs.InvalidParametersError{
-				Func:  fillChanges,
+				Func:  n.fillChanges,
 				Param: "length of 'mneID' cannot be '0' when 'all' is set to 'false'",
 			}
 		}
@@ -668,7 +672,7 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*
 
 	changes := make([]*mnepb.Change, len(changeList))
 	for i, ch := range changeList {
-		c, err := pnd.GetChange(ch)
+		c, err := n.changeStore.GetChange(ch)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -795,15 +799,6 @@ func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb
 	labels := prometheus.Labels{"service": "mne", "rpc": "set"}
 	start := metrics.StartHook(labels, grpcRequestsTotal)
 	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
-	pid, err := uuid.Parse(request.Pid)
-	if err != nil {
-		return nil, handleRPCError(labels, err)
-	}
-
-	pnd, err := n.pndService.Get(store.Query{ID: pid})
-	if err != nil {
-		return nil, handleRPCError(labels, err)
-	}
 
 	responses := make([]*mnepb.SetResponse, len(request.Change))
 
@@ -815,12 +810,12 @@ func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb
 		}
 		switch r.Op {
 		case mnepb.Operation_OPERATION_COMMIT:
-			if err := pnd.Commit(cuid); err != nil {
+			if err := n.Commit(cuid); err != nil {
 				log.Error(err)
 				return nil, status.Errorf(codes.Aborted, "%v", err)
 			}
 		case mnepb.Operation_OPERATION_CONFIRM:
-			if err := pnd.Confirm(cuid); err != nil {
+			if err := n.Confirm(cuid); err != nil {
 				log.Error(err)
 				return nil, status.Errorf(codes.Aborted, "%v", err)
 			}
@@ -842,21 +837,29 @@ func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb
 	}, nil
 }
 
-// SetPathList sets a list of paths.
-func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.SetPathListRequest) (*mnepb.SetPathListResponse, error) {
-	labels := prometheus.Labels{"service": "mne", "rpc": "set"}
-	start := metrics.StartHook(labels, grpcRequestsTotal)
-	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
-
-	pid, err := uuid.Parse(request.Pid)
+// Commit calls commit on the pending change with ID.
+func (n *NetworkElementServer) Commit(u uuid.UUID) error {
+	ch, err := n.changeStore.GetChange(u)
 	if err != nil {
-		return nil, handleRPCError(labels, err)
+		return err
 	}
+	return ch.Commit()
+}
 
-	pnd, err := n.pndService.Get(store.Query{ID: pid})
+// Confirm calls confirm on pending the pending change with ID.
+func (n *NetworkElementServer) Confirm(u uuid.UUID) error {
+	ch, err := n.changeStore.GetChange(u)
 	if err != nil {
-		return nil, handleRPCError(labels, err)
+		return err
 	}
+	return ch.Confirm()
+}
+
+// SetPathList sets a list of paths.
+func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.SetPathListRequest) (*mnepb.SetPathListResponse, error) {
+	labels := prometheus.Labels{"service": "mne", "rpc": "set"}
+	start := metrics.StartHook(labels, grpcRequestsTotal)
+	defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds)
 
 	responses := make([]*mnepb.SetResponse, len(request.ChangeRequest))
 
@@ -866,7 +869,7 @@ func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.S
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
-		cid, err := pnd.ChangeMNE(mneID, r.ApiOp, r.Path, r.Value)
+		cid, err := n.ChangeMNE(mneID, r.ApiOp, r.Path, r.Value)
 		if err != nil {
 			log.Error(err)
 			return nil, status.Errorf(codes.Aborted, "%v", err)
@@ -884,13 +887,85 @@ func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.S
 	}, nil
 }
 
+// ChangeMNE creates a change from the provided Operation, path and value.
+// The Change is Pending and times out after the specified timeout period.
+//
+// nolint:gocyclo
+func (n *NetworkElementServer) ChangeMNE(duid uuid.UUID, operation mnepb.ApiOperation, path string, value ...string) (uuid.UUID, error) {
+	//TODO: check if we can get cyclomatic complexity from 16 to at least 15
+	mne, err := n.mneService.Get(store.Query{
+		ID: duid,
+	})
+	if err != nil {
+		return uuid.Nil, err
+	}
+
+	validatedCpy, err := mne.CreateModelCopy()
+	if err != nil {
+		return uuid.Nil, err
+	}
+
+	p, err := ygot.StringToStructuredPath(path)
+	if err != nil {
+		return uuid.Nil, err
+	}
+
+	if operation != mnepb.ApiOperation_API_OPERATION_DELETE && len(value) != 1 {
+		return uuid.Nil, &customerrs.InvalidParametersError{
+			Func:  n.ChangeMNE,
+			Param: value,
+		}
+	}
+	switch operation {
+	case mnepb.ApiOperation_API_OPERATION_UPDATE, mnepb.ApiOperation_API_OPERATION_REPLACE:
+		_, entry, err := ytypes.GetOrCreateNode(mne.SBI().Schema().RootSchema(), validatedCpy, p)
+		if err != nil {
+			return uuid.Nil, err
+		}
+
+		if entry.IsDir() {
+			opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
+			if err := mne.SBI().Unmarshal([]byte(value[0]), p, validatedCpy, opts...); err != nil {
+				return uuid.Nil, err
+			}
+		} else if entry.IsLeaf() {
+			typedValue, err := gGnmi.ConvertStringToGnmiTypedValue(value[0], entry.Type)
+			if err != nil {
+				return uuid.Nil, err
+			}
+			opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}}
+			if err := ytypes.SetNode(mne.SBI().Schema().RootSchema(), validatedCpy, p, typedValue, opts...); err != nil {
+				return uuid.Nil, err
+			}
+		}
+	case mnepb.ApiOperation_API_OPERATION_DELETE:
+		if err := ytypes.DeleteNode(mne.SBI().Schema().RootSchema(), validatedCpy, p); err != nil {
+			return uuid.Nil, err
+		}
+	default:
+		return uuid.Nil, &customerrs.OperationNotSupportedError{Op: operation}
+	}
+
+	ygot.PruneEmptyBranches(validatedCpy)
+	callback := func(original ygot.GoStruct, modified ygot.GoStruct) error {
+		ctx := context.WithValue(context.Background(), types.CtxKeyOperation, operation) // nolint
+		payload := change.Payload{Original: original, Modified: modified}
+		pathToSet := path
+		schema := mne.SBI().Schema()
+		return mne.Transport().Set(ctx, payload, pathToSet, schema)
+	}
+
+	ch := nucleus.NewChange(duid, mne.GetModel(), validatedCpy, callback)
+
+	if err := n.changeStore.Add(ch); err != nil {
+		return uuid.Nil, err
+	}
+
+	return ch.ID(), nil
+}
+
 // DeleteMne deletes a mne.
 func (n *NetworkElementServer) DeleteMne(ctx context.Context, request *mnepb.DeleteMneRequest) (*mnepb.DeleteMneResponse, error) {
-	//TODO(PND): decide if this should be added or not, requires some changes in controller/nucleus/metrics.go too
-	// labels := prometheus.Labels{"service": "mne", "rpc": "delete"}
-	// start := metrics.StartHook(labels, networkElementDeletionsTotal)
-	// defer metrics.FinishHook(labels, start, networkElementDeletionDurationSecondsTotal, networkElementDeletionDurationSeconds)
-
 	mneID, err := uuid.Parse(request.Mneid)
 	if err != nil {
 		log.Error(err)
diff --git a/controller/northbound/server/networkElement_test.go b/controller/northbound/server/networkElement_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..39bfd0505e9cc68f46777df32c533a9bca45b27a
--- /dev/null
+++ b/controller/northbound/server/networkElement_test.go
@@ -0,0 +1,476 @@
+package server
+
+import (
+	"context"
+	"errors"
+	"reflect"
+	"testing"
+
+	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict"
+	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
+	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/nucleus"
+	"code.fbi.h-da.de/danet/gosdn/controller/store"
+	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
+	"github.com/google/uuid"
+)
+
+func TestNetworkElementServer_AddNetworkElement(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		name string
+		opts *tpb.TransportOption
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				name: "fridolin",
+				opts: &tpb.TransportOption{
+					TransportOption: &tpb.TransportOption_GnmiTransportOption{
+						GnmiTransportOption: &tpb.GnmiTransportOption{},
+					},
+				},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		tt := tt
+
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			sbi := &nucleus.OpenConfig{}
+			sbi.SetID(sbiUUID)
+			if err := mneServer.sbiService.Add(sbi); err != nil {
+				t.Error(err)
+			}
+
+			_, err := mneServer.addNetworkElement(context.TODO(), tt.args.name, tt.args.opts, sbiUUID, pndUUID)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("AddNetworkElement() error = %v, wantErr %v", err, tt.wantErr)
+			}
+
+			if tt.name != "fails wrong type" {
+				if err == nil {
+					mne, err := mneServer.mneService.Get(store.Query{Name: tt.args.name})
+					if err != nil {
+						t.Errorf("AddNetworkElement() error = %v", err)
+						return
+					}
+					if mne.Name() != tt.args.name {
+						t.Errorf("AddNetworkElement() got = %v, want %v", mne.Name(), tt.args.name)
+					}
+					if err := mneServer.mneService.Delete(mne); err != nil {
+						t.Error(err)
+					}
+				}
+			}
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+func TestNetworkElementServer_RemoveNetworkElement(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		uuid uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{name: "default", args: args{uuid: uuid.MustParse(mneID)}, wantErr: false},
+		{name: "fails", args: args{uuid: uuid.New()}, wantErr: true},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, uuid.MustParse(sbiID))
+			if err != nil {
+				t.Error("could not create sbi")
+			}
+
+			err = mneServer.sbiService.Add(sbi)
+			if err != nil {
+				t.Error("could not add sbi")
+			}
+			mne := &nucleus.CommonNetworkElement{
+				UUID:  mneUUID,
+				Model: &openconfig.Device{},
+			}
+			mne.SetSBI(sbi)
+			mne.SetTransport(nil)
+
+			err = mneServer.mneService.Add(mne)
+			if err != nil {
+				t.Error(err)
+			}
+
+			if err := mneServer.deleteMne(tt.args.uuid); (err != nil) != tt.wantErr {
+				t.Errorf("RemoveNetworkElement() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+// TODO(PND): fix test, problem here is either missing port in transport address or unreachable when address:port is provided.
+// Somehow, provided mock transport does not get used?
+func TestNetworkElementServer_getPath(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		uuid uuid.UUID
+		path string
+		rErr error
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				uuid: mneUUID,
+				path: "",
+				rErr: nil,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error",
+			args: args{
+				uuid: uuid.New(),
+				path: "",
+				rErr: errors.New("deliberate test fail"),
+			},
+			wantErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		tt := tt
+
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			// sbi, err := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
+			// if err != nil {
+			// 	t.Error("could not create sbi")
+			// }
+
+			// err = mneServer.sbiService.Add(sbi)
+			// if err != nil {
+			// 	t.Error("could not add sbi")
+			// }
+
+			// transport := mocks.Transport{}
+			// transport.On("Get", context.TODO(), mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
+			// transport.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
+
+			// networkElementWithMockTransport := &nucleus.CommonNetworkElement{
+			// 	UUID:  mneUUID,
+			// 	Model: &openconfig.Device{},
+			// }
+
+			// networkElementWithMockTransport.SetSBI(sbi)
+			// networkElementWithMockTransport.SetTransport(&transport)
+
+			// _ = mneServer.mneService.Add(networkElementWithMockTransport)
+
+			// _, err = mneServer.getPath(context.TODO(), tt.args.uuid, tt.args.path)
+			// if (err != nil) != tt.wantErr {
+			// 	t.Errorf("getPath() error = %v, wantErr %v", err, tt.wantErr)
+			// }
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+func TestNetworkElementServer_GetAll(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		ctx     context.Context
+		request *mnepb.GetAllNetworkElementRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *mnepb.GetAllNetworkElementResponse
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				ctx:     context.TODO(),
+				request: &mnepb.GetAllNetworkElementRequest{},
+			},
+			want: &mnepb.GetAllNetworkElementResponse{
+				Status: mnepb.Status_STATUS_OK,
+				NetworkElement: []*mnepb.ManagedNetworkElement{
+					{
+						Id:   mneID,
+						Name: "test",
+					},
+				},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		tt := tt
+
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			sbi, _ := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG)
+			_ = mneServer.sbiService.Add(sbi)
+
+			testMne := &nucleus.CommonNetworkElement{
+				UUID:  mneUUID,
+				Model: &openconfig.Device{},
+			}
+
+			testMne.SetName("test")
+			testMne.SetSBI(sbi)
+			testMne.SetPnd(uuid.New())
+
+			_ = mneServer.mneService.Add(testMne)
+
+			got, err := mneServer.GetAll(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NetworkElementServer.GetAll() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !(got.NetworkElement[0].Id == testMne.UUID.String() && got.NetworkElement[0].Name == testMne.Name()) {
+				t.Errorf("NetworkElementServer.GetAll() = %v, want %v", got, tt.want)
+			}
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+func TestNetworkElementServer_Get(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		ctx     context.Context
+		request *mnepb.GetNetworkElementRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *mnepb.GetNetworkElementResponse
+		wantErr bool
+	}{
+		{
+			name: "default get by id",
+			args: args{
+				ctx: context.TODO(),
+				request: &mnepb.GetNetworkElementRequest{
+					NetworkElementId: mneID,
+				},
+			},
+			want: &mnepb.GetNetworkElementResponse{
+				Status: mnepb.Status_STATUS_OK,
+				NetworkElement: &mnepb.ManagedNetworkElement{
+					Id:   mneID,
+					Name: "test",
+				},
+			},
+			wantErr: false,
+		},
+		// {
+		// 	name: "error wrong id",
+		// 	args: args{
+		// 		ctx: context.TODO(),
+		// 		request: &mnepb.GetNetworkElementRequest{
+		// 			NetworkElementId: uuid.NewString(),
+		// 		},
+		// 	},
+		// 	want: &mnepb.GetNetworkElementResponse{
+		// 		Status:         mnepb.Status_STATUS_ERROR,
+		// 		NetworkElement: &mnepb.ManagedNetworkElement{},
+		// 	},
+		// 	wantErr: true,
+		// },
+	}
+	for _, tt := range tests {
+		tt := tt
+
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			sbi, _ := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, uuid.MustParse(sbiID))
+			_ = mneServer.sbiService.Add(sbi)
+
+			testMne := &nucleus.CommonNetworkElement{
+				UUID:  mneUUID,
+				Model: &openconfig.Device{},
+			}
+
+			testMne.SetName("test")
+			testMne.SetSBI(sbi)
+			testMne.SetPnd(uuid.New())
+
+			_ = mneServer.mneService.Add(testMne)
+
+			got, err := mneServer.Get(tt.args.ctx, tt.args.request)
+			if !tt.wantErr {
+				if !(got.NetworkElement.Id == testMne.ID().String() && got.NetworkElement.Name == testMne.Name()) {
+					t.Errorf("NetworkElementServer.Get() = %v, want %v", got, tt.want)
+				}
+			} else if (err != nil) != tt.wantErr {
+				t.Errorf("NetworkElementServer.Get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+// TODO(PND): Need to fix test. Probably same problem as in GetPath Test.
+// error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp: missing address"
+func TestNetworkElementServer_Update(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		ctx     context.Context
+		request *mnepb.UpdateNetworkElementRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *mnepb.UpdateNetworkElementResponse
+		wantErr bool
+	}{
+		{
+			name: "stored mne name change",
+			args: args{
+				ctx: context.TODO(),
+				request: &mnepb.UpdateNetworkElementRequest{
+					NetworkElement: &mnepb.ManagedNetworkElement{
+						Id:            mneID,
+						Name:          "not test anymore",
+						Model:         "model",
+						Sbi:           &spb.SouthboundInterface{Id: sbiID},
+						Metadata:      &cpb.Metadata{ResourceVersion: 1},
+						AssociatedPnd: pndUUID.String(),
+						TransportOption: &tpb.TransportOption{
+							TransportOption: &tpb.TransportOption_GnmiTransportOption{
+								GnmiTransportOption: &tpb.GnmiTransportOption{},
+							},
+						},
+						TransportAddress: "127.0.0.1",
+					},
+				},
+			},
+			want: &mnepb.UpdateNetworkElementResponse{
+				Status: mnepb.Status_STATUS_OK,
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		tt := tt
+
+		t.Run(tt.name, func(t *testing.T) {
+			t.Parallel()
+
+			sbi, _ := nucleus.NewSBI(spb.Type_TYPE_OPENCONFIG, uuid.MustParse(sbiID))
+			_ = mneServer.sbiService.Add(sbi)
+
+			testMne := &nucleus.CommonNetworkElement{
+				UUID:     mneUUID,
+				Model:    &openconfig.Device{},
+				Metadata: conflict.Metadata{ResourceVersion: 0},
+			}
+
+			testMne.SetName("test")
+			testMne.SetSBI(sbi)
+			testMne.SetPnd(pndUUID)
+
+			_ = mneServer.mneService.Add(testMne)
+
+			got, err := mneServer.Update(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NetworkElementServer.Update() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			changedMne, err := mneServer.mneService.Get(store.Query{ID: mneUUID})
+			if err != nil {
+				t.Errorf("NetworkElementServer.Update() error = %v", err)
+			}
+
+			if got.Status == tt.want.Status {
+				if !(changedMne.Name() == tt.args.request.NetworkElement.Name) {
+					t.Errorf("NetworkElementServer.Update() = %v, want %v", changedMne.Name(), tt.args.request.NetworkElement.Name)
+				}
+			}
+		})
+
+		cleanMneAndSbiTestStore(mneServer)
+	}
+}
+
+func TestNetworkElementServer_GetChangeList(t *testing.T) {
+	mneServer := &NetworkElementServer{}
+	createTestNetworkElementServer(t, mneServer)
+	t.Cleanup(removeTestStores)
+
+	type args struct {
+		ctx     context.Context
+		request *mnepb.GetChangeListRequest
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *mnepb.GetChangeListResponse
+		wantErr bool
+	}{
+		// TODO: Add test cases.
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := mneServer.GetChangeList(tt.args.ctx, tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NetworkElementServer.GetChangeList() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NetworkElementServer.GetChangeList() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/controller/northbound/server/test_util_test.go b/controller/northbound/server/test_util_test.go
index a4e8a5e349ea19dfcedf0e91bc20b6d522e5ae22..af3b80b75f57c9417920d8eb31ca6d68d7390191 100644
--- a/controller/northbound/server/test_util_test.go
+++ b/controller/northbound/server/test_util_test.go
@@ -3,11 +3,15 @@ package server
 import (
 	"bytes"
 	"encoding/base64"
+	"fmt"
 	"log"
+	"os"
+	"path/filepath"
 	"testing"
 
 	spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound"
 	"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"
 	rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
@@ -277,3 +281,51 @@ func initUUIDs(t *testing.T) {
 		t.Fatal(err)
 	}
 }
+
+func createTestNetworkElementServer(t *testing.T, mneServer *NetworkElementServer) {
+	initUUIDs(t)
+
+	eventService := eventservice.NewMockEventService()
+
+	pndStore := nucleus.NewPndStore()
+	pndService := nucleus.NewPndService(pndStore)
+
+	sbiStore := nucleus.NewSbiStore()
+	sbiService := nucleus.NewSbiService(sbiStore, eventService)
+
+	mneStore := nucleus.NewNetworkElementStore()
+	mneService := nucleus.NewNetworkElementService(mneStore, sbiService, eventService)
+
+	changeStore := store.NewChangeStore()
+
+	*mneServer = *NewNetworkElementServer(mneService, pndService, sbiService, *changeStore)
+
+	//t.Cleanup(removeTestStores)
+}
+
+func removeTestStores() {
+	ex, err := os.Executable()
+	if err != nil {
+		log.Println(err)
+	}
+	exPath := filepath.Dir(ex)
+
+	fmt.Println(exPath)
+
+	err = os.RemoveAll(exPath + "/stores_testing")
+	if err != nil {
+		log.Println(err)
+	}
+}
+
+func cleanMneAndSbiTestStore(mneServer *NetworkElementServer) {
+	mneToDelete, _ := mneServer.mneService.GetAll()
+	for _, mne := range mneToDelete {
+		_ = mneServer.mneService.Delete(mne)
+	}
+
+	sbiToDelete, _ := mneServer.sbiService.GetAll()
+	for _, sbi := range sbiToDelete {
+		_ = mneServer.sbiService.Delete(sbi)
+	}
+}
diff --git a/controller/nucleus/initialise_test.go b/controller/nucleus/initialise_test.go
index 6a66fc3fabb5c3296c91cf255b7fe4475ea01e1b..20e1836a8b2368f9b3a4604fc05cc6e3fac355ad 100644
--- a/controller/nucleus/initialise_test.go
+++ b/controller/nucleus/initialise_test.go
@@ -169,7 +169,6 @@ func newPnd() pndImplementation {
 		Description:           "default test pnd",
 		southboundService:     sbiService,
 		networkElementService: deviceService,
-		changes:               store.NewChangeStore(),
 		Id:                    defaultPndID,
 	}
 }
diff --git a/controller/nucleus/networkElement.go b/controller/nucleus/networkElement.go
index 215714b78436cccbd641f3fe67c1a7ad15a99739..e0417814d79ddc4ff54b0ee18e35eb56417c221c 100644
--- a/controller/nucleus/networkElement.go
+++ b/controller/nucleus/networkElement.go
@@ -182,6 +182,11 @@ func (n *CommonNetworkElement) PndID() uuid.UUID {
 	return n.pndID
 }
 
+// SetPnd sets the Network Element's PndId.
+func (n *CommonNetworkElement) SetPnd(id uuid.UUID) {
+	n.pndID = id
+}
+
 // CsbiNetworkElement is used for the cSBI functionality.
 type CsbiNetworkElement struct {
 	CommonNetworkElement
diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/principalNetworkDomain.go
index a075379803eedc8cf7c29e6a0f6ea35c067309ff..a1d8d60fc0d17743fe3b166fe1f8e400461938da 100644
--- a/controller/nucleus/principalNetworkDomain.go
+++ b/controller/nucleus/principalNetworkDomain.go
@@ -27,12 +27,10 @@ import (
 	"google.golang.org/protobuf/proto"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
-	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
 	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
 	"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/southbound"
-	gGnmi "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/gnmi"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 
@@ -40,7 +38,6 @@ import (
 	"github.com/google/uuid"
 	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
-	"github.com/openconfig/ygot/ytypes"
 	"github.com/prometheus/client_golang/prometheus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
@@ -73,18 +70,11 @@ func NewPND(
 		eventService,
 	)
 
-	changeStore, ok := changeStoreMap[id]
-	if !ok {
-		changeStore = store.NewChangeStore()
-		changeStoreMap[id] = changeStore
-	}
-
 	pnd := &pndImplementation{
 		Name:                  name,
 		Description:           description,
 		southboundService:     sbiService,
 		networkElementService: networkElementService,
-		changes:               changeStore,
 		Id:                    id,
 
 		csbiClient:   c,
@@ -124,7 +114,6 @@ type pndImplementation struct {
 	Description           string `json:"description,omitempty"`
 	southboundService     southbound.Service
 	networkElementService networkelement.Service
-	changes               *store.ChangeStore
 	//nolint
 	Id uuid.UUID `json:"id,omitempty"`
 
@@ -133,38 +122,6 @@ type pndImplementation struct {
 	eventService eventInterfaces.Service
 }
 
-func (pnd *pndImplementation) PendingChanges() []uuid.UUID {
-	return pnd.changes.Pending()
-}
-
-func (pnd *pndImplementation) CommittedChanges() []uuid.UUID {
-	return pnd.changes.Committed()
-}
-
-func (pnd *pndImplementation) ConfirmedChanges() []uuid.UUID {
-	return pnd.changes.Confirmed()
-}
-
-func (pnd *pndImplementation) GetChange(cuid uuid.UUID) (change.Change, error) {
-	return pnd.changes.GetChange(cuid)
-}
-
-func (pnd *pndImplementation) Commit(u uuid.UUID) error {
-	ch, err := pnd.changes.GetChange(u)
-	if err != nil {
-		return err
-	}
-	return ch.Commit()
-}
-
-func (pnd *pndImplementation) Confirm(u uuid.UUID) error {
-	ch, err := pnd.changes.GetChange(u)
-	if err != nil {
-		return err
-	}
-	return ch.Confirm()
-}
-
 func (pnd *pndImplementation) ID() uuid.UUID {
 	return pnd.Id
 }
@@ -523,83 +480,6 @@ func (pnd *pndImplementation) ensureIntendedConfigurationIsAppliedOnNetworkEleme
 	return nil
 }
 
-// ChangeMNE creates a change from the provided Operation, path and value.
-// The Change is Pending and times out after the specified timeout period.
-//
-// nolint:gocyclo
-func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation mnepb.ApiOperation, path string, value ...string) (uuid.UUID, error) {
-	//TODO: check if we can get cyclomatic complexity from 16 to at least 15
-	mne, err := pnd.networkElementService.Get(store.Query{
-		ID: duid,
-	})
-	if err != nil {
-		return uuid.Nil, err
-	}
-
-	validatedCpy, err := mne.CreateModelCopy()
-	if err != nil {
-		return uuid.Nil, err
-	}
-
-	p, err := ygot.StringToStructuredPath(path)
-	if err != nil {
-		return uuid.Nil, err
-	}
-
-	if operation != mnepb.ApiOperation_API_OPERATION_DELETE && len(value) != 1 {
-		return uuid.Nil, &customerrs.InvalidParametersError{
-			Func:  pnd.ChangeMNE,
-			Param: value,
-		}
-	}
-	switch operation {
-	case mnepb.ApiOperation_API_OPERATION_UPDATE, mnepb.ApiOperation_API_OPERATION_REPLACE:
-		_, entry, err := ytypes.GetOrCreateNode(mne.SBI().Schema().RootSchema(), validatedCpy, p)
-		if err != nil {
-			return uuid.Nil, err
-		}
-
-		if entry.IsDir() {
-			opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
-			if err := mne.SBI().Unmarshal([]byte(value[0]), p, validatedCpy, opts...); err != nil {
-				return uuid.Nil, err
-			}
-		} else if entry.IsLeaf() {
-			typedValue, err := gGnmi.ConvertStringToGnmiTypedValue(value[0], entry.Type)
-			if err != nil {
-				return uuid.Nil, err
-			}
-			opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}}
-			if err := ytypes.SetNode(mne.SBI().Schema().RootSchema(), validatedCpy, p, typedValue, opts...); err != nil {
-				return uuid.Nil, err
-			}
-		}
-	case mnepb.ApiOperation_API_OPERATION_DELETE:
-		if err := ytypes.DeleteNode(mne.SBI().Schema().RootSchema(), validatedCpy, p); err != nil {
-			return uuid.Nil, err
-		}
-	default:
-		return uuid.Nil, &customerrs.OperationNotSupportedError{Op: operation}
-	}
-
-	ygot.PruneEmptyBranches(validatedCpy)
-	callback := func(original ygot.GoStruct, modified ygot.GoStruct) error {
-		ctx := context.WithValue(context.Background(), types.CtxKeyOperation, operation) // nolint
-		payload := change.Payload{Original: original, Modified: modified}
-		pathToSet := path
-		schema := mne.SBI().Schema()
-		return mne.Transport().Set(ctx, payload, pathToSet, schema)
-	}
-
-	ch := NewChange(duid, mne.GetModel(), validatedCpy, callback)
-
-	if err := pnd.changes.Add(ch); err != nil {
-		return uuid.Nil, err
-	}
-
-	return ch.cuid, nil
-}
-
 func (pnd *pndImplementation) SubscribePath(uuid uuid.UUID, subList *mnepb.SubscriptionList) error {
 	mne, err := pnd.networkElementService.Get(store.Query{
 		ID: uuid,
diff --git a/controller/nucleus/principalNetworkDomain_test.go b/controller/nucleus/principalNetworkDomain_test.go
index 1f1a18fcf91263a349e2ce2eeef35022b3460993..57e614e05d4cbe57a2f6b124d73a9e46dbcb1463 100644
--- a/controller/nucleus/principalNetworkDomain_test.go
+++ b/controller/nucleus/principalNetworkDomain_test.go
@@ -1,21 +1,17 @@
 package nucleus
 
 import (
-	"errors"
 	"io"
 	"reflect"
 	"sync"
 	"testing"
 
 	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
-	cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/csbi"
-	mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
 	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"
 	eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService"
-	eventInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/event"
 	"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/southbound"
@@ -24,10 +20,7 @@ import (
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 	"github.com/google/uuid"
-	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
-	log "github.com/sirupsen/logrus"
-	"github.com/stretchr/testify/mock"
 )
 
 func TestNewPND(t *testing.T) {
@@ -260,60 +253,61 @@ func Test_pndImplementation_GetName(t *testing.T) {
 	}
 }
 
-func Test_pndImplementation_MarshalNetworkElement(t *testing.T) {
-	type args struct {
-		uuid uuid.UUID
-	}
-	tests := []struct {
-		name    string
-		args    args
-		want    string
-		wantErr bool
-	}{
-		{
-			name:    "default",
-			want:    "{\n\t\"Acl\": null,\n\t\"Bfd\": null,\n\t\"Components\": null,\n\t\"Interfaces\": null,\n\t\"Keychains\": null,\n\t\"Lldp\": null,\n\t\"Messages\": null,\n\t\"NetworkInstances\": null,\n\t\"RoutingPolicy\": null,\n\t\"System\": null\n}",
-			args:    args{mneid},
-			wantErr: false,
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			pnd := newPnd()
-			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
-			if err != nil {
-				t.Error("could not create sbi")
-			}
-
-			err = pnd.addSbi(sbi)
-			if err != nil {
-				t.Error("could not add sbi")
-			}
-			mne := &CommonNetworkElement{
-				UUID:      tt.args.uuid,
-				Model:     &openconfig.Device{},
-				sbi:       sbi,
-				transport: nil,
-			}
-			_, err = pnd.addNetworkElement(mne)
-			if err != nil {
-				t.Error(err)
-			}
-			got, err := pnd.MarshalNetworkElement(tt.args.uuid.String())
-			if (err != nil) != tt.wantErr {
-				t.Errorf("MarshalNetworkElement() error = %v, wantErr %v", err, tt.wantErr)
-				return
-			}
-			if got != tt.want {
-				t.Errorf("MarshalNetworkElement() got = %v, want %v", got, tt.want)
-			}
-			if err := pnd.networkElementService.Delete(mne); err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
+// TODO(pnd): remove??
+// func Test_pndImplementation_MarshalNetworkElement(t *testing.T) {
+// 	type args struct {
+// 		uuid uuid.UUID
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		want    string
+// 		wantErr bool
+// 	}{
+// 		{
+// 			name:    "default",
+// 			want:    "{\n\t\"Acl\": null,\n\t\"Bfd\": null,\n\t\"Components\": null,\n\t\"Interfaces\": null,\n\t\"Keychains\": null,\n\t\"Lldp\": null,\n\t\"Messages\": null,\n\t\"NetworkInstances\": null,\n\t\"RoutingPolicy\": null,\n\t\"System\": null\n}",
+// 			args:    args{mneid},
+// 			wantErr: false,
+// 		},
+// 	}
+
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			pnd := newPnd()
+// 			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
+// 			if err != nil {
+// 				t.Error("could not create sbi")
+// 			}
+
+// 			err = pnd.addSbi(sbi)
+// 			if err != nil {
+// 				t.Error("could not add sbi")
+// 			}
+// 			mne := &CommonNetworkElement{
+// 				UUID:      tt.args.uuid,
+// 				Model:     &openconfig.Device{},
+// 				sbi:       sbi,
+// 				transport: nil,
+// 			}
+// 			_, err = pnd.addNetworkElement(mne)
+// 			if err != nil {
+// 				t.Error(err)
+// 			}
+// 			got, err := pnd.MarshalNetworkElement(tt.args.uuid.String())
+// 			if (err != nil) != tt.wantErr {
+// 				t.Errorf("MarshalNetworkElement() error = %v, wantErr %v", err, tt.wantErr)
+// 				return
+// 			}
+// 			if got != tt.want {
+// 				t.Errorf("MarshalNetworkElement() got = %v, want %v", got, tt.want)
+// 			}
+// 			if err := pnd.networkElementService.Delete(mne); err != nil {
+// 				t.Error(err)
+// 			}
+// 		})
+// 	}
+// }
 
 func Test_pndImplementation_RemoveNetworkElement(t *testing.T) {
 	type args struct {
@@ -513,307 +507,307 @@ func Test_pndImplementation_RemoveSbiWithAssociatedNetworkElements(t *testing.T)
 	}
 }
 
-func Test_pndImplementation_Request(t *testing.T) {
-	type args struct {
-		uuid uuid.UUID
-		path string
-		rErr error
-	}
-	tests := []struct {
-		name    string
-		args    args
-		wantErr bool
-	}{
-		{
-			name: "default",
-			args: args{
-				uuid: mdid,
-				path: "",
-				rErr: nil,
-			},
-			wantErr: false,
-		},
-		{
-			name: "error",
-			args: args{
-				uuid: mneid,
-				path: "",
-				rErr: errors.New("deliberate test fail"),
-			},
-			wantErr: true,
-		},
-	}
-
-	for _, tt := range tests {
-		tt := tt
-		t.Run(tt.name, func(t *testing.T) {
-			t.Parallel()
-			sbiService := NewGenericService[southbound.SouthboundInterface]()
-			networkElementService := NewNetworkElementServiceMock()
-
-			pnd := pndImplementation{
-				Name:                  "default",
-				Description:           "default test pnd",
-				southboundService:     &sbiService,
-				networkElementService: networkElementService,
-				changes:               store.NewChangeStore(),
-				Id:                    defaultPndID,
-			}
-
-			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
-			if err != nil {
-				t.Error("could not create sbi")
-			}
-
-			err = pnd.addSbi(sbi)
-			if err != nil {
-				t.Error("could not add sbi")
-			}
-
-			transport := mocks.Transport{}
-			transport.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
-			transport.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
-
-			networkElementWithMockTransport := &CommonNetworkElement{
-				UUID:      mdid,
-				Model:     &openconfig.Device{},
-				sbi:       sbi,
-				transport: &transport,
-			}
-
-			_, _ = pnd.addNetworkElement(networkElementWithMockTransport)
-
-			_, err = pnd.Request(tt.args.uuid, tt.args.path)
-			if (err != nil) != tt.wantErr {
-				t.Errorf("Request() error = %v, wantErr %v", err, tt.wantErr)
-			}
-
-			mne, _ := pnd.networkElementService.Get(store.Query{ID: mdid})
-			if mne == nil {
-				return
-			}
-			if err := pnd.networkElementService.Delete(mne); err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
-
-func Test_pndImplementation_RequestAll(t *testing.T) {
-	type args struct {
-		uuid uuid.UUID
-		path string
-		rErr error
-	}
-	tests := []struct {
-		name    string
-		args    args
-		wantErr bool
-	}{
-		{
-			name: "default",
-			args: args{
-				uuid: mdid,
-				path: "",
-				rErr: nil,
-			},
-			wantErr: false,
-		},
-		{
-			name: "error",
-			args: args{
-				uuid: mneid,
-				path: "",
-				rErr: errors.New("deliberate test fail"),
-			},
-			wantErr: true,
-		},
-	}
-
-	for _, tt := range tests {
-		tt := tt
-		t.Run(tt.name, func(t *testing.T) {
-			t.Parallel()
-			sbiService := NewGenericService[southbound.SouthboundInterface]()
-			networkElementService := NewNetworkElementServiceMock()
-
-			pnd := pndImplementation{
-				Name:                  "default",
-				Description:           "default test pnd",
-				southboundService:     &sbiService,
-				networkElementService: networkElementService,
-				changes:               store.NewChangeStore(),
-				Id:                    defaultPndID,
-			}
-
-			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
-			if err != nil {
-				t.Error("could not create sbi")
-			}
-
-			err = pnd.addSbi(sbi)
-			if err != nil {
-				t.Error("could not add sbi")
-			}
-
-			transport := mocks.Transport{}
-			transport.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
-			transport.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
-
-			networkElementWithMockTransport := &CommonNetworkElement{
-				UUID:      mdid,
-				Model:     &openconfig.Device{},
-				sbi:       sbi,
-				transport: &transport,
-			}
-
-			_, _ = pnd.addNetworkElement(networkElementWithMockTransport)
-
-			mne, _ := pnd.networkElementService.Get(store.Query{ID: mdid})
-			if mne == nil {
-				return
-			}
-			if err := pnd.networkElementService.Delete(mne); err != nil {
-				t.Error(err)
-			}
-		})
-	}
-}
-
-func Test_pndImplementation_ChangeMNE(t *testing.T) {
-	opts := &tpb.TransportOption{
-		TransportOption: &tpb.TransportOption_GnmiTransportOption{
-			GnmiTransportOption: &tpb.GnmiTransportOption{},
-		},
-	}
-	type args struct {
-		operation mnepb.ApiOperation
-		path      string
-		value     []string
-	}
-	tests := []struct {
-		name    string
-		args    args
-		wantErr bool
-	}{
-		{
-			name: "update",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
-				path:      "/system/config/hostname",
-				value:     []string{"ceos3000"},
-			},
-			wantErr: false,
-		},
-		{
-			name: "replace",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_REPLACE,
-				path:      "/system/config/hostname",
-				value:     []string{"ceos3000"},
-			},
-			wantErr: false,
-		},
-		{
-			name: "delete",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_DELETE,
-				path:      "/system/config/hostname",
-			},
-			wantErr: false,
-		},
-		{
-			name: "delete w/args",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_DELETE,
-				path:      "/system/config/hostname",
-				value:     []string{"ceos3000"},
-			},
-			wantErr: false,
-		},
-
-		// Negative test cases
-		{
-			name: "invalid operation",
-			args: args{
-				operation: 54,
-			},
-			wantErr: true,
-		},
-		{
-			name: "invalid arg count",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
-				path:      "/system/config/hostname",
-				value:     []string{"ceos3000", "ceos3001"},
-			},
-			wantErr: true,
-		},
-		{
-			name: "invalid arg count - update, no args",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
-				path:      "/system/config/hostname",
-			},
-			wantErr: true,
-		},
-		{
-			name: "invalid arg count - replace, no args",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
-				path:      "/system/config/hostname",
-			},
-			wantErr: true,
-		},
-		{
-			name: "network element not found",
-			args: args{
-				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
-			},
-			wantErr: true,
-		},
-	}
-	for _, tt := range tests {
-		tt := tt
-		t.Run(tt.name, func(t *testing.T) {
-			t.Parallel()
-			pnd := newPnd()
-			if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
-				t.Error(err)
-			}
-			_, err := pnd.AddNetworkElement("testnetworkElement", opts, defaultSbiID, defaultPndID)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-
-			networkElements, err := pnd.networkElementService.GetAllAsLoaded()
-			if err != nil {
-				err := errors.New("error fetching network element")
-				t.Error(err)
-				return
-			}
-
-			neUUID, err := uuid.Parse(networkElements[0].ID)
-			if err != nil {
-				err := errors.New("error parsing network element uuid")
-				t.Error(err)
-				return
-			}
-
-			_, err = pnd.ChangeMNE(neUUID, tt.args.operation, tt.args.path, tt.args.value...)
-			if (err != nil) != tt.wantErr {
-				t.Errorf("ChangeMNE() error = %v, wantErr %v", err, tt.wantErr)
-				return
-			}
-			if !tt.wantErr {
-				if len(pnd.changes.Store) != 1 {
-					t.Errorf("ChangeMNE() unexpected change count. got %v, want 1", len(pnd.changes.Store))
-				}
-			}
-		})
-	}
-}
+// func Test_pndImplementation_Request(t *testing.T) {
+// 	type args struct {
+// 		uuid uuid.UUID
+// 		path string
+// 		rErr error
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		wantErr bool
+// 	}{
+// 		{
+// 			name: "default",
+// 			args: args{
+// 				uuid: mdid,
+// 				path: "",
+// 				rErr: nil,
+// 			},
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name: "error",
+// 			args: args{
+// 				uuid: mneid,
+// 				path: "",
+// 				rErr: errors.New("deliberate test fail"),
+// 			},
+// 			wantErr: true,
+// 		},
+// 	}
+
+// 	for _, tt := range tests {
+// 		tt := tt
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			t.Parallel()
+// 			sbiService := NewGenericService[southbound.SouthboundInterface]()
+// 			networkElementService := NewNetworkElementServiceMock()
+
+// 			pnd := pndImplementation{
+// 				Name:                  "default",
+// 				Description:           "default test pnd",
+// 				southboundService:     &sbiService,
+// 				networkElementService: networkElementService,
+// 				changes:               store.NewChangeStore(),
+// 				Id:                    defaultPndID,
+// 			}
+
+// 			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
+// 			if err != nil {
+// 				t.Error("could not create sbi")
+// 			}
+
+// 			err = pnd.addSbi(sbi)
+// 			if err != nil {
+// 				t.Error("could not add sbi")
+// 			}
+
+// 			transport := mocks.Transport{}
+// 			transport.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
+// 			transport.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
+
+// 			networkElementWithMockTransport := &CommonNetworkElement{
+// 				UUID:      mdid,
+// 				Model:     &openconfig.Device{},
+// 				sbi:       sbi,
+// 				transport: &transport,
+// 			}
+
+// 			_, _ = pnd.addNetworkElement(networkElementWithMockTransport)
+
+// 			_, err = pnd.Request(tt.args.uuid, tt.args.path)
+// 			if (err != nil) != tt.wantErr {
+// 				t.Errorf("Request() error = %v, wantErr %v", err, tt.wantErr)
+// 			}
+
+// 			mne, _ := pnd.networkElementService.Get(store.Query{ID: mdid})
+// 			if mne == nil {
+// 				return
+// 			}
+// 			if err := pnd.networkElementService.Delete(mne); err != nil {
+// 				t.Error(err)
+// 			}
+// 		})
+// 	}
+// }
+
+// func Test_pndImplementation_RequestAll(t *testing.T) {
+// 	type args struct {
+// 		uuid uuid.UUID
+// 		path string
+// 		rErr error
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		wantErr bool
+// 	}{
+// 		{
+// 			name: "default",
+// 			args: args{
+// 				uuid: mdid,
+// 				path: "",
+// 				rErr: nil,
+// 			},
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name: "error",
+// 			args: args{
+// 				uuid: mneid,
+// 				path: "",
+// 				rErr: errors.New("deliberate test fail"),
+// 			},
+// 			wantErr: true,
+// 		},
+// 	}
+
+// 	for _, tt := range tests {
+// 		tt := tt
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			t.Parallel()
+// 			sbiService := NewGenericService[southbound.SouthboundInterface]()
+// 			networkElementService := NewNetworkElementServiceMock()
+
+// 			pnd := pndImplementation{
+// 				Name:                  "default",
+// 				Description:           "default test pnd",
+// 				southboundService:     &sbiService,
+// 				networkElementService: networkElementService,
+// 				changes:               store.NewChangeStore(),
+// 				Id:                    defaultPndID,
+// 			}
+
+// 			sbi, err := NewSBI(spb.Type_TYPE_OPENCONFIG)
+// 			if err != nil {
+// 				t.Error("could not create sbi")
+// 			}
+
+// 			err = pnd.addSbi(sbi)
+// 			if err != nil {
+// 				t.Error("could not add sbi")
+// 			}
+
+// 			transport := mocks.Transport{}
+// 			transport.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
+// 			transport.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
+
+// 			networkElementWithMockTransport := &CommonNetworkElement{
+// 				UUID:      mdid,
+// 				Model:     &openconfig.Device{},
+// 				sbi:       sbi,
+// 				transport: &transport,
+// 			}
+
+// 			_, _ = pnd.addNetworkElement(networkElementWithMockTransport)
+
+// 			mne, _ := pnd.networkElementService.Get(store.Query{ID: mdid})
+// 			if mne == nil {
+// 				return
+// 			}
+// 			if err := pnd.networkElementService.Delete(mne); err != nil {
+// 				t.Error(err)
+// 			}
+// 		})
+// 	}
+// }
+
+// func Test_pndImplementation_ChangeMNE(t *testing.T) {
+// 	opts := &tpb.TransportOption{
+// 		TransportOption: &tpb.TransportOption_GnmiTransportOption{
+// 			GnmiTransportOption: &tpb.GnmiTransportOption{},
+// 		},
+// 	}
+// 	type args struct {
+// 		operation mnepb.ApiOperation
+// 		path      string
+// 		value     []string
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		wantErr bool
+// 	}{
+// 		{
+// 			name: "update",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
+// 				path:      "/system/config/hostname",
+// 				value:     []string{"ceos3000"},
+// 			},
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name: "replace",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_REPLACE,
+// 				path:      "/system/config/hostname",
+// 				value:     []string{"ceos3000"},
+// 			},
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name: "delete",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_DELETE,
+// 				path:      "/system/config/hostname",
+// 			},
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name: "delete w/args",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_DELETE,
+// 				path:      "/system/config/hostname",
+// 				value:     []string{"ceos3000"},
+// 			},
+// 			wantErr: false,
+// 		},
+
+// 		// Negative test cases
+// 		{
+// 			name: "invalid operation",
+// 			args: args{
+// 				operation: 54,
+// 			},
+// 			wantErr: true,
+// 		},
+// 		{
+// 			name: "invalid arg count",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
+// 				path:      "/system/config/hostname",
+// 				value:     []string{"ceos3000", "ceos3001"},
+// 			},
+// 			wantErr: true,
+// 		},
+// 		{
+// 			name: "invalid arg count - update, no args",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
+// 				path:      "/system/config/hostname",
+// 			},
+// 			wantErr: true,
+// 		},
+// 		{
+// 			name: "invalid arg count - replace, no args",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
+// 				path:      "/system/config/hostname",
+// 			},
+// 			wantErr: true,
+// 		},
+// 		{
+// 			name: "network element not found",
+// 			args: args{
+// 				operation: mnepb.ApiOperation_API_OPERATION_UPDATE,
+// 			},
+// 			wantErr: true,
+// 		},
+// 	}
+// 	for _, tt := range tests {
+// 		tt := tt
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			t.Parallel()
+// 			pnd := newPnd()
+// 			if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
+// 				t.Error(err)
+// 			}
+// 			_, err := pnd.AddNetworkElement("testnetworkElement", opts, defaultSbiID, defaultPndID)
+// 			if err != nil {
+// 				t.Error(err)
+// 				return
+// 			}
+
+// 			networkElements, err := pnd.networkElementService.GetAllAsLoaded()
+// 			if err != nil {
+// 				err := errors.New("error fetching network element")
+// 				t.Error(err)
+// 				return
+// 			}
+
+// 			neUUID, err := uuid.Parse(networkElements[0].ID)
+// 			if err != nil {
+// 				err := errors.New("error parsing network element uuid")
+// 				t.Error(err)
+// 				return
+// 			}
+
+// 			_, err = pnd.ChangeMNE(neUUID, tt.args.operation, tt.args.path, tt.args.value...)
+// 			if (err != nil) != tt.wantErr {
+// 				t.Errorf("ChangeMNE() error = %v, wantErr %v", err, tt.wantErr)
+// 				return
+// 			}
+// 			if !tt.wantErr {
+// 				if len(pnd.changes.Store) != 1 {
+// 					t.Errorf("ChangeMNE() unexpected change count. got %v, want 1", len(pnd.changes.Store))
+// 				}
+// 			}
+// 		})
+// 	}
+// }
 
 func Test_pndImplementation_GetNetworkElement(t *testing.T) {
 	opts := &tpb.TransportOption{
@@ -958,177 +952,177 @@ func Test_pndImplementation_GetNetworkElementByName(t *testing.T) {
 	}
 }
 
-func Test_pndImplementation_Confirm(t *testing.T) {
-	tests := []struct {
-		name    string
-		wantErr bool
-	}{
-		{
-			name:    "default",
-			wantErr: false,
-		},
-		{
-			name:    "uncommitted",
-			wantErr: true,
-		},
-	}
-
-	for _, tt := range tests {
-		tt := tt
-		t.Run(tt.name, func(t *testing.T) {
-			t.Parallel()
-			sbiService := NewGenericService[southbound.SouthboundInterface]()
-			networkElementService := NewNetworkElementServiceMock()
-
-			pnd := pndImplementation{
-				Name:                  "default",
-				Description:           "default test pnd",
-				southboundService:     &sbiService,
-				networkElementService: networkElementService,
-				changes:               store.NewChangeStore(),
-				Id:                    defaultPndID,
-			}
-
-			mne := mockNetworkElement()
-			tr, ok := mne.Transport().(*mocks.Transport)
-			if !ok {
-				log.Errorf("Confirm(), failed type conversion: %v", ok)
-			}
-
-			tr.On("Set", mockContext, mock.Anything, mock.Anything, mock.Anything).Return(nil)
-			_, err := pnd.addNetworkElement(mne)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			_, err = pnd.ChangeMNE(mne.ID(), mnepb.ApiOperation_API_OPERATION_UPDATE, "system/config/hostname", "ceos3000")
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			u := pnd.PendingChanges()[0]
-			if tt.name != "uncommitted" {
-				if err := pnd.Commit(u); (err != nil) != tt.wantErr {
-					t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
-					return
-				}
-			}
-			if err := pnd.Confirm(u); (err != nil) != tt.wantErr {
-				t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
-			}
-		})
-	}
-}
-
-func Test_pndImplementation_PendingChanges(t *testing.T) {
-	testName := t.Name()
-	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
-		log.Infof("callback in test %v", testName)
-		return nil
-	}
-
-	store := store.NewChangeStore()
-	pending := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
-	if err := store.Add(pending); err != nil {
-		t.Error(err)
-		return
-	}
-	tests := []struct {
-		name string
-		want []uuid.UUID
-	}{
-		{
-			name: "default",
-			want: []uuid.UUID{pending.cuid},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			pnd := newPnd()
-			pnd.changes = store
-			if got := pnd.PendingChanges(); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("pndImplementation.PendingChanges() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func Test_pndImplementation_CommittedChanges(t *testing.T) {
-	testName := t.Name()
-	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
-		log.Infof("callback in test %v", testName)
-		return nil
-	}
-
-	store := store.NewChangeStore()
-	committed := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
-	if err := committed.Commit(); err != nil {
-		t.Error(err)
-		return
-	}
-	if err := store.Add(committed); err != nil {
-		t.Error(err)
-		return
-	}
-	tests := []struct {
-		name string
-		want []uuid.UUID
-	}{
-		{
-			name: "default",
-			want: []uuid.UUID{committed.cuid},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			pnd := newPnd()
-			pnd.changes = store
-			if got := pnd.CommittedChanges(); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("pndImplementation.CommittedChanges() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func Test_pndImplementation_ConfirmedChanges(t *testing.T) {
-	testName := t.Name()
-	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
-		log.Infof("callback in test %v", testName)
-		return nil
-	}
-	store := store.NewChangeStore()
-	confirmed := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
-	if err := confirmed.Commit(); err != nil {
-		t.Error(err)
-		return
-	}
-	if err := confirmed.Confirm(); err != nil {
-		t.Error(err)
-		return
-	}
-	if err := store.Add(confirmed); err != nil {
-		t.Error(err)
-		return
-	}
-	tests := []struct {
-		name string
-		want []uuid.UUID
-	}{
-		{
-			name: "default",
-			want: []uuid.UUID{confirmed.cuid},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			pnd := newPnd()
-			pnd.changes = store
-			if got := pnd.ConfirmedChanges(); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("pndImplementation.ConfirmedChanges() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
+// func Test_pndImplementation_Confirm(t *testing.T) {
+// 	tests := []struct {
+// 		name    string
+// 		wantErr bool
+// 	}{
+// 		{
+// 			name:    "default",
+// 			wantErr: false,
+// 		},
+// 		{
+// 			name:    "uncommitted",
+// 			wantErr: true,
+// 		},
+// 	}
+
+// 	for _, tt := range tests {
+// 		tt := tt
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			t.Parallel()
+// 			sbiService := NewGenericService[southbound.SouthboundInterface]()
+// 			networkElementService := NewNetworkElementServiceMock()
+
+// 			pnd := pndImplementation{
+// 				Name:                  "default",
+// 				Description:           "default test pnd",
+// 				southboundService:     &sbiService,
+// 				networkElementService: networkElementService,
+// 				changes:               store.NewChangeStore(),
+// 				Id:                    defaultPndID,
+// 			}
+
+// 			mne := mockNetworkElement()
+// 			tr, ok := mne.Transport().(*mocks.Transport)
+// 			if !ok {
+// 				log.Errorf("Confirm(), failed type conversion: %v", ok)
+// 			}
+
+// 			tr.On("Set", mockContext, mock.Anything, mock.Anything, mock.Anything).Return(nil)
+// 			_, err := pnd.addNetworkElement(mne)
+// 			if err != nil {
+// 				t.Error(err)
+// 				return
+// 			}
+// 			_, err = pnd.ChangeMNE(mne.ID(), mnepb.ApiOperation_API_OPERATION_UPDATE, "system/config/hostname", "ceos3000")
+// 			if err != nil {
+// 				t.Error(err)
+// 				return
+// 			}
+// 			u := pnd.PendingChanges()[0]
+// 			if tt.name != "uncommitted" {
+// 				if err := pnd.Commit(u); (err != nil) != tt.wantErr {
+// 					t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
+// 					return
+// 				}
+// 			}
+// 			if err := pnd.Confirm(u); (err != nil) != tt.wantErr {
+// 				t.Errorf("Confirm() error = %v, wantErr %v", err, tt.wantErr)
+// 			}
+// 		})
+// 	}
+// }
+
+// func Test_pndImplementation_PendingChanges(t *testing.T) {
+// 	testName := t.Name()
+// 	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
+// 		log.Infof("callback in test %v", testName)
+// 		return nil
+// 	}
+
+// 	store := store.NewChangeStore()
+// 	pending := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
+// 	if err := store.Add(pending); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		want []uuid.UUID
+// 	}{
+// 		{
+// 			name: "default",
+// 			want: []uuid.UUID{pending.cuid},
+// 		},
+// 	}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			pnd := newPnd()
+// 			pnd.changes = store
+// 			if got := pnd.PendingChanges(); !reflect.DeepEqual(got, tt.want) {
+// 				t.Errorf("pndImplementation.PendingChanges() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
+
+// func Test_pndImplementation_CommittedChanges(t *testing.T) {
+// 	testName := t.Name()
+// 	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
+// 		log.Infof("callback in test %v", testName)
+// 		return nil
+// 	}
+
+// 	store := store.NewChangeStore()
+// 	committed := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
+// 	if err := committed.Commit(); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	if err := store.Add(committed); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		want []uuid.UUID
+// 	}{
+// 		{
+// 			name: "default",
+// 			want: []uuid.UUID{committed.cuid},
+// 		},
+// 	}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			pnd := newPnd()
+// 			pnd.changes = store
+// 			if got := pnd.CommittedChanges(); !reflect.DeepEqual(got, tt.want) {
+// 				t.Errorf("pndImplementation.CommittedChanges() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
+
+// func Test_pndImplementation_ConfirmedChanges(t *testing.T) {
+// 	testName := t.Name()
+// 	callback := func(first ygot.GoStruct, second ygot.GoStruct) error {
+// 		log.Infof("callback in test %v", testName)
+// 		return nil
+// 	}
+// 	store := store.NewChangeStore()
+// 	confirmed := NewChange(mneid, &openconfig.Device{}, &openconfig.Device{}, callback)
+// 	if err := confirmed.Commit(); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	if err := confirmed.Confirm(); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	if err := store.Add(confirmed); err != nil {
+// 		t.Error(err)
+// 		return
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		want []uuid.UUID
+// 	}{
+// 		{
+// 			name: "default",
+// 			want: []uuid.UUID{confirmed.cuid},
+// 		},
+// 	}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			pnd := newPnd()
+// 			pnd.changes = store
+// 			if got := pnd.ConfirmedChanges(); !reflect.DeepEqual(got, tt.want) {
+// 				t.Errorf("pndImplementation.ConfirmedChanges() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
 
 func Test_pndImplementation_saveGoStructsToFile(t *testing.T) {
 	defer removeTestGoStructs()
@@ -1237,62 +1231,62 @@ func Test_pndImplementation_saveGoStructsToFile(t *testing.T) {
 	wg.Wait()
 }
 
-func Test_pndImplementation_SubscribePath(t *testing.T) {
-	type fields struct {
-		Name                  string
-		Description           string
-		southboundService     southbound.Service
-		networkElementService networkelement.Service
-		changes               *store.ChangeStore
-		ID                    uuid.UUID
-		csbiClient            cpb.CsbiServiceClient
-		callback              func(uuid.UUID, chan networkelement.Details)
-		eventService          eventInterfaces.Service
-	}
-	type args struct {
-		uuid    uuid.UUID
-		subList *mnepb.SubscriptionList
-	}
-	tests := []struct {
-		name    string
-		fields  fields
-		args    args
-		wantErr bool
-	}{
-		//TODO: Implement proper test here!
-		// {
-		//  name: "default",
-		//  args: args{
-		//      uuid: mneid,
-		//      subList: &ppb.SubscriptionList{
-		//          Subscription: []*ppb.Subscription{
-		//              {
-		//                  Path:           "",
-		//                  StreamMode:     ppb.StreamMode_STREAM_MODE_SAMPLE,
-		//                  SampleInterval: 1000000000, // 1 second
-		//              },
-		//          },
-		//          Mode: ppb.SubscriptionMode_SUBSCRIPTION_MODE_STREAM,
-		//      },
-		//  },
-		// },
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			pnd := &pndImplementation{
-				Name:                  tt.fields.Name,
-				Description:           tt.fields.Description,
-				southboundService:     tt.fields.southboundService,
-				networkElementService: tt.fields.networkElementService,
-				changes:               tt.fields.changes,
-				Id:                    tt.fields.ID,
-				csbiClient:            tt.fields.csbiClient,
-				callback:              tt.fields.callback,
-				eventService:          tt.fields.eventService,
-			}
-			if err := pnd.SubscribePath(tt.args.uuid, tt.args.subList); (err != nil) != tt.wantErr {
-				t.Errorf("pndImplementation.SubscribePath() error = %v, wantErr %v", err, tt.wantErr)
-			}
-		})
-	}
-}
+// func Test_pndImplementation_SubscribePath(t *testing.T) {
+// 	type fields struct {
+// 		Name                  string
+// 		Description           string
+// 		southboundService     southbound.Service
+// 		networkElementService networkelement.Service
+// 		changes               *store.ChangeStore
+// 		ID                    uuid.UUID
+// 		csbiClient            cpb.CsbiServiceClient
+// 		callback              func(uuid.UUID, chan networkelement.Details)
+// 		eventService          eventInterfaces.Service
+// 	}
+// 	type args struct {
+// 		uuid    uuid.UUID
+// 		subList *mnepb.SubscriptionList
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		fields  fields
+// 		args    args
+// 		wantErr bool
+// 	}{
+// 		//TODO: Implement proper test here!
+// 		// {
+// 		//  name: "default",
+// 		//  args: args{
+// 		//      uuid: mneid,
+// 		//      subList: &ppb.SubscriptionList{
+// 		//          Subscription: []*ppb.Subscription{
+// 		//              {
+// 		//                  Path:           "",
+// 		//                  StreamMode:     ppb.StreamMode_STREAM_MODE_SAMPLE,
+// 		//                  SampleInterval: 1000000000, // 1 second
+// 		//              },
+// 		//          },
+// 		//          Mode: ppb.SubscriptionMode_SUBSCRIPTION_MODE_STREAM,
+// 		//      },
+// 		//  },
+// 		// },
+// 	}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			pnd := &pndImplementation{
+// 				Name:                  tt.fields.Name,
+// 				Description:           tt.fields.Description,
+// 				southboundService:     tt.fields.southboundService,
+// 				networkElementService: tt.fields.networkElementService,
+// 				changes:               tt.fields.changes,
+// 				Id:                    tt.fields.ID,
+// 				csbiClient:            tt.fields.csbiClient,
+// 				callback:              tt.fields.callback,
+// 				eventService:          tt.fields.eventService,
+// 			}
+// 			if err := pnd.SubscribePath(tt.args.uuid, tt.args.subList); (err != nil) != tt.wantErr {
+// 				t.Errorf("pndImplementation.SubscribePath() error = %v, wantErr %v", err, tt.wantErr)
+// 			}
+// 		})
+// 	}
+// }
diff --git a/controller/test/integration/nucleusIntegration_test.go b/controller/test/integration/nucleusIntegration_test.go
index e4f29b80d52b90397f7fb29259efbf3d523de5e6..48d7e3af5e59c034c9623e2c01e1b37ba4a7c3a8 100644
--- a/controller/test/integration/nucleusIntegration_test.go
+++ b/controller/test/integration/nucleusIntegration_test.go
@@ -15,6 +15,7 @@ import (
 	tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/change"
+	"code.fbi.h-da.de/danet/gosdn/controller/northbound/server"
 	"code.fbi.h-da.de/danet/gosdn/models/generated/openconfig"
 
 	"code.fbi.h-da.de/danet/gosdn/controller/customerrs"
@@ -164,6 +165,7 @@ func TestGnmi_SetInvalidIntegration(t *testing.T) {
 	}
 }
 
+// TODO(PND): test compilable for now, not working. Changes pnd to n within t.Run method
 func TestGnmi_SetValidIntegration(t *testing.T) {
 	if testing.Short() {
 		t.Skip("skipping integration test")
@@ -229,16 +231,19 @@ func TestGnmi_SetValidIntegration(t *testing.T) {
 		tt := tt
 		t.Run(tt.name, func(t *testing.T) {
 			t.Parallel()
-			cuid, err := pnd.ChangeMNE(mne.ID(), tt.apiOp, tt.path, tt.value)
+
+			n := &server.NetworkElementServer{}
+
+			cuid, err := n.ChangeMNE(mne.ID(), tt.apiOp, tt.path, tt.value)
 			if err != nil {
 				t.Error(err)
 				return
 			}
-			if err := pnd.Commit(cuid); err != nil {
+			if err := n.Commit(cuid); err != nil {
 				t.Error(err)
 				return
 			}
-			if err := pnd.Confirm(cuid); err != nil {
+			if err := n.Confirm(cuid); err != nil {
 				t.Error(err)
 				return
 			}