From 5fb6dad55b09dde4fd032867d24f03e5867772e7 Mon Sep 17 00:00:00 2001
From: Manuel Kieweg <manuel.kieweg@h-da.de>
Date: Wed, 9 Jun 2021 15:00:00 +0200
Subject: [PATCH] make Device interface

---
 cli/grpc_test.go                       |  2 +-
 cli/subscribe.go                       |  2 +-
 controller.go                          | 14 ++--
 go.mod                                 | 14 ++--
 go.sum                                 | 36 ++++++----
 initialise_test.go                     | 11 ---
 northbound/server/pnd.go               |  2 +-
 northbound/server/pnd_test.go          | 16 ++---
 nucleus/device.go                      | 97 +++++++++++++++++++++++---
 nucleus/device_test.go                 | 16 ++---
 nucleus/initialise_test.go             |  6 +-
 nucleus/principalNetworkDomain.go      | 36 +++++-----
 nucleus/principalNetworkDomain_test.go | 51 +++++++-------
 nucleus/store.go                       |  6 +-
 nucleus/store_test.go                  | 12 ++--
 15 files changed, 199 insertions(+), 122 deletions(-)

diff --git a/cli/grpc_test.go b/cli/grpc_test.go
index c3117c407..c54269714 100644
--- a/cli/grpc_test.go
+++ b/cli/grpc_test.go
@@ -65,7 +65,7 @@ func init() {
 	mockPnd.On("CommittedChanges").Return([]uuid.UUID{changeUUID})
 	mockPnd.On("GetChange", mock.Anything).Return(&nucleus.Change{}, nil)
 	mockPnd.On("AddDevice", mock.Anything, mock.Anything, mock.Anything).Return(nil)
-	mockPnd.On("GetDevice", mock.Anything).Return(&nucleus.Device{
+	mockPnd.On("GetDevice", mock.Anything).Return(&nucleus.CommonDevice{
 		UUID:     deviceUUID,
 		GoStruct: &openconfig.Device{},
 	}, nil)
diff --git a/cli/subscribe.go b/cli/subscribe.go
index 3be7882a5..6222ca63c 100644
--- a/cli/subscribe.go
+++ b/cli/subscribe.go
@@ -56,7 +56,7 @@ func Subscribe(address, username, password, deviceName string, sample, heartbeat
 	signal.Notify(done, syscall.SIGILL, syscall.SIGTERM)
 	ctx := context.WithValue(context.Background(), types.CtxKeyOpts, opts) //nolint
 	go func() {
-		if err := device.Transport.Subscribe(ctx); err != nil {
+		if err := device.Transport().Subscribe(ctx); err != nil {
 			log.Fatal(err)
 		}
 	}()
diff --git a/controller.go b/controller.go
index c6a434178..da943ff12 100644
--- a/controller.go
+++ b/controller.go
@@ -9,18 +9,18 @@ import (
 	"sync"
 	"time"
 
-	spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound"
-
+	"github.com/google/uuid"
+	log "github.com/sirupsen/logrus"
 	"github.com/spf13/viper"
 	"google.golang.org/grpc"
 
 	pb "code.fbi.h-da.de/cocsn/api/go/gosdn/core"
 	ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd"
-	"code.fbi.h-da.de/cocsn/gosdn/database"
+	spb "code.fbi.h-da.de/cocsn/api/go/gosdn/southbound"
 	nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/server"
+
+	"code.fbi.h-da.de/cocsn/gosdn/database"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
-	"github.com/google/uuid"
-	log "github.com/sirupsen/logrus"
 )
 
 var coreLock sync.RWMutex
@@ -53,14 +53,14 @@ func init() {
 
 // initialize does start-up housekeeping like reading controller config files
 func initialize() error {
-	if err := createSouthboundInterfaces(); err != nil {
+	if err := startGrpcServer(); err != nil {
 		return err
 	}
 
 	coreLock.Lock()
 	startHttpServer()
 	coreLock.Unlock()
-	return startGrpcServer()
+	return createSouthboundInterfaces()
 }
 
 func startGrpcServer() error {
diff --git a/go.mod b/go.mod
index 6ee6ddbd8..2822dde48 100644
--- a/go.mod
+++ b/go.mod
@@ -3,17 +3,19 @@ module code.fbi.h-da.de/cocsn/gosdn
 go 1.16
 
 require (
-	code.fbi.h-da.de/cocsn/api/go v0.0.0-20210606170310-dde53dd7d211
+	code.fbi.h-da.de/cocsn/api/go v0.0.0-20210609120033-1ef56612bd26
 	code.fbi.h-da.de/cocsn/yang-models v0.0.7
 	github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a
-	github.com/docker/docker v1.13.1
+	github.com/docker/docker v20.10.6+incompatible
 	github.com/golang/protobuf v1.5.2
-	github.com/google/gnxi v0.0.0-20201221102247-c26672548161
-	github.com/google/uuid v1.1.2
+	github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7
+	github.com/google/uuid v1.2.0
+	github.com/imdario/mergo v0.3.11 // indirect
 	github.com/neo4j/neo4j-go-driver v1.8.3
-	github.com/openconfig/gnmi v0.0.0-20210430192044-ab96b57c5113
+	github.com/onsi/gomega v1.10.3 // indirect
+	github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da
 	github.com/openconfig/goyang v0.2.4
-	github.com/openconfig/ygot v0.10.5
+	github.com/openconfig/ygot v0.10.11
 	github.com/sirupsen/logrus v1.8.1
 	github.com/spf13/cobra v1.1.3
 	github.com/spf13/viper v1.7.1
diff --git a/go.sum b/go.sum
index 49e5ce1c5..fbaf8d267 100644
--- a/go.sum
+++ b/go.sum
@@ -21,8 +21,8 @@ cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIA
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
 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-20210606170310-dde53dd7d211 h1:/KdYVxBq9FuYYzCIoGLTAOqRatHUJ/oO6fAqIF/6+OM=
-code.fbi.h-da.de/cocsn/api/go v0.0.0-20210606170310-dde53dd7d211/go.mod h1:2+rnE92IyXLbiy3/92EM7JrtsY5tXPAKX90QmsT2+m0=
+code.fbi.h-da.de/cocsn/api/go v0.0.0-20210609120033-1ef56612bd26 h1:Uqo/Gfh/pwmkHZFiTtcJGCZbHh+ZDcD2W1zOdABerbI=
+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/yang-models v0.0.7 h1:3TOo8J+EdAJKeq4o3aaNWZRhjSwguIS8wciW1U9PkSk=
 code.fbi.h-da.de/cocsn/yang-models v0.0.7/go.mod h1:M+2HinfhTT8nA8qvn2cpWNlOtuiizTNDWA3yfy72K/g=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
@@ -86,8 +86,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=
 github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v20.10.6+incompatible h1:oXI3Vas8TI8Eu/EjH4srKHJBVqraSzJybhxY7Om9faQ=
+github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
@@ -169,8 +170,8 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
 github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/gnxi v0.0.0-20201221102247-c26672548161 h1:8Huhvr/sx+mAUzfujNPTCbq+z4LG1qUIu0smjXTaBw0=
-github.com/google/gnxi v0.0.0-20201221102247-c26672548161/go.mod h1:dPTuHPVOqxZ2yGKPjymiMt1vrZa8KHXWKX+Lx1z5d88=
+github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7 h1:cJ62uhbZcclaYm9gq4JNyazqSY7bUEggwZdw0nHTT7o=
+github.com/google/gnxi v0.0.0-20210423111716-4b504ef806a7/go.mod h1:dPTuHPVOqxZ2yGKPjymiMt1vrZa8KHXWKX+Lx1z5d88=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -194,8 +195,9 @@ github.com/google/protobuf v3.11.4+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bj
 github.com/google/protobuf v3.14.0+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
@@ -231,11 +233,11 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
+github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
@@ -311,24 +313,29 @@ github.com/neo4j/neo4j-go-driver v1.8.3/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcL
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
+github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
 github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
+github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
+github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
 github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
 github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
 github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
 github.com/openconfig/gnmi v0.0.0-20200617225440-d2b4e6a45802/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
-github.com/openconfig/gnmi v0.0.0-20210430192044-ab96b57c5113 h1:gHZS9U5wmDYeS8vPu4eEXbWHAVwayPwJ/Ze5RGYGXLw=
 github.com/openconfig/gnmi v0.0.0-20210430192044-ab96b57c5113/go.mod h1:H/20NXlnWbCPFC593nxpiKJ+OU//7mW7s7Qk7uVdg3Q=
+github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da h1:Gaj4Reje4wKdliTXaXDE7ginHeVzDbcUTszUx6xpQeE=
+github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da/go.mod h1:H/20NXlnWbCPFC593nxpiKJ+OU//7mW7s7Qk7uVdg3Q=
 github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU=
 github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
 github.com/openconfig/goyang v0.2.3/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
@@ -338,8 +345,8 @@ github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2
 github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs=
 github.com/openconfig/ygot v0.9.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
 github.com/openconfig/ygot v0.10.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
-github.com/openconfig/ygot v0.10.5 h1:8RQxM/AY4bbfKAtYihWlyIEwKuLjNE1jzXI4gxPN27w=
-github.com/openconfig/ygot v0.10.5/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
+github.com/openconfig/ygot v0.10.11 h1:qxdyjBV8hl82vNjW+AqvC+wzUV0b3sKmgs9npS5s+0c=
+github.com/openconfig/ygot v0.10.11/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
@@ -522,6 +529,7 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@@ -558,6 +566,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -712,7 +721,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
diff --git a/initialise_test.go b/initialise_test.go
index 85d5fb6f4..6994a752f 100644
--- a/initialise_test.go
+++ b/initialise_test.go
@@ -5,7 +5,6 @@ import (
 	"os"
 	"testing"
 
-	"code.fbi.h-da.de/cocsn/gosdn/mocks"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
 	"github.com/google/uuid"
@@ -76,13 +75,3 @@ func readTestUUIDs() {
 		log.Fatal(err)
 	}
 }
-
-func mockDevice() nucleus.Device {
-	sbi := &nucleus.OpenConfig{}
-	return nucleus.Device{
-		UUID:      mdid,
-		GoStruct:  sbi.Schema().Root,
-		SBI:       sbi,
-		Transport: &mocks.Transport{},
-	}
-}
diff --git a/northbound/server/pnd.go b/northbound/server/pnd.go
index d74119c20..00a334b88 100644
--- a/northbound/server/pnd.go
+++ b/northbound/server/pnd.go
@@ -185,7 +185,7 @@ func fillOnds(pnd nucleus.PrincipalNetworkDomain, all bool, did ...string) ([]*p
 			return nil, err
 		}
 		cfg := ygot.GNMINotificationsConfig{}
-		dev, err := ygot.TogNMINotifications(d.(*nucleus.Device).GoStruct, time.Now().UnixNano(), cfg)
+		dev, err := ygot.TogNMINotifications(d.(nucleus.Device).Model(), time.Now().UnixNano(), cfg)
 		if err != nil {
 			return nil, err
 		}
diff --git a/northbound/server/pnd_test.go b/northbound/server/pnd_test.go
index 3ddee4600..e5fea39f2 100644
--- a/northbound/server/pnd_test.go
+++ b/northbound/server/pnd_test.go
@@ -29,7 +29,7 @@ var pendingChangeUUID uuid.UUID
 var committedChangeUUID uuid.UUID
 var deviceUUID uuid.UUID
 var mockPnd *mocks.PrincipalNetworkDomain
-var mockDevice *nucleus.Device
+var mockDevice nucleus.Device
 var sbiStore *nucleus.SbiStore
 
 func TestMain(m *testing.M) {
@@ -55,7 +55,7 @@ func TestMain(m *testing.M) {
 		log.Fatal(err)
 	}
 
-	mockDevice = &nucleus.Device{
+	mockDevice = &nucleus.CommonDevice{
 		GoStruct: &openconfig.Device{
 			System: &openconfig.OpenconfigSystem_System{
 				Config: &openconfig.OpenconfigSystem_System_Config{
@@ -63,14 +63,14 @@ func TestMain(m *testing.M) {
 				},
 			},
 		},
-		UUID:      deviceUUID,
-		SBI:       nucleus.NewSBI(spb.Type_OPENCONFIG),
-		Transport: &mocks.Transport{},
-		Name:      hostname,
+		UUID: deviceUUID,
 	}
 
+	mockDevice.(*nucleus.CommonDevice).SetSBI(nucleus.NewSBI(spb.Type_OPENCONFIG))
+	mockDevice.(*nucleus.CommonDevice).SetTransport(&mocks.Transport{})
+	mockDevice.(*nucleus.CommonDevice).SetName(hostname)
 	sbiStore = nucleus.NewSbiStore()
-	if err := sbiStore.Add(mockDevice.SBI); err != nil {
+	if err := sbiStore.Add(mockDevice.SBI()); err != nil {
 		log.Fatal(err)
 	}
 
@@ -122,7 +122,7 @@ func Test_pnd_Get(t *testing.T) {
 			want: []string{
 				pndID,
 				ondID,
-				mockDevice.SBI.ID().String(),
+				mockDevice.SBI().ID().String(),
 				pendingChangeID,
 				committedChangeID,
 			},
diff --git a/nucleus/device.go b/nucleus/device.go
index 18c36a27d..b92a9eee0 100644
--- a/nucleus/device.go
+++ b/nucleus/device.go
@@ -3,13 +3,25 @@ package nucleus
 import (
 	tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport"
 	"github.com/docker/docker/pkg/namesgenerator"
+	"github.com/golang/protobuf/proto"
 	"github.com/google/uuid"
 	"github.com/openconfig/ygot/ygot"
 )
 
 // Device represents an Orchestrated Network Device (OND) which is managed by
 // nucleus
-type Device struct {
+type Device interface {
+	ID() uuid.UUID
+	Model() ygot.GoStruct
+	Transport() Transport
+	Name() string
+	SBI() SouthboundInterface
+	ProcessResponse(proto.Message) error
+
+	isDevice()
+}
+
+type CommonDevice struct {
 	// UUID represents the Devices UUID
 	UUID uuid.UUID
 
@@ -17,17 +29,17 @@ type Device struct {
 	ygot.GoStruct
 
 	// SBI is the device's southbound interface implementation
-	SBI SouthboundInterface
+	sbi SouthboundInterface
 
 	// Transport is the device's Transport implementation
-	Transport Transport
+	transport Transport
 
 	// Name is the device's human readable name
-	Name string
+	name string
 }
 
 // NewDevice creates a Device
-func NewDevice(name string, opt *tpb.TransportOption, sbi SouthboundInterface) (*Device, error) {
+func NewDevice(name string, opt *tpb.TransportOption, sbi SouthboundInterface) (Device, error) {
 	transport, err := NewTransport(opt, sbi)
 	if err != nil {
 		return nil, err
@@ -37,16 +49,81 @@ func NewDevice(name string, opt *tpb.TransportOption, sbi SouthboundInterface) (
 		name = namesgenerator.GetRandomName(0)
 	}
 
-	return &Device{
+	return &CommonDevice{
 		UUID:      uuid.New(),
 		GoStruct:  sbi.Schema().Root,
-		SBI:       sbi,
-		Transport: transport,
-		Name:      name,
+		sbi:       sbi,
+		transport: transport,
+		name:      name,
 	}, nil
 }
 
 // ID returns the UUID of the Device
-func (d *Device) ID() uuid.UUID {
+func (d *CommonDevice) ID() uuid.UUID {
 	return d.UUID
 }
+
+func (d *CommonDevice) Model() ygot.GoStruct {
+	return d.GoStruct
+}
+
+func (d *CommonDevice) Transport() Transport {
+	return d.transport
+}
+
+func (d *CommonDevice) Name() string {
+	return d.name
+}
+
+func (d *CommonDevice) SBI() SouthboundInterface {
+	return d.sbi
+}
+
+func (d *CommonDevice) SetTransport(t Transport) {
+	d.transport = t
+}
+
+func (d *CommonDevice) SetName(n string) {
+	d.name = n
+}
+
+func (d *CommonDevice) SetSBI(sbi SouthboundInterface) {
+	d.sbi = sbi
+}
+
+func (d *CommonDevice) ProcessResponse(resp proto.Message) error {
+	return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())
+}
+
+func (d *CommonDevice) isDevice() {}
+
+type csbiDevice struct {
+	CommonDevice
+}
+
+// ID returns the UUID of the Device
+func (d *csbiDevice) ID() uuid.UUID {
+	return d.UUID
+}
+
+func (d *csbiDevice) Model() ygot.GoStruct {
+	return d.GoStruct
+}
+
+func (d *csbiDevice) Transport() Transport {
+	return d.Transport()
+}
+
+func (d *csbiDevice) Name() string {
+	return d.Name()
+}
+
+func (d *csbiDevice) SBI() SouthboundInterface {
+	return d.SBI()
+}
+
+func (d *csbiDevice) ProcessResponse(resp proto.Message) error {
+	return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())
+}
+
+func (d *csbiDevice) isDevice() {}
diff --git a/nucleus/device_test.go b/nucleus/device_test.go
index d5d38cab3..1efa75681 100644
--- a/nucleus/device_test.go
+++ b/nucleus/device_test.go
@@ -34,12 +34,12 @@ func TestDevice_Id(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			d := &Device{
+			d := &CommonDevice{
 				GoStruct:  tt.fields.GoStruct,
-				SBI:       tt.fields.SBI,
-				Transport: tt.fields.Transport,
+				sbi:       tt.fields.SBI,
+				transport: tt.fields.Transport,
 				UUID:      tt.fields.UUID,
-				Name:      tt.fields.Name,
+				name:      tt.fields.Name,
 			}
 			if got := d.ID(); !reflect.DeepEqual(got, tt.want) {
 				t.Errorf("ID() = %v, want %v", got, tt.want)
@@ -102,16 +102,16 @@ func TestNewDevice(t *testing.T) {
 				return
 			}
 			if resp != nil {
-				if reflect.TypeOf(resp.GoStruct) != reflect.TypeOf(&openconfig.Device{}) {
+				if reflect.TypeOf(resp.Model()) != reflect.TypeOf(&openconfig.Device{}) {
 					t.Error("NewDevice() returned invalid GoStruct")
 				}
-				if reflect.TypeOf(resp.Transport) != reflect.TypeOf(&Gnmi{}) {
+				if reflect.TypeOf(resp.Transport()) != reflect.TypeOf(&Gnmi{}) {
 					t.Error("NewDevice() returned invalid transport")
 				}
-				if reflect.TypeOf(resp.SBI) != reflect.TypeOf(&OpenConfig{}) {
+				if reflect.TypeOf(resp.SBI()) != reflect.TypeOf(&OpenConfig{}) {
 					t.Error("NewDevice() returned invalid GoStruct")
 				}
-				if resp.Name != "MyDevice" {
+				if resp.Name() != "MyDevice" {
 					t.Error("NewDevice() returned wrong name")
 				}
 			}
diff --git a/nucleus/initialise_test.go b/nucleus/initialise_test.go
index e412a631d..e3b589fe4 100644
--- a/nucleus/initialise_test.go
+++ b/nucleus/initialise_test.go
@@ -117,11 +117,11 @@ func readTestUUIDs() {
 
 func mockDevice() Device {
 	sbi := &OpenConfig{}
-	return Device{
+	return &CommonDevice{
 		UUID:      mdid,
 		GoStruct:  sbi.Schema().Root,
-		SBI:       sbi,
-		Transport: &mocks.Transport{},
+		sbi:       sbi,
+		transport: &mocks.Transport{},
 	}
 }
 
diff --git a/nucleus/principalNetworkDomain.go b/nucleus/principalNetworkDomain.go
index f9bcd8e6c..beec0666b 100644
--- a/nucleus/principalNetworkDomain.go
+++ b/nucleus/principalNetworkDomain.go
@@ -2,20 +2,20 @@ package nucleus
 
 import (
 	"context"
+	"encoding/json"
 	"reflect"
 
 	ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd"
 	tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport"
-	"code.fbi.h-da.de/cocsn/gosdn/nucleus/errors"
 
 	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/errors"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/uuid"
 	"github.com/openconfig/ygot/ygot"
 	"github.com/openconfig/ygot/ytypes"
 	log "github.com/sirupsen/logrus"
-
-	"encoding/json"
-
-	"github.com/google/uuid"
 )
 
 // PrincipalNetworkDomain provides an
@@ -208,7 +208,7 @@ func (pnd *pndImplementation) AddSbi(sbi interface{}) error {
 }
 
 // RemoveSbi removes a SBI from the PND
-// TODO: this should to recursivly through
+// TODO: this should to recursively through
 // devices and remove the devices using
 // this SBI
 func (pnd *pndImplementation) RemoveSbi(id uuid.UUID) error {
@@ -235,12 +235,12 @@ func (pnd *pndImplementation) GetDevice(identifier string) (interface{}, error)
 		return nil, err
 	}
 
-	copiedGoStruct, err := ygot.DeepCopy(d.GoStruct)
+	copiedGoStruct, err := ygot.DeepCopy(d.Model())
 	if err != nil {
 		return nil, err
 	}
 
-	copiedDevice := &Device{Name: d.Name, UUID: d.UUID, GoStruct: copiedGoStruct}
+	copiedDevice := &CommonDevice{name: d.Name(), UUID: d.ID(), GoStruct: copiedGoStruct}
 
 	return copiedDevice, nil
 }
@@ -264,8 +264,8 @@ func (pnd *pndImplementation) removeSbi(id uuid.UUID) error {
 	return pnd.sbic.Delete(id)
 }
 
-func (pnd *pndImplementation) addDevice(device *Device) error {
-	err := pnd.devices.Add(device, device.Name)
+func (pnd *pndImplementation) addDevice(device Device) error {
+	err := pnd.devices.Add(device, device.Name())
 	if err != nil {
 		return err
 	}
@@ -283,7 +283,7 @@ func (pnd *pndImplementation) MarshalDevice(identifier string) (string, error) {
 		return "", err
 	}
 
-	jsonTree, err := json.MarshalIndent(foundDevice.GoStruct, "", "\t")
+	jsonTree, err := json.MarshalIndent(foundDevice.Model(), "", "\t")
 	if err != nil {
 		return "", err
 	}
@@ -303,11 +303,11 @@ func (pnd *pndImplementation) Request(uuid uuid.UUID, path string) error {
 		return err
 	}
 	ctx := context.Background()
-	res, err := d.Transport.Get(ctx, path)
+	res, err := d.Transport().Get(ctx, path)
 	if err != nil {
 		return err
 	}
-	err = d.Transport.ProcessResponse(res, d.GoStruct, d.SBI.Schema())
+	err = d.ProcessResponse(res.(proto.Message))
 	if err != nil {
 		return err
 	}
@@ -334,7 +334,7 @@ func (pnd *pndImplementation) ChangeOND(uuid uuid.UUID, operation ppb.ApiOperati
 	if err != nil {
 		return err
 	}
-	cpy, err := ygot.DeepCopy(d.GoStruct)
+	cpy, err := ygot.DeepCopy(d.Model())
 	ygot.BuildEmptyTree(cpy)
 	if err != nil {
 		return err
@@ -355,11 +355,11 @@ func (pnd *pndImplementation) ChangeOND(uuid uuid.UUID, operation ppb.ApiOperati
 	switch operation {
 	case ppb.ApiOperation_UPDATE, ppb.ApiOperation_REPLACE:
 		typedValue := gnmi.TypedValue(value[0])
-		if err := ytypes.SetNode(d.SBI.Schema().RootSchema(), cpy, p, typedValue); err != nil {
+		if err := ytypes.SetNode(d.SBI().Schema().RootSchema(), cpy, p, typedValue); err != nil {
 			return err
 		}
 	case ppb.ApiOperation_DELETE:
-		if err := ytypes.DeleteNode(d.SBI.Schema().RootSchema(), cpy, p); err != nil {
+		if err := ytypes.DeleteNode(d.SBI().Schema().RootSchema(), cpy, p); err != nil {
 			return err
 		}
 	default:
@@ -368,11 +368,11 @@ func (pnd *pndImplementation) ChangeOND(uuid uuid.UUID, operation ppb.ApiOperati
 
 	callback := func(state ygot.GoStruct, change ygot.GoStruct) error {
 		ctx := context.Background()
-		return d.Transport.Set(ctx, state, change)
+		return d.Transport().Set(ctx, state, change)
 	}
 
 	errChan := make(chan error)
-	change := NewChange(uuid, d.GoStruct, cpy, callback, errChan)
+	change := NewChange(uuid, d.Model(), cpy, callback, errChan)
 	pnd.errChans[change.ID()] = errChan
 
 	return pnd.pendingChanges.Add(change)
diff --git a/nucleus/principalNetworkDomain_test.go b/nucleus/principalNetworkDomain_test.go
index f2eb25cc6..5e6e5ec43 100644
--- a/nucleus/principalNetworkDomain_test.go
+++ b/nucleus/principalNetworkDomain_test.go
@@ -12,6 +12,7 @@ import (
 	"code.fbi.h-da.de/cocsn/gosdn/mocks"
 	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
 	"github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
 	"github.com/openconfig/ygot/ygot"
 	"github.com/stretchr/testify/mock"
 )
@@ -101,7 +102,7 @@ func Test_pndImplementation_AddDevice(t *testing.T) {
 		{
 			name: "already exists",
 			args: args{
-				device: &Device{
+				device: &CommonDevice{
 					UUID: did,
 				},
 			},
@@ -122,7 +123,7 @@ func Test_pndImplementation_AddDevice(t *testing.T) {
 				t.Error(err)
 			}
 			if tt.name == "already exists" {
-				pnd.devices.store[did] = tt.args.device.(*Device)
+				pnd.devices.store[did] = tt.args.device.(Device)
 			}
 			err := pnd.AddDevice(tt.args.name, tt.args.opts, defaultSbiID)
 			if (err != nil) != tt.wantErr {
@@ -135,8 +136,8 @@ func Test_pndImplementation_AddDevice(t *testing.T) {
 						t.Errorf("AddDevice() error = %v", err)
 						return
 					}
-					if d.Name != tt.args.name {
-						t.Errorf("AddDevice() got = %v, want %v", d.Name, tt.args.name)
+					if d.Name() != tt.args.name {
+						t.Errorf("AddDevice() got = %v, want %v", d.Name(), tt.args.name)
 					}
 					if err := pnd.devices.Delete(d.ID()); err != nil {
 						t.Error(err)
@@ -213,7 +214,7 @@ func Test_pndImplementation_AddSbi(t *testing.T) {
 func Test_pndImplementation_ContainsDevice(t *testing.T) {
 	type args struct {
 		uuid   uuid.UUID
-		device *Device
+		device Device
 	}
 	tests := []struct {
 		name string
@@ -222,15 +223,15 @@ func Test_pndImplementation_ContainsDevice(t *testing.T) {
 	}{
 		{name: "default", args: args{
 			uuid:   did,
-			device: &Device{UUID: did},
+			device: &CommonDevice{UUID: did},
 		}, want: true},
 		{name: "fails", args: args{
 			uuid:   uuid.New(),
-			device: &Device{UUID: did},
+			device: &CommonDevice{UUID: did},
 		}, want: false},
 		{name: "fails empty", args: args{
 			uuid:   uuid.New(),
-			device: &Device{UUID: did},
+			device: &CommonDevice{UUID: did},
 		}, want: false},
 	}
 	for _, tt := range tests {
@@ -351,11 +352,11 @@ func Test_pndImplementation_MarshalDevice(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			pnd := newPnd()
-			d := &Device{
+			d := &CommonDevice{
 				UUID:      tt.args.uuid,
 				GoStruct:  &openconfig.Device{},
-				SBI:       nil,
-				Transport: nil,
+				sbi:       nil,
+				transport: nil,
 			}
 			if err := pnd.addDevice(d); err != nil {
 				t.Error(err)
@@ -392,7 +393,7 @@ func Test_pndImplementation_RemoveDevice(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			pnd := newPnd()
 			if tt.name != "fails empty" {
-				d := &Device{UUID: did}
+				d := &CommonDevice{UUID: did}
 				if err := pnd.addDevice(d); err != nil {
 					t.Error(err)
 				}
@@ -478,10 +479,10 @@ func Test_pndImplementation_Request(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			deviceWithMockTransport := mockDevice()
 			pnd := newPnd()
-			tr := deviceWithMockTransport.Transport.(*mocks.Transport)
-			tr.On("Get", mockContext, mock.Anything).Return(mock.Anything, tt.args.rErr)
+			tr := deviceWithMockTransport.Transport().(*mocks.Transport)
+			tr.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
 			tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
-			_ = pnd.addDevice(&deviceWithMockTransport)
+			_ = pnd.addDevice(deviceWithMockTransport)
 			if err := pnd.Request(tt.args.uuid, tt.args.path); (err != nil) != tt.wantErr {
 				t.Errorf("Request() error = %v, wantErr %v", err, tt.wantErr)
 			}
@@ -526,10 +527,10 @@ func Test_pndImplementation_RequestAll(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			deviceWithMockTransport := mockDevice()
 			pnd := newPnd()
-			tr := deviceWithMockTransport.Transport.(*mocks.Transport)
-			tr.On("Get", mockContext, mock.Anything).Return(mock.Anything, tt.args.rErr)
+			tr := deviceWithMockTransport.Transport().(*mocks.Transport)
+			tr.On("Get", mockContext, mock.Anything).Return(&gpb.GetResponse{}, tt.args.rErr)
 			tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
-			_ = pnd.addDevice(&deviceWithMockTransport)
+			_ = pnd.addDevice(deviceWithMockTransport)
 			if err := pnd.RequestAll(tt.args.path); (err != nil) != tt.wantErr {
 				t.Errorf("RequestAll() error = %v, wantErr %v", err, tt.wantErr)
 			}
@@ -706,8 +707,8 @@ func Test_pndImplementation_GetDevice(t *testing.T) {
 				return
 			}
 			if foundDevice != nil {
-				if !reflect.DeepEqual(foundDevice.(*Device).GoStruct, tt.want) {
-					t.Errorf("GetDevice() got = %v, want %v", foundDevice.(*Device).GoStruct, tt.want)
+				if !reflect.DeepEqual(foundDevice.(Device).Model(), tt.want) {
+					t.Errorf("GetDevice() got = %v, want %v", foundDevice.(Device).Model(), tt.want)
 				}
 			}
 
@@ -738,7 +739,7 @@ func Test_pndImplementation_GetDeviceByName(t *testing.T) {
 	}{
 		{
 			name:    "default",
-			args:    args{name: d.Name},
+			args:    args{name: d.Name()},
 			want:    sbi.Schema().Root,
 			wantErr: false,
 		},
@@ -757,8 +758,8 @@ func Test_pndImplementation_GetDeviceByName(t *testing.T) {
 				return
 			}
 			if foundDevice != nil {
-				if !reflect.DeepEqual(foundDevice.(*Device).GoStruct, tt.want) {
-					t.Errorf("GetDeviceByName() got = %v, want %v", foundDevice.(*Device).GoStruct, tt.want)
+				if !reflect.DeepEqual(foundDevice.(Device).Model(), tt.want) {
+					t.Errorf("GetDeviceByName() got = %v, want %v", foundDevice.(Device).Model(), tt.want)
 				}
 			}
 
@@ -784,9 +785,9 @@ func Test_pndImplementation_Confirm(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			pnd := newPnd()
 			d := mockDevice()
-			tr := d.Transport.(*mocks.Transport)
+			tr := d.Transport().(*mocks.Transport)
 			tr.On("Set", mockContext, mock.Anything, mock.Anything).Return(nil)
-			if err := pnd.addDevice(&d); err != nil {
+			if err := pnd.addDevice(d); err != nil {
 				t.Error(err)
 				return
 			}
diff --git a/nucleus/store.go b/nucleus/store.go
index 639762d43..911ae3112 100644
--- a/nucleus/store.go
+++ b/nucleus/store.go
@@ -177,7 +177,7 @@ type DeviceStore struct {
 
 // Get takes a Device's UUID and returns the Device. If the requested
 // Device does not exist an error is returned.
-func (s DeviceStore) Get(id uuid.UUID, parseErrors ...error) (*Device, error) {
+func (s DeviceStore) Get(id uuid.UUID, parseErrors ...error) (Device, error) {
 	var foundID uuid.UUID
 
 	foundID = id
@@ -201,11 +201,11 @@ func (s DeviceStore) Get(id uuid.UUID, parseErrors ...error) (*Device, error) {
 	if err != nil {
 		return nil, err
 	}
-	device, ok := item.(*Device)
+	device, ok := item.(Device)
 	if !ok {
 		return nil, &errors.ErrInvalidTypeAssertion{
 			Value: device,
-			Type:  reflect.TypeOf(&Device{}),
+			Type:  reflect.TypeOf((Device)(nil)),
 		}
 	}
 	log.WithFields(log.Fields{
diff --git a/nucleus/store_test.go b/nucleus/store_test.go
index 18a13fd4c..69bbd6282 100644
--- a/nucleus/store_test.go
+++ b/nucleus/store_test.go
@@ -271,7 +271,7 @@ func Test_sbiStore_get(t *testing.T) {
 			name: "fails wrong type",
 			fields: fields{
 				store: store{
-					did: &Device{
+					did: &CommonDevice{
 						UUID: did,
 					},
 				},
@@ -344,7 +344,7 @@ func Test_pndStore_get(t *testing.T) {
 			name: "fails wrong type",
 			fields: fields{
 				store: store{
-					did: &Device{
+					did: &CommonDevice{
 						UUID: did,
 					},
 				},
@@ -381,16 +381,16 @@ func Test_deviceStore_get(t *testing.T) {
 		name    string
 		fields  fields
 		args    args
-		want    *Device
+		want    Device
 		wantErr bool
 	}{
 		{
 			name: "exists",
 			fields: fields{
 				store: store{
-					defaultPndID: &Device{UUID: did}}},
+					defaultPndID: &CommonDevice{UUID: did}}},
 			args: args{id: defaultPndID},
-			want: &Device{
+			want: &CommonDevice{
 				UUID: did,
 			},
 			wantErr: false,
@@ -399,7 +399,7 @@ func Test_deviceStore_get(t *testing.T) {
 			name: "fails",
 			fields: fields{
 				store: store{
-					defaultPndID: &Device{UUID: did}}},
+					defaultPndID: &CommonDevice{UUID: did}}},
 			args:    args{id: iid},
 			wantErr: true,
 		},
-- 
GitLab