diff --git a/api/api_test.go b/api/api_test.go
index 2a98af6fda7c713290f5f2f57d8cf3d982cffa9d..3d9c16efbf8b41bea17346dae5e19ccac0adb943 100644
--- a/api/api_test.go
+++ b/api/api_test.go
@@ -15,6 +15,7 @@ import (
 	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
+	"github.com/spf13/viper"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/test/bufconn"
@@ -99,6 +100,7 @@ func bufDialer(context.Context, string) (net.Conn, error) {
 }
 
 func Test_Init(t *testing.T) {
+	viper.SetConfigFile("./api_test.toml")
 	if err := Init(bufnet); err != nil {
 		t.Error(err)
 	}
@@ -136,7 +138,7 @@ func Test_GetPnd(t *testing.T) {
 }
 
 func Test_GetChanges(t *testing.T) {
-	resp, err := GetChanges(bufnet, pndID)
+	resp, err := getChanges(bufnet, pndID)
 	if err != nil {
 		t.Error(err)
 		return
@@ -145,14 +147,14 @@ func Test_GetChanges(t *testing.T) {
 }
 
 func Test_CommitConfirm(t *testing.T) {
-	resp, err := Commit(bufnet, pndID, changeID)
+	resp, err := commit(bufnet, pndID, changeID)
 	if err != nil {
 		t.Error(err)
 		return
 	}
 	log.Info(resp)
 
-	resp, err = Confirm(bufnet, pndID, changeID)
+	resp, err = confirm(bufnet, pndID, changeID)
 	if err != nil {
 		t.Error(err)
 		return
@@ -179,7 +181,7 @@ func Test_AddDevice(t *testing.T) {
 }
 
 func Test_GetDevice(t *testing.T) {
-	resp, err := getDevice(bufnet, pndID, "", ondID)
+	resp, err := getDevice(bufnet, pndID, ondID)
 	if err != nil {
 		t.Error(err)
 		return
diff --git a/api/go.mod b/api/go.mod
index 9f73ad45018ef7a278f7bffde00ee5812dd97de1..551e38da5afd80810c840d6a10e7f45a48936844 100644
--- a/api/go.mod
+++ b/api/go.mod
@@ -3,7 +3,7 @@ module code.fbi.h-da.de/cocsn/gosdn/api
 go 1.16
 
 require (
-	code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617113324-57ce62926b53
+	code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617162200-4b2e8d3035c7
 	code.fbi.h-da.de/cocsn/gosdn v0.0.3-0.20210609130706-9cca50b3d195
 	code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210616220833-9f9d4a562783
 	code.fbi.h-da.de/cocsn/yang-models v0.0.7
diff --git a/api/go.sum b/api/go.sum
index 7729383f2e825c3fc6d31ab2efc08f291a77b2f8..834132dd2ce8af8a12def42d14cdfa0454864e5e 100644
--- a/api/go.sum
+++ b/api/go.sum
@@ -23,8 +23,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 code.fbi.h-da.de/cocsn/api/go v0.0.0-20210609120033-1ef56612bd26/go.mod h1:2+rnE92IyXLbiy3/92EM7JrtsY5tXPAKX90QmsT2+m0=
 code.fbi.h-da.de/cocsn/api/go v0.0.0-20210616091959-ec840cb65202/go.mod h1:2+rnE92IyXLbiy3/92EM7JrtsY5tXPAKX90QmsT2+m0=
-code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617113324-57ce62926b53 h1:fESX2L9ql6DeJo98Q+Yz99c+2yrQ0YoxotGKAmPlGiw=
-code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617113324-57ce62926b53/go.mod h1:2+rnE92IyXLbiy3/92EM7JrtsY5tXPAKX90QmsT2+m0=
+code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617162200-4b2e8d3035c7 h1:pNZ+M0wzJocRP3HXx9NMw042/mvTRrobRspqG3gNTfw=
+code.fbi.h-da.de/cocsn/api/go v0.0.0-20210617162200-4b2e8d3035c7/go.mod h1:2+rnE92IyXLbiy3/92EM7JrtsY5tXPAKX90QmsT2+m0=
 code.fbi.h-da.de/cocsn/gosdn v0.0.3-0.20210609130706-9cca50b3d195 h1:PKIXDaEtaqmGviMAx4RWK0/bgPgkCNcxKO+XC85lnIg=
 code.fbi.h-da.de/cocsn/gosdn v0.0.3-0.20210609130706-9cca50b3d195/go.mod h1:EK0GUnwNB+qMMjSJxGzLpfDw+KsUHS2LZkdzshldm4Q=
 code.fbi.h-da.de/cocsn/gosdn/interfaces v0.0.0-20210616220833-9f9d4a562783 h1:7ewcRJE+p8p7nJEB5qiGwREcV60UlWB42aXEtaywJuE=
diff --git a/api/pnd.go b/api/pnd.go
index e83facbb6c583e357336c52932364b5e03eaab55..60d3f87f8725dfc8ed3fab97d768b1bd9e2c00a2 100644
--- a/api/pnd.go
+++ b/api/pnd.go
@@ -96,8 +96,13 @@ func (p *PrincipalNetworkDomainAdapter) ChangeOND(uuid uuid.UUID, operation ppb.
 	return err
 }
 
-func (p *PrincipalNetworkDomainAdapter) Request(uuid.UUID, string) error {
-	return &errors.ErrNotYetImplemented{}
+func (p *PrincipalNetworkDomainAdapter) Request(did uuid.UUID, path string) error {
+	resp, err := getPath(p.endpoint, p.id.String(), did.String(), path)
+	if err != nil {
+		return err
+	}
+	log.Info(resp)
+	return nil
 }
 
 func (p *PrincipalNetworkDomainAdapter) RequestAll(string) error {
@@ -129,27 +134,58 @@ func (p *PrincipalNetworkDomainAdapter) ID() uuid.UUID {
 }
 
 func (p *PrincipalNetworkDomainAdapter) PendingChanges() []uuid.UUID {
-	return nil
+	resp, err := getChanges(p.endpoint, p.id.String())
+	if err != nil {
+		log.Error(err)
+		return nil
+	}
+	return filterChanges(ppb.Change_PENDING, resp)
 }
 
 func (p *PrincipalNetworkDomainAdapter) CommittedChanges() []uuid.UUID {
-	return nil
+	resp, err := getChanges(p.endpoint, p.id.String())
+	if err != nil {
+		log.Error(err)
+		return nil
+	}
+	return filterChanges(ppb.Change_COMMITTED, resp)
 }
 
 func (p *PrincipalNetworkDomainAdapter) GetChange(uuid.UUID, ...int) (change.Change, error) {
 	return nil, &errors.ErrNotYetImplemented{}
 }
 
-func (p *PrincipalNetworkDomainAdapter) Commit(uuid.UUID) error {
-	return &errors.ErrNotYetImplemented{}
+func (p *PrincipalNetworkDomainAdapter) Commit(cuid uuid.UUID) error {
+	resp, err := commit(p.endpoint, p.id.String(), cuid.String())
+	if err != nil {
+		return err
+	}
+	log.Info(resp)
+	return nil
 }
 
-func (p *PrincipalNetworkDomainAdapter) Confirm(uuid.UUID) error {
-	return &errors.ErrNotYetImplemented{}
+func (p *PrincipalNetworkDomainAdapter) Confirm(cuid uuid.UUID) error {
+	resp, err := confirm(p.endpoint, p.id.String(), cuid.String())
+	if err != nil {
+		return err
+	}
+	log.Info(resp)
+	return nil
+}
+
+func filterChanges(state ppb.Change_State, resp *ppb.GetResponse) []uuid.UUID {
+	changes := make([]uuid.UUID, 0)
+	for _, ch := range resp.Change {
+		if ch.State == ppb.Change_PENDING {
+			id, _ := uuid.Parse(ch.Id)
+			changes = append(changes, id)
+		}
+	}
+	return changes
 }
 
-// GetChanges requests all pending and unconfirmed changes from the controller
-func GetChanges(addr, pnd string) (*ppb.GetResponse, error) {
+// getChanges requests all pending and unconfirmed changes from the controller
+func getChanges(addr, pnd string) (*ppb.GetResponse, error) {
 	ctx := context.Background()
 	client, err := nbi.PndClient(addr, dialOptions...)
 	if err != nil {
@@ -167,9 +203,9 @@ func GetChanges(addr, pnd string) (*ppb.GetResponse, error) {
 	return client.Get(ctx, req)
 }
 
-// Commit sends a commit request for one or multiple changes to the
+// commit sends a commit request for one or multiple changes to the
 // controller.
-func Commit(addr, pnd string, cuids ...string) (*ppb.SetResponse, error) {
+func commit(addr, pnd string, cuids ...string) (*ppb.SetResponse, error) {
 	changes := make([]*ppb.SetChange, len(cuids))
 	for i, arg := range cuids {
 		changes[i] = &ppb.SetChange{
@@ -180,9 +216,9 @@ func Commit(addr, pnd string, cuids ...string) (*ppb.SetResponse, error) {
 	return commitConfirm(addr, pnd, changes)
 }
 
-// Confirm sends a confirm request for one or multiple changes to the
+// confirm sends a confirm request for one or multiple changes to the
 // controller
-func Confirm(addr, pnd string, cuids ...string) (*ppb.SetResponse, error) {
+func confirm(addr, pnd string, cuids ...string) (*ppb.SetResponse, error) {
 	changes := make([]*ppb.SetChange, len(cuids))
 	for i, arg := range cuids {
 		changes[i] = &ppb.SetChange{
@@ -266,6 +302,26 @@ func getDevice(addr, pid string, did ...string) (*ppb.GetResponse, error) {
 	return pndClient.Get(ctx, req)
 }
 
+func getPath(addr, pid, did, path string) (*ppb.GetResponse, error) {
+	pndClient, err := nbi.PndClient(addr, dialOptions...)
+	if err != nil {
+		return nil, err
+	}
+
+	req := &ppb.GetRequest{
+		Timestamp: time.Now().UnixNano(),
+		Request: &ppb.GetRequest_Path{
+			Path: &ppb.GetPath{
+				Did:  did,
+				Path: path,
+			},
+		},
+		Pid: pid,
+	}
+	ctx := context.Background()
+	return pndClient.Get(ctx, req)
+}
+
 func deleteDevice(addr, pid, did string) (*ppb.DeleteResponse, error) {
 	pndClient, err := nbi.PndClient(addr, dialOptions...)
 	if err != nil {