diff --git a/northbound/server/pnd.go b/northbound/server/pnd.go
index 9b46337668225aa4508aada51c44c388ca955d28..f0f8248b06905d4cfe3adaeec8dd960a40c6a287 100644
--- a/northbound/server/pnd.go
+++ b/northbound/server/pnd.go
@@ -5,6 +5,9 @@ import (
 	"reflect"
 	"time"
 
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+
 	"code.fbi.h-da.de/cocsn/gosdn/interfaces/device"
 
 	ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd"
@@ -14,6 +17,7 @@ import (
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/errors"
 	"github.com/google/uuid"
 	"github.com/openconfig/ygot/ygot"
+	log "github.com/sirupsen/logrus"
 )
 
 type pndServer struct {
@@ -23,7 +27,8 @@ type pndServer struct {
 func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetResponse, error) {
 	pid, err := uuid.Parse(request.Pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	switch req := request.Request.(type) {
 	case *ppb.GetRequest_Pnd:
@@ -42,19 +47,23 @@ func (p pndServer) Get(ctx context.Context, request *ppb.GetRequest) (*ppb.GetRe
 func handleGetPnd(pid uuid.UUID) (*ppb.GetResponse, error) {
 	pnd, err := pndc.GetPND(pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	onds, err := fillOnds(pnd, true)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	sbis, err := fillSbis(pnd, true)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	changes, err := fillChanges(pnd, true)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
 	return &ppb.GetResponse{
@@ -73,11 +82,13 @@ func handleGetPnd(pid uuid.UUID) (*ppb.GetResponse, error) {
 func handleGetSbi(pid uuid.UUID, req *ppb.GetRequest_Sbi) (*ppb.GetResponse, error) {
 	pnd, err := pndc.GetPND(pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	sbis, err := fillSbis(pnd, req.Sbi.GetAll(), req.Sbi.Sid...)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	return &ppb.GetResponse{
 		Timestamp: time.Now().UnixNano(),
@@ -90,7 +101,8 @@ func stringToUUID(sid []string) ([]uuid.UUID, error) {
 	for i, id := range sid {
 		parsed, err := uuid.Parse(id)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		UUIDs[i] = parsed
 	}
@@ -100,11 +112,13 @@ func stringToUUID(sid []string) ([]uuid.UUID, error) {
 func handleGetOnd(pid uuid.UUID, req *ppb.GetRequest_Ond) (*ppb.GetResponse, error) {
 	pnd, err := pndc.GetPND(pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	onds, err := fillOnds(pnd, req.Ond.All, req.Ond.Did...)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	return &ppb.GetResponse{
 		Timestamp: time.Now().UnixNano(),
@@ -115,11 +129,13 @@ func handleGetOnd(pid uuid.UUID, req *ppb.GetRequest_Ond) (*ppb.GetResponse, err
 func handleGetChange(pid uuid.UUID, req *ppb.GetRequest_Change) (*ppb.GetResponse, error) {
 	pnd, err := pndc.GetPND(pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	changes, err := fillChanges(pnd, req.Change.All, req.Change.Cuid...)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	return &ppb.GetResponse{
 		Timestamp: time.Now().UnixNano(),
@@ -144,14 +160,16 @@ func fillSbis(pnd networkdomain.NetworkDomain, all bool, sid ...string) ([]*spb.
 		}
 		sbiList, err = stringToUUID(sid)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 	}
 	sbis := make([]*spb.SouthboundInterface, len(sbiList))
 	for i, id := range sbiList {
 		sbi, err := sbiStore.GetSBI(id)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		sbis[i] = &spb.SouthboundInterface{
 			Id:   id.String(),
@@ -177,7 +195,8 @@ func fillOnds(pnd networkdomain.NetworkDomain, all bool, did ...string) ([]*ppb.
 		}
 		ondList, err = stringToUUID(did)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 	}
 
@@ -185,12 +204,14 @@ func fillOnds(pnd networkdomain.NetworkDomain, all bool, did ...string) ([]*ppb.
 	for i, id := range ondList {
 		d, err := pnd.GetDevice(id.String())
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		cfg := ygot.GNMINotificationsConfig{}
 		dev, err := ygot.TogNMINotifications(d.(device.Device).Model(), time.Now().UnixNano(), cfg)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		onds[i] = &ppb.OrchestratedNetworkingDevice{
 			Id:     id.String(),
@@ -218,7 +239,8 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*
 		}
 		changeList, err = stringToUUID(cuid)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 	}
 
@@ -226,7 +248,8 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*
 	for i, ch := range changeList {
 		c, err := pnd.GetChange(ch)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		change, ok := c.(*nucleus.Change)
 		if !ok {
@@ -248,25 +271,30 @@ func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*
 func (p pndServer) Set(ctx context.Context, request *ppb.SetRequest) (*ppb.SetResponse, error) {
 	pid, err := uuid.Parse(request.Pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
 	pnd, err := pndc.GetPND(pid)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 
 	ondResp, err := handleSetOnd(pnd, request.Ond)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	changeResp, err := handleSetChange(pnd, request.Change)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	changeRequestResp, err := handleChangeRequest(pnd, request.ChangeRequest)
 	if err != nil {
-		return nil, err
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
 	}
 	return &ppb.SetResponse{
 		Timestamp: time.Now().UnixNano(),
@@ -283,10 +311,12 @@ func handleSetOnd(pnd networkdomain.NetworkDomain, req []*ppb.SetOnd) (*ppb.SetR
 	for _, r := range req {
 		sid, err := uuid.Parse(r.Sbi.Id)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		if err := pnd.AddDevice(r.DeviceName, r.TransportOption, sid); err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 	}
 	return &ppb.SetResponse{
@@ -306,16 +336,19 @@ func handleSetChange(pnd networkdomain.NetworkDomain, req []*ppb.SetChange) (*pp
 	for _, r := range req {
 		cuid, err := uuid.Parse(r.Cuid)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		switch r.Op {
 		case ppb.SetChange_COMMIT:
 			if err := pnd.Commit(cuid); err != nil {
-				return nil, err
+				log.Error(err)
+				return nil, status.Errorf(codes.Aborted, "%v", err)
 			}
 		case ppb.SetChange_CONFIRM:
 			if err := pnd.Confirm(cuid); err != nil {
-				return nil, err
+				log.Error(err)
+				return nil, status.Errorf(codes.Aborted, "%v", err)
 			}
 		default:
 			return nil, &errors.ErrInvalidParameters{
@@ -334,10 +367,12 @@ func handleChangeRequest(pnd networkdomain.NetworkDomain, req []*ppb.ChangeReque
 	for _, r := range req {
 		did, err := uuid.Parse(r.Id)
 		if err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 		if err := pnd.ChangeOND(did, r.ApiOp, r.Path, r.Value); err != nil {
-			return nil, err
+			log.Error(err)
+			return nil, status.Errorf(codes.Aborted, "%v", err)
 		}
 	}
 	return &ppb.SetResponse{
@@ -345,3 +380,30 @@ func handleChangeRequest(pnd networkdomain.NetworkDomain, req []*ppb.ChangeReque
 		Status:    ppb.SetResponse_OK,
 	}, nil
 }
+
+func (p pndServer) Delete(ctx context.Context, req *ppb.DeleteRequest) (*ppb.DeleteResponse, error) {
+	pid, err := uuid.Parse(req.Pid)
+	if err != nil {
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
+	}
+	pnd, err := pndc.GetPND(pid)
+	if err != nil {
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
+	}
+
+	did, err := uuid.Parse(req.Uuid)
+	if err != nil {
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
+	}
+	if err := pnd.RemoveDevice(did); err != nil {
+		log.Error(err)
+		return nil, status.Errorf(codes.Aborted, "%v", err)
+	}
+	return &ppb.DeleteResponse{
+		Timestamp: time.Now().UnixNano(),
+		Status:    ppb.DeleteResponse_OK,
+	}, nil
+}