diff --git a/.gitignore b/.gitignore
index df309478bdc425de0c15de0e249875b4cbdcc236..f6dbfbbf8d0f0aaacb72a4c3b79d2e4cd09e3899 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-
 .idea/
+buf.lock
diff --git a/README.md b/README.md
index 5b76f2a5e80af97b31b1f95ee25ec5dc94f0d7a6..9f28d05ba9b4b292f3aae60a93bbd42816b1a665 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,8 @@
 # CoCSN API
 
-Protocol buffer definitions for goSDN gRPC API. To generate run the following command inside the repo root.
+Protocol buffer definitions for goSDN gRPC API. To generate you need [buf](https://buf.build/) and the following commands:
 
 ```sh
-protoc --proto_path=./proto --proto_path=./deps --go_out=./go --go-grpc_out=./go --go-grpc_opt=paths=source_relative --go_opt=paths=source_relative $(find proto | grep .proto)
+buf mod update proto
+buf generate
 ```
diff --git a/buf.gen.yaml b/buf.gen.yaml
index f4b7301fe33fce209d84b0701c6fae35191ddcfa..0647f64e38db3ae4c05ae2582e8a4242aecf5fe2 100644
--- a/buf.gen.yaml
+++ b/buf.gen.yaml
@@ -1,18 +1,21 @@
-version: v1beta1
+version: v1
 plugins:
-  - name: go
+  - remote: buf.build/library/plugins/go:v1.27.1-1
     out: go
     opt:
       - paths=source_relative
-  - name: go-grpc
+  - remote: buf.build/library/plugins/go-grpc:v1.1.0-2
     out: go
     opt:
       - paths=source_relative
-  - name: js
-    out: web
+  - remote: buf.build/grpc-ecosystem/plugins/grpc-gateway:v2.7.2-1
+    out: go
     opt:
-      - import_style=commonjs,binary
-  - name: grpc-web
-    out: web
+      - paths=source_relative
+  - remote: buf.build/grpc-ecosystem/plugins/openapiv2:v2.7.2-1
+    out: openapiv2
     opt:
-      - import_style=commonjs+dts,mode=grpcwebtext
+      - allow_merge=true
+      - merge_file_name=gosdn_northbound
+#      - generate_unbound_methods=true
+#      - include_package_in_tags=false
diff --git a/buf.work.yaml b/buf.work.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..53eb3c3a033a24cccaee441435920348817a81b6
--- /dev/null
+++ b/buf.work.yaml
@@ -0,0 +1,4 @@
+version: v1
+directories:
+  - proto
+  - deps
diff --git a/buf.yaml b/buf.yaml
deleted file mode 100644
index 5c873b09d07bd11c53f983d81194be77f1ef5993..0000000000000000000000000000000000000000
--- a/buf.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-version: v1beta1
-build:
-  roots:
-    - proto
-    - deps
-  excludes:
-    - deps/github.com/openconfig/gnmi/testing
-lint:
-  use:
-    - DEFAULT
-breaking:
-  use:
-    - FILE
diff --git a/deps/buf.yaml b/deps/buf.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ae21efe8bc845e77cd914ed99810793bb3a17956
--- /dev/null
+++ b/deps/buf.yaml
@@ -0,0 +1,10 @@
+version: v1
+lint:
+  use:
+    - DEFAULT
+  ignore:
+    - github.com/openconfig/gnmi/proto
+    - github.com/openconfig/gnmi/testing
+breaking:
+  use:
+    - FILE
diff --git a/go.mod b/go.mod
index ca9f4a1d68e77dc8e234d0d387a8efd8be14f37f..c48d772a726770380222393295e2668ebbdc399d 100644
--- a/go.mod
+++ b/go.mod
@@ -3,8 +3,10 @@ module code.fbi.h-da.de/danet/api
 go 1.16
 
 require (
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2
 	github.com/openconfig/gnmi v0.0.0-20210527163611-d3a3e30199da
 	golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
-	google.golang.org/grpc v1.38.0
-	google.golang.org/protobuf v1.26.0
+	google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa
+	google.golang.org/grpc v1.43.0
+	google.golang.org/protobuf v1.27.1
 )
diff --git a/go.sum b/go.sum
index 14433695be9c0678df9e7877e978f303dfc63ee4..b2f0f584e7c030dcecebbaab9e934d8f51163498 100644
--- a/go.sum
+++ b/go.sum
@@ -1,20 +1,89 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+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=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -23,17 +92,48 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+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/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=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 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.2/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/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2 h1:I/pwhnUln5wbMnTyRbzswA0/JxpK8sZj0aUfI3TV1So=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.2/go.mod h1:lsuH8kb4GlMdSlI4alNIBBSAt5CHJtg3i+0WuN9J5YM=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 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=
@@ -41,60 +141,264 @@ github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0
 github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+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-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/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-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
 google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=
+google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@@ -107,9 +411,24 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/go/gosdn/core/core.pb.go b/go/gosdn/core/core.pb.go
index c9d9296ca439d300065c3e2760d69ba2f41411d0..0df5db9352fe3437585aabcdcb80c400fd657f7f 100644
--- a/go/gosdn/core/core.pb.go
+++ b/go/gosdn/core/core.pb.go
@@ -1,13 +1,14 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
 // source: gosdn/core/core.proto
 
 package core
 
 import (
 	pnd "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
@@ -21,64 +22,65 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-type SetResponseStatus int32
+type Status int32
 
 const (
-	SetResponse_OK    SetResponseStatus = 0
-	SetResponse_ERROR SetResponseStatus = 1
+	Status_STATUS_UNSPECIFIED Status = 0
+	Status_STATUS_OK          Status = 1
+	Status_STATUS_ERROR       Status = 2
 )
 
-// Enum value maps for SetResponseStatus.
+// Enum value maps for Status.
 var (
-	SetResponseStatus_name = map[int32]string{
-		0: "OK",
-		1: "ERROR",
+	Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
 	}
-	SetResponseStatus_value = map[string]int32{
-		"OK":    0,
-		"ERROR": 1,
+	Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
 	}
 )
 
-func (x SetResponseStatus) Enum() *SetResponseStatus {
-	p := new(SetResponseStatus)
+func (x Status) Enum() *Status {
+	p := new(Status)
 	*p = x
 	return p
 }
 
-func (x SetResponseStatus) String() string {
+func (x Status) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (SetResponseStatus) Descriptor() protoreflect.EnumDescriptor {
+func (Status) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_core_core_proto_enumTypes[0].Descriptor()
 }
 
-func (SetResponseStatus) Type() protoreflect.EnumType {
+func (Status) Type() protoreflect.EnumType {
 	return &file_gosdn_core_core_proto_enumTypes[0]
 }
 
-func (x SetResponseStatus) Number() protoreflect.EnumNumber {
+func (x Status) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use SetResponseStatus.Descriptor instead.
-func (SetResponseStatus) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_core_core_proto_rawDescGZIP(), []int{4, 0}
+// Deprecated: Use Status.Descriptor instead.
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{0}
 }
 
-type GetRequest struct {
+type GetPndListRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	All       bool     `protobuf:"varint,2,opt,name=all,proto3" json:"all,omitempty"`
-	Pid       []string `protobuf:"bytes,3,rep,name=pid,proto3" json:"pid,omitempty"`
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
 }
 
-func (x *GetRequest) Reset() {
-	*x = GetRequest{}
+func (x *GetPndListRequest) Reset() {
+	*x = GetPndListRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_core_core_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -86,13 +88,13 @@ func (x *GetRequest) Reset() {
 	}
 }
 
-func (x *GetRequest) String() string {
+func (x *GetPndListRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetRequest) ProtoMessage() {}
+func (*GetPndListRequest) ProtoMessage() {}
 
-func (x *GetRequest) ProtoReflect() protoreflect.Message {
+func (x *GetPndListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_core_core_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -104,33 +106,74 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
-func (*GetRequest) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetPndListRequest.ProtoReflect.Descriptor instead.
+func (*GetPndListRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_core_core_proto_rawDescGZIP(), []int{0}
 }
 
-func (x *GetRequest) GetTimestamp() int64 {
+func (x *GetPndListRequest) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *GetRequest) GetAll() bool {
+type GetPndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       []string `protobuf:"bytes,3,rep,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetPndRequest) Reset() {
+	*x = GetPndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPndRequest) ProtoMessage() {}
+
+func (x *GetPndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPndRequest.ProtoReflect.Descriptor instead.
+func (*GetPndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetPndRequest) GetTimestamp() int64 {
 	if x != nil {
-		return x.All
+		return x.Timestamp
 	}
-	return false
+	return 0
 }
 
-func (x *GetRequest) GetPid() []string {
+func (x *GetPndRequest) GetPid() []string {
 	if x != nil {
 		return x.Pid
 	}
 	return nil
 }
 
-type GetResponse struct {
+type GetPndListResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -139,23 +182,23 @@ type GetResponse struct {
 	Pnd       []*pnd.PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
 }
 
-func (x *GetResponse) Reset() {
-	*x = GetResponse{}
+func (x *GetPndListResponse) Reset() {
+	*x = GetPndListResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_core_core_proto_msgTypes[1]
+		mi := &file_gosdn_core_core_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *GetResponse) String() string {
+func (x *GetPndListResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetResponse) ProtoMessage() {}
+func (*GetPndListResponse) ProtoMessage() {}
 
-func (x *GetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_core_core_proto_msgTypes[1]
+func (x *GetPndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -166,51 +209,51 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
-func (*GetResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_core_core_proto_rawDescGZIP(), []int{1}
+// Deprecated: Use GetPndListResponse.ProtoReflect.Descriptor instead.
+func (*GetPndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *GetResponse) GetTimestamp() int64 {
+func (x *GetPndListResponse) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *GetResponse) GetPnd() []*pnd.PrincipalNetworkDomain {
+func (x *GetPndListResponse) GetPnd() []*pnd.PrincipalNetworkDomain {
 	if x != nil {
 		return x.Pnd
 	}
 	return nil
 }
 
-type SetRequest struct {
+type GetPndResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64     `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Pnd       []*SetPnd `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
+	Timestamp int64                         `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pnd       []*pnd.PrincipalNetworkDomain `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
 }
 
-func (x *SetRequest) Reset() {
-	*x = SetRequest{}
+func (x *GetPndResponse) Reset() {
+	*x = GetPndResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_core_core_proto_msgTypes[2]
+		mi := &file_gosdn_core_core_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetRequest) String() string {
+func (x *GetPndResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetRequest) ProtoMessage() {}
+func (*GetPndResponse) ProtoMessage() {}
 
-func (x *SetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_core_core_proto_msgTypes[2]
+func (x *GetPndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -221,26 +264,81 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetRequest.ProtoReflect.Descriptor instead.
-func (*SetRequest) Descriptor() ([]byte, []int) {
-	return file_gosdn_core_core_proto_rawDescGZIP(), []int{2}
+// Deprecated: Use GetPndResponse.ProtoReflect.Descriptor instead.
+func (*GetPndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *GetPndResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
 }
 
-func (x *SetRequest) GetTimestamp() int64 {
+func (x *GetPndResponse) GetPnd() []*pnd.PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+type CreatePndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64                  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pnd       []*PndCreateProperties `protobuf:"bytes,2,rep,name=pnd,proto3" json:"pnd,omitempty"`
+}
+
+func (x *CreatePndListRequest) Reset() {
+	*x = CreatePndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreatePndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePndListRequest) ProtoMessage() {}
+
+func (x *CreatePndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePndListRequest.ProtoReflect.Descriptor instead.
+func (*CreatePndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *CreatePndListRequest) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *SetRequest) GetPnd() []*SetPnd {
+func (x *CreatePndListRequest) GetPnd() []*PndCreateProperties {
 	if x != nil {
 		return x.Pnd
 	}
 	return nil
 }
 
-type SetPnd struct {
+type PndCreateProperties struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -250,23 +348,23 @@ type SetPnd struct {
 	Sbi         string `protobuf:"bytes,3,opt,name=sbi,proto3" json:"sbi,omitempty"`
 }
 
-func (x *SetPnd) Reset() {
-	*x = SetPnd{}
+func (x *PndCreateProperties) Reset() {
+	*x = PndCreateProperties{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_core_core_proto_msgTypes[3]
+		mi := &file_gosdn_core_core_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetPnd) String() string {
+func (x *PndCreateProperties) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetPnd) ProtoMessage() {}
+func (*PndCreateProperties) ProtoMessage() {}
 
-func (x *SetPnd) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_core_core_proto_msgTypes[3]
+func (x *PndCreateProperties) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -277,58 +375,58 @@ func (x *SetPnd) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetPnd.ProtoReflect.Descriptor instead.
-func (*SetPnd) Descriptor() ([]byte, []int) {
-	return file_gosdn_core_core_proto_rawDescGZIP(), []int{3}
+// Deprecated: Use PndCreateProperties.ProtoReflect.Descriptor instead.
+func (*PndCreateProperties) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *SetPnd) GetName() string {
+func (x *PndCreateProperties) GetName() string {
 	if x != nil {
 		return x.Name
 	}
 	return ""
 }
 
-func (x *SetPnd) GetDescription() string {
+func (x *PndCreateProperties) GetDescription() string {
 	if x != nil {
 		return x.Description
 	}
 	return ""
 }
 
-func (x *SetPnd) GetSbi() string {
+func (x *PndCreateProperties) GetSbi() string {
 	if x != nil {
 		return x.Sbi
 	}
 	return ""
 }
 
-type SetResponse struct {
+type CreatePndListResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64             `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Status    SetResponseStatus `protobuf:"varint,2,opt,name=Status,proto3,enum=gosdn.core.SetResponseStatus" json:"Status,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.core.Status" json:"status,omitempty"`
 }
 
-func (x *SetResponse) Reset() {
-	*x = SetResponse{}
+func (x *CreatePndListResponse) Reset() {
+	*x = CreatePndListResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_core_core_proto_msgTypes[4]
+		mi := &file_gosdn_core_core_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetResponse) String() string {
+func (x *CreatePndListResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetResponse) ProtoMessage() {}
+func (*CreatePndListResponse) ProtoMessage() {}
 
-func (x *SetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_core_core_proto_msgTypes[4]
+func (x *CreatePndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -339,23 +437,133 @@ func (x *SetResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetResponse.ProtoReflect.Descriptor instead.
-func (*SetResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_core_core_proto_rawDescGZIP(), []int{4}
+// Deprecated: Use CreatePndListResponse.ProtoReflect.Descriptor instead.
+func (*CreatePndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreatePndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreatePndListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+type DeletePndRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *DeletePndRequest) Reset() {
+	*x = DeletePndRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeletePndRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeletePndRequest) ProtoMessage() {}
+
+func (x *DeletePndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeletePndRequest.ProtoReflect.Descriptor instead.
+func (*DeletePndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DeletePndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *DeletePndRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type DeletePndResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.core.Status" json:"status,omitempty"`
+}
+
+func (x *DeletePndResponse) Reset() {
+	*x = DeletePndResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_core_core_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeletePndResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeletePndResponse) ProtoMessage() {}
+
+func (x *DeletePndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_core_core_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DeletePndResponse.ProtoReflect.Descriptor instead.
+func (*DeletePndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_core_core_proto_rawDescGZIP(), []int{8}
 }
 
-func (x *SetResponse) GetTimestamp() int64 {
+func (x *DeletePndResponse) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *SetResponse) GetStatus() SetResponseStatus {
+func (x *DeletePndResponse) GetStatus() Status {
 	if x != nil {
 		return x.Status
 	}
-	return SetResponse_OK
+	return Status_STATUS_UNSPECIFIED
 }
 
 var File_gosdn_core_core_proto protoreflect.FileDescriptor
@@ -363,48 +571,91 @@ var File_gosdn_core_core_proto protoreflect.FileDescriptor
 var file_gosdn_core_core_proto_rawDesc = []byte{
 	0x0a, 0x15, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x72,
 	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
-	0x6f, 0x72, 0x65, 0x1a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70,
-	0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x6f, 0x72, 0x65, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x1a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70, 0x6e, 0x64,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x31, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74,
+	0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x12, 0x47, 0x65,
+	0x74, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33,
+	0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61,
+	0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03,
+	0x70, 0x6e, 0x64, 0x22, 0x63, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69,
+	0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x22, 0x67, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31,
+	0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x03, 0x70, 0x6e,
+	0x64, 0x22, 0x5d, 0x0a, 0x13, 0x50, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72,
+	0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10,
+	0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x62, 0x69,
+	0x22, 0x61, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x22, 0x42, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6e, 0x64,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
 	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50,
-	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44,
-	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x22, 0x50, 0x0a, 0x0a, 0x53, 0x65,
-	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65,
-	0x2e, 0x73, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x22, 0x50, 0x0a, 0x06,
-	0x73, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03,
-	0x73, 0x62, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x80,
-	0x01, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c,
-	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x67,
-	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x22, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x06,
-	0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
-	0x01, 0x32, 0x76, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x03, 0x47, 0x65, 0x74,
-	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x36, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2a, 0x5a, 0x28, 0x63, 0x6f, 0x64,
-	0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61,
-	0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x5d, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
+	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55,
+	0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x32, 0x85, 0x03, 0x0a, 0x0b, 0x43, 0x6f,
+	0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x53, 0x0a, 0x06, 0x47, 0x65, 0x74,
+	0x50, 0x6e, 0x64, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93,
+	0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x12, 0x5a,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x07, 0x12, 0x05, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x12, 0x66, 0x0a, 0x0d, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
+	0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x3a, 0x01, 0x2a, 0x22, 0x05, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x12, 0x5d, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x12,
+	0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x50, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3,
+	0xe4, 0x93, 0x02, 0x0d, 0x2a, 0x0b, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64,
+	0x7d, 0x42, 0x2a, 0x5a, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d,
+	0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f,
+	0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -420,29 +671,39 @@ func file_gosdn_core_core_proto_rawDescGZIP() []byte {
 }
 
 var file_gosdn_core_core_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_gosdn_core_core_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_gosdn_core_core_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
 var file_gosdn_core_core_proto_goTypes = []interface{}{
-	(SetResponseStatus)(0),             // 0: gosdn.core.SetResponse.status
-	(*GetRequest)(nil),                 // 1: gosdn.core.GetRequest
-	(*GetResponse)(nil),                // 2: gosdn.core.GetResponse
-	(*SetRequest)(nil),                 // 3: gosdn.core.SetRequest
-	(*SetPnd)(nil),                     // 4: gosdn.core.setPnd
-	(*SetResponse)(nil),                // 5: gosdn.core.SetResponse
-	(*pnd.PrincipalNetworkDomain)(nil), // 6: gosdn.pnd.PrincipalNetworkDomain
+	(Status)(0),                        // 0: gosdn.core.Status
+	(*GetPndListRequest)(nil),          // 1: gosdn.core.GetPndListRequest
+	(*GetPndRequest)(nil),              // 2: gosdn.core.GetPndRequest
+	(*GetPndListResponse)(nil),         // 3: gosdn.core.GetPndListResponse
+	(*GetPndResponse)(nil),             // 4: gosdn.core.GetPndResponse
+	(*CreatePndListRequest)(nil),       // 5: gosdn.core.CreatePndListRequest
+	(*PndCreateProperties)(nil),        // 6: gosdn.core.PndCreateProperties
+	(*CreatePndListResponse)(nil),      // 7: gosdn.core.CreatePndListResponse
+	(*DeletePndRequest)(nil),           // 8: gosdn.core.DeletePndRequest
+	(*DeletePndResponse)(nil),          // 9: gosdn.core.DeletePndResponse
+	(*pnd.PrincipalNetworkDomain)(nil), // 10: gosdn.pnd.PrincipalNetworkDomain
 }
 var file_gosdn_core_core_proto_depIdxs = []int32{
-	6, // 0: gosdn.core.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
-	4, // 1: gosdn.core.SetRequest.pnd:type_name -> gosdn.core.setPnd
-	0, // 2: gosdn.core.SetResponse.Status:type_name -> gosdn.core.SetResponse.status
-	1, // 3: gosdn.core.core.Get:input_type -> gosdn.core.GetRequest
-	3, // 4: gosdn.core.core.Set:input_type -> gosdn.core.SetRequest
-	2, // 5: gosdn.core.core.Get:output_type -> gosdn.core.GetResponse
-	5, // 6: gosdn.core.core.Set:output_type -> gosdn.core.SetResponse
-	5, // [5:7] is the sub-list for method output_type
-	3, // [3:5] is the sub-list for method input_type
-	3, // [3:3] is the sub-list for extension type_name
-	3, // [3:3] is the sub-list for extension extendee
-	0, // [0:3] is the sub-list for field type_name
+	10, // 0: gosdn.core.GetPndListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	10, // 1: gosdn.core.GetPndResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	6,  // 2: gosdn.core.CreatePndListRequest.pnd:type_name -> gosdn.core.PndCreateProperties
+	0,  // 3: gosdn.core.CreatePndListResponse.status:type_name -> gosdn.core.Status
+	0,  // 4: gosdn.core.DeletePndResponse.status:type_name -> gosdn.core.Status
+	2,  // 5: gosdn.core.CoreService.GetPnd:input_type -> gosdn.core.GetPndRequest
+	1,  // 6: gosdn.core.CoreService.GetPndList:input_type -> gosdn.core.GetPndListRequest
+	5,  // 7: gosdn.core.CoreService.CreatePndList:input_type -> gosdn.core.CreatePndListRequest
+	8,  // 8: gosdn.core.CoreService.DeletePnd:input_type -> gosdn.core.DeletePndRequest
+	4,  // 9: gosdn.core.CoreService.GetPnd:output_type -> gosdn.core.GetPndResponse
+	3,  // 10: gosdn.core.CoreService.GetPndList:output_type -> gosdn.core.GetPndListResponse
+	7,  // 11: gosdn.core.CoreService.CreatePndList:output_type -> gosdn.core.CreatePndListResponse
+	9,  // 12: gosdn.core.CoreService.DeletePnd:output_type -> gosdn.core.DeletePndResponse
+	9,  // [9:13] is the sub-list for method output_type
+	5,  // [5:9] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
 }
 
 func init() { file_gosdn_core_core_proto_init() }
@@ -452,7 +713,7 @@ func file_gosdn_core_core_proto_init() {
 	}
 	if !protoimpl.UnsafeEnabled {
 		file_gosdn_core_core_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetRequest); i {
+			switch v := v.(*GetPndListRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -464,7 +725,7 @@ func file_gosdn_core_core_proto_init() {
 			}
 		}
 		file_gosdn_core_core_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetResponse); i {
+			switch v := v.(*GetPndRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -476,7 +737,7 @@ func file_gosdn_core_core_proto_init() {
 			}
 		}
 		file_gosdn_core_core_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetRequest); i {
+			switch v := v.(*GetPndListResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -488,7 +749,7 @@ func file_gosdn_core_core_proto_init() {
 			}
 		}
 		file_gosdn_core_core_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetPnd); i {
+			switch v := v.(*GetPndResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -500,7 +761,55 @@ func file_gosdn_core_core_proto_init() {
 			}
 		}
 		file_gosdn_core_core_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetResponse); i {
+			switch v := v.(*CreatePndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PndCreateProperties); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreatePndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeletePndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_core_core_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeletePndResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -518,7 +827,7 @@ func file_gosdn_core_core_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gosdn_core_core_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   5,
+			NumMessages:   9,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/go/gosdn/core/core.pb.gw.go b/go/gosdn/core/core.pb.gw.go
new file mode 100644
index 0000000000000000000000000000000000000000..f20b6b3fcf07850e55869757651a55ebdeccda38
--- /dev/null
+++ b/go/gosdn/core/core.pb.gw.go
@@ -0,0 +1,484 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: gosdn/core/core.proto
+
+/*
+Package core is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package core
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/metadata"
+	"google.golang.org/grpc/status"
+	"google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+var (
+	filter_CoreService_GetPnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_CoreService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_GetPnd_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_CoreService_GetPndList_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
+)
+
+func request_CoreService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndListRequest
+	var metadata runtime.ServerMetadata
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_GetPndList_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPndListRequest
+	var metadata runtime.ServerMetadata
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_GetPndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_CoreService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq CreatePndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.CreatePndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_CreatePndList_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq CreatePndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.CreatePndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_CoreService_DeletePnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_CoreService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, client CoreServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeletePndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_DeletePnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.DeletePnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_CoreService_DeletePnd_0(ctx context.Context, marshaler runtime.Marshaler, server CoreServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeletePndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_CoreService_DeletePnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.DeletePnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+// RegisterCoreServiceHandlerServer registers the http handlers for service CoreService to "mux".
+// UnaryRPC     :call CoreServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterCoreServiceHandlerFromEndpoint instead.
+func RegisterCoreServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server CoreServiceServer) error {
+
+	mux.Handle("GET", pattern_CoreService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_GetPnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_CoreService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/GetPndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_GetPndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_CoreService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/CreatePndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_CreatePndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_CreatePndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_CoreService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.core.CoreService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_CoreService_DeletePnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_DeletePnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+// RegisterCoreServiceHandlerFromEndpoint is same as RegisterCoreServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterCoreServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterCoreServiceHandler(ctx, mux, conn)
+}
+
+// RegisterCoreServiceHandler registers the http handlers for service CoreService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterCoreServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterCoreServiceHandlerClient(ctx, mux, NewCoreServiceClient(conn))
+}
+
+// RegisterCoreServiceHandlerClient registers the http handlers for service CoreService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "CoreServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "CoreServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "CoreServiceClient" to call the correct interceptors.
+func RegisterCoreServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client CoreServiceClient) error {
+
+	mux.Handle("GET", pattern_CoreService_GetPnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/GetPnd", runtime.WithHTTPPathPattern("/pnd/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_GetPnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_CoreService_GetPndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/GetPndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_GetPndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_GetPndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_CoreService_CreatePndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/CreatePndList", runtime.WithHTTPPathPattern("/pnds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_CreatePndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_CreatePndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_CoreService_DeletePnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.core.CoreService/DeletePnd", runtime.WithHTTPPathPattern("/pnds/{pid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_CoreService_DeletePnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_CoreService_DeletePnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_CoreService_GetPnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnd", "pid"}, ""))
+
+	pattern_CoreService_GetPndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, ""))
+
+	pattern_CoreService_CreatePndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"pnds"}, ""))
+
+	pattern_CoreService_DeletePnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"pnds", "pid"}, ""))
+)
+
+var (
+	forward_CoreService_GetPnd_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_GetPndList_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_CreatePndList_0 = runtime.ForwardResponseMessage
+
+	forward_CoreService_DeletePnd_0 = runtime.ForwardResponseMessage
+)
diff --git a/go/gosdn/core/core_grpc.pb.go b/go/gosdn/core/core_grpc.pb.go
index 4a5590f0e25c9c07084459e9a07a4e8080dc7b2b..700014550c269e4c75b5f8f5cca584ba3fe15a7b 100644
--- a/go/gosdn/core/core_grpc.pb.go
+++ b/go/gosdn/core/core_grpc.pb.go
@@ -11,114 +11,205 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
-// CoreClient is the client API for Core service.
+// CoreServiceClient is the client API for CoreService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type CoreClient interface {
-	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
-	Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*SetResponse, error)
+type CoreServiceClient interface {
+	// Allows to request a specific Principal Network Domain.
+	GetPnd(ctx context.Context, in *GetPndRequest, opts ...grpc.CallOption) (*GetPndResponse, error)
+	// Allows to request all Principal Network Domains.
+	GetPndList(ctx context.Context, in *GetPndListRequest, opts ...grpc.CallOption) (*GetPndListResponse, error)
+	// Allows create a Principal Network Domain.
+	CreatePndList(ctx context.Context, in *CreatePndListRequest, opts ...grpc.CallOption) (*CreatePndListResponse, error)
+	// Allows to delete a specific Principal Network Domain.
+	DeletePnd(ctx context.Context, in *DeletePndRequest, opts ...grpc.CallOption) (*DeletePndResponse, error)
 }
 
-type coreClient struct {
+type coreServiceClient struct {
 	cc grpc.ClientConnInterface
 }
 
-func NewCoreClient(cc grpc.ClientConnInterface) CoreClient {
-	return &coreClient{cc}
+func NewCoreServiceClient(cc grpc.ClientConnInterface) CoreServiceClient {
+	return &coreServiceClient{cc}
 }
 
-func (c *coreClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
-	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.core.core/Get", in, out, opts...)
+func (c *coreServiceClient) GetPnd(ctx context.Context, in *GetPndRequest, opts ...grpc.CallOption) (*GetPndResponse, error) {
+	out := new(GetPndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/GetPnd", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *coreClient) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*SetResponse, error) {
-	out := new(SetResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.core.core/Set", in, out, opts...)
+func (c *coreServiceClient) GetPndList(ctx context.Context, in *GetPndListRequest, opts ...grpc.CallOption) (*GetPndListResponse, error) {
+	out := new(GetPndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/GetPndList", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-// CoreServer is the server API for Core service.
-// All implementations must embed UnimplementedCoreServer
+func (c *coreServiceClient) CreatePndList(ctx context.Context, in *CreatePndListRequest, opts ...grpc.CallOption) (*CreatePndListResponse, error) {
+	out := new(CreatePndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/CreatePndList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *coreServiceClient) DeletePnd(ctx context.Context, in *DeletePndRequest, opts ...grpc.CallOption) (*DeletePndResponse, error) {
+	out := new(DeletePndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.core.CoreService/DeletePnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CoreServiceServer is the server API for CoreService service.
+// All implementations must embed UnimplementedCoreServiceServer
 // for forward compatibility
-type CoreServer interface {
-	Get(context.Context, *GetRequest) (*GetResponse, error)
-	Set(context.Context, *SetRequest) (*SetResponse, error)
-	mustEmbedUnimplementedCoreServer()
+type CoreServiceServer interface {
+	// Allows to request a specific Principal Network Domain.
+	GetPnd(context.Context, *GetPndRequest) (*GetPndResponse, error)
+	// Allows to request all Principal Network Domains.
+	GetPndList(context.Context, *GetPndListRequest) (*GetPndListResponse, error)
+	// Allows create a Principal Network Domain.
+	CreatePndList(context.Context, *CreatePndListRequest) (*CreatePndListResponse, error)
+	// Allows to delete a specific Principal Network Domain.
+	DeletePnd(context.Context, *DeletePndRequest) (*DeletePndResponse, error)
+	mustEmbedUnimplementedCoreServiceServer()
 }
 
-// UnimplementedCoreServer must be embedded to have forward compatible implementations.
-type UnimplementedCoreServer struct {
+// UnimplementedCoreServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedCoreServiceServer struct {
 }
 
-func (*UnimplementedCoreServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+func (UnimplementedCoreServiceServer) GetPnd(context.Context, *GetPndRequest) (*GetPndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPnd not implemented")
 }
-func (*UnimplementedCoreServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Set not implemented")
+func (UnimplementedCoreServiceServer) GetPndList(context.Context, *GetPndListRequest) (*GetPndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPndList not implemented")
+}
+func (UnimplementedCoreServiceServer) CreatePndList(context.Context, *CreatePndListRequest) (*CreatePndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method CreatePndList not implemented")
+}
+func (UnimplementedCoreServiceServer) DeletePnd(context.Context, *DeletePndRequest) (*DeletePndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeletePnd not implemented")
+}
+func (UnimplementedCoreServiceServer) mustEmbedUnimplementedCoreServiceServer() {}
+
+// UnsafeCoreServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CoreServiceServer will
+// result in compilation errors.
+type UnsafeCoreServiceServer interface {
+	mustEmbedUnimplementedCoreServiceServer()
+}
+
+func RegisterCoreServiceServer(s grpc.ServiceRegistrar, srv CoreServiceServer) {
+	s.RegisterService(&CoreService_ServiceDesc, srv)
+}
+
+func _CoreService_GetPnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).GetPnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/GetPnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).GetPnd(ctx, req.(*GetPndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
-func (*UnimplementedCoreServer) mustEmbedUnimplementedCoreServer() {}
 
-func RegisterCoreServer(s *grpc.Server, srv CoreServer) {
-	s.RegisterService(&_Core_serviceDesc, srv)
+func _CoreService_GetPndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CoreServiceServer).GetPndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.core.CoreService/GetPndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CoreServiceServer).GetPndList(ctx, req.(*GetPndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
 
-func _Core_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetRequest)
+func _CoreService_CreatePndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreatePndListRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CoreServer).Get(ctx, in)
+		return srv.(CoreServiceServer).CreatePndList(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.core.core/Get",
+		FullMethod: "/gosdn.core.CoreService/CreatePndList",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CoreServer).Get(ctx, req.(*GetRequest))
+		return srv.(CoreServiceServer).CreatePndList(ctx, req.(*CreatePndListRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Core_Set_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SetRequest)
+func _CoreService_DeletePnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeletePndRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CoreServer).Set(ctx, in)
+		return srv.(CoreServiceServer).DeletePnd(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.core.core/Set",
+		FullMethod: "/gosdn.core.CoreService/DeletePnd",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CoreServer).Set(ctx, req.(*SetRequest))
+		return srv.(CoreServiceServer).DeletePnd(ctx, req.(*DeletePndRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-var _Core_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "gosdn.core.core",
-	HandlerType: (*CoreServer)(nil),
+// CoreService_ServiceDesc is the grpc.ServiceDesc for CoreService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var CoreService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.core.CoreService",
+	HandlerType: (*CoreServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
-			MethodName: "Get",
-			Handler:    _Core_Get_Handler,
+			MethodName: "GetPnd",
+			Handler:    _CoreService_GetPnd_Handler,
+		},
+		{
+			MethodName: "GetPndList",
+			Handler:    _CoreService_GetPndList_Handler,
+		},
+		{
+			MethodName: "CreatePndList",
+			Handler:    _CoreService_CreatePndList_Handler,
 		},
 		{
-			MethodName: "Set",
-			Handler:    _Core_Set_Handler,
+			MethodName: "DeletePnd",
+			Handler:    _CoreService_DeletePnd_Handler,
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
diff --git a/go/gosdn/csbi/csbi.pb.go b/go/gosdn/csbi/csbi.pb.go
index 9eceaee278c211b921d9d76134293660ecb7daf3..b8982894ca32d26937aab12ce02dae6f914d61e8 100644
--- a/go/gosdn/csbi/csbi.pb.go
+++ b/go/gosdn/csbi/csbi.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
 // source: gosdn/csbi/csbi.proto
 
 package csbi
@@ -24,28 +24,31 @@ const (
 type State int32
 
 const (
-	State_ANNOUNCED      State = 0
-	State_BUILT          State = 1
-	State_DEPLOYED       State = 2
-	State_RUNNING        State = 3
-	State_DECOMMISSIONED State = 4
+	State_STATE_UNSPECIFIED    State = 0
+	State_STATE_ANNOUNCED      State = 1
+	State_STATE_BUILT          State = 2
+	State_STATE_DEPLOYED       State = 3
+	State_STATE_RUNNING        State = 4
+	State_STATE_DECOMMISSIONED State = 5
 )
 
 // Enum value maps for State.
 var (
 	State_name = map[int32]string{
-		0: "ANNOUNCED",
-		1: "BUILT",
-		2: "DEPLOYED",
-		3: "RUNNING",
-		4: "DECOMMISSIONED",
+		0: "STATE_UNSPECIFIED",
+		1: "STATE_ANNOUNCED",
+		2: "STATE_BUILT",
+		3: "STATE_DEPLOYED",
+		4: "STATE_RUNNING",
+		5: "STATE_DECOMMISSIONED",
 	}
 	State_value = map[string]int32{
-		"ANNOUNCED":      0,
-		"BUILT":          1,
-		"DEPLOYED":       2,
-		"RUNNING":        3,
-		"DECOMMISSIONED": 4,
+		"STATE_UNSPECIFIED":    0,
+		"STATE_ANNOUNCED":      1,
+		"STATE_BUILT":          2,
+		"STATE_DEPLOYED":       3,
+		"STATE_RUNNING":        4,
+		"STATE_DECOMMISSIONED": 5,
 	}
 )
 
@@ -76,50 +79,53 @@ func (State) EnumDescriptor() ([]byte, []int) {
 	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{0}
 }
 
-type DeleteResponseStatus int32
+type DeleteResponse_Status int32
 
 const (
-	DeleteResponse_OK    DeleteResponseStatus = 0
-	DeleteResponse_ERROR DeleteResponseStatus = 1
+	DeleteResponse_STATUS_UNSPECIFIED DeleteResponse_Status = 0
+	DeleteResponse_STATUS_OK          DeleteResponse_Status = 1
+	DeleteResponse_STATUS_ERROR       DeleteResponse_Status = 2
 )
 
-// Enum value maps for DeleteResponseStatus.
+// Enum value maps for DeleteResponse_Status.
 var (
-	DeleteResponseStatus_name = map[int32]string{
-		0: "OK",
-		1: "ERROR",
+	DeleteResponse_Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
 	}
-	DeleteResponseStatus_value = map[string]int32{
-		"OK":    0,
-		"ERROR": 1,
+	DeleteResponse_Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
 	}
 )
 
-func (x DeleteResponseStatus) Enum() *DeleteResponseStatus {
-	p := new(DeleteResponseStatus)
+func (x DeleteResponse_Status) Enum() *DeleteResponse_Status {
+	p := new(DeleteResponse_Status)
 	*p = x
 	return p
 }
 
-func (x DeleteResponseStatus) String() string {
+func (x DeleteResponse_Status) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (DeleteResponseStatus) Descriptor() protoreflect.EnumDescriptor {
+func (DeleteResponse_Status) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_csbi_csbi_proto_enumTypes[1].Descriptor()
 }
 
-func (DeleteResponseStatus) Type() protoreflect.EnumType {
+func (DeleteResponse_Status) Type() protoreflect.EnumType {
 	return &file_gosdn_csbi_csbi_proto_enumTypes[1]
 }
 
-func (x DeleteResponseStatus) Number() protoreflect.EnumNumber {
+func (x DeleteResponse_Status) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use DeleteResponseStatus.Descriptor instead.
-func (DeleteResponseStatus) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{9, 0}
+// Deprecated: Use DeleteResponse_Status.Descriptor instead.
+func (DeleteResponse_Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{10, 0}
 }
 
 type Syn struct {
@@ -191,7 +197,7 @@ type Ack struct {
 	unknownFields protoimpl.UnknownFields
 
 	Timestamp       int64                      `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	TransportOption *transport.TransportOption `protobuf:"bytes,2,opt,name=TransportOption,proto3" json:"TransportOption,omitempty"`
+	TransportOption *transport.TransportOption `protobuf:"bytes,2,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
 }
 
 func (x *Ack) Reset() {
@@ -418,7 +424,7 @@ func (x *Deployment) GetState() State {
 	if x != nil {
 		return x.State
 	}
-	return State_ANNOUNCED
+	return State_STATE_UNSPECIFIED
 }
 
 type CreateRequest struct {
@@ -427,7 +433,7 @@ type CreateRequest struct {
 	unknownFields protoimpl.UnknownFields
 
 	Timestamp       int64                        `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	TransportOption []*transport.TransportOption `protobuf:"bytes,2,rep,name=TransportOption,proto3" json:"TransportOption,omitempty"`
+	TransportOption []*transport.TransportOption `protobuf:"bytes,2,rep,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
 }
 
 func (x *CreateRequest) Reset() {
@@ -476,6 +482,61 @@ func (x *CreateRequest) GetTransportOption() []*transport.TransportOption {
 	return nil
 }
 
+type CreatePluginRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp       int64                        `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	TransportOption []*transport.TransportOption `protobuf:"bytes,2,rep,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
+}
+
+func (x *CreatePluginRequest) Reset() {
+	*x = CreatePluginRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreatePluginRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreatePluginRequest) ProtoMessage() {}
+
+func (x *CreatePluginRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CreatePluginRequest.ProtoReflect.Descriptor instead.
+func (*CreatePluginRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreatePluginRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *CreatePluginRequest) GetTransportOption() []*transport.TransportOption {
+	if x != nil {
+		return x.TransportOption
+	}
+	return nil
+}
+
 type CreateResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -488,7 +549,7 @@ type CreateResponse struct {
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -501,7 +562,7 @@ func (x *CreateResponse) String() string {
 func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_csbi_csbi_proto_msgTypes[6]
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -514,7 +575,7 @@ func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead.
 func (*CreateResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{6}
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *CreateResponse) GetTimestamp() int64 {
@@ -536,13 +597,13 @@ type Payload struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Chunk []byte `protobuf:"bytes,1,opt,name=Chunk,proto3" json:"Chunk,omitempty"`
+	Chunk []byte `protobuf:"bytes,1,opt,name=chunk,proto3" json:"chunk,omitempty"`
 }
 
 func (x *Payload) Reset() {
 	*x = Payload{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -555,7 +616,7 @@ func (x *Payload) String() string {
 func (*Payload) ProtoMessage() {}
 
 func (x *Payload) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_csbi_csbi_proto_msgTypes[7]
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -568,7 +629,7 @@ func (x *Payload) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Payload.ProtoReflect.Descriptor instead.
 func (*Payload) Descriptor() ([]byte, []int) {
-	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{7}
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *Payload) GetChunk() []byte {
@@ -590,7 +651,7 @@ type DeleteRequest struct {
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -603,7 +664,7 @@ func (x *DeleteRequest) String() string {
 func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_csbi_csbi_proto_msgTypes[8]
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -616,7 +677,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{8}
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *DeleteRequest) GetTimestamp() int64 {
@@ -638,14 +699,14 @@ type DeleteResponse struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64                `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Status    DeleteResponseStatus `protobuf:"varint,2,opt,name=Status,proto3,enum=gosdn.csbi.DeleteResponseStatus" json:"Status,omitempty"`
+	Timestamp int64                 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    DeleteResponse_Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.csbi.DeleteResponse_Status" json:"status,omitempty"`
 }
 
 func (x *DeleteResponse) Reset() {
 	*x = DeleteResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
+		mi := &file_gosdn_csbi_csbi_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -658,7 +719,7 @@ func (x *DeleteResponse) String() string {
 func (*DeleteResponse) ProtoMessage() {}
 
 func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_csbi_csbi_proto_msgTypes[9]
+	mi := &file_gosdn_csbi_csbi_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -671,7 +732,7 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead.
 func (*DeleteResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{9}
+	return file_gosdn_csbi_csbi_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *DeleteResponse) GetTimestamp() int64 {
@@ -681,11 +742,11 @@ func (x *DeleteResponse) GetTimestamp() int64 {
 	return 0
 }
 
-func (x *DeleteResponse) GetStatus() DeleteResponseStatus {
+func (x *DeleteResponse) GetStatus() DeleteResponse_Status {
 	if x != nil {
 		return x.Status
 	}
-	return DeleteResponse_OK
+	return DeleteResponse_STATUS_UNSPECIFIED
 }
 
 var File_gosdn_csbi_csbi_proto protoreflect.FileDescriptor
@@ -700,87 +761,102 @@ var file_gosdn_csbi_csbi_proto_rawDesc = []byte{
 	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
 	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64,
 	0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72,
-	0x65, 0x73, 0x73, 0x22, 0x6f, 0x0a, 0x03, 0x41, 0x63, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x65, 0x73, 0x73, 0x22, 0x70, 0x0a, 0x03, 0x41, 0x63, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
 	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e,
-	0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
-	0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03,
+	0x61, 0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52,
+	0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x59, 0x0a, 0x0a,
+	0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27,
+	0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x7a, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x22, 0x80, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6c,
+	0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e,
+	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x68, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79,
+	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d,
+	0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+	0x22, 0x1f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63,
+	0x68, 0x75, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e,
+	0x6b, 0x22, 0x3f, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
 	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61,
-	0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
-	0x03, 0x64, 0x69, 0x64, 0x22, 0x65, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
-	0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b,
-	0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x59, 0x0a, 0x0a, 0x44,
-	0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
-	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a,
-	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x67,
-	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
-	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x79, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
-	0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20,
-	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
-	0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x52, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x22, 0x68, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
-	0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b,
-	0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x50,
-	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x3f, 0x0a, 0x0d,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a,
-	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64,
-	0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x86, 0x01,
-	0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39,
-	0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21,
-	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45,
-	0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x2a, 0x50, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
-	0x0d, 0x0a, 0x09, 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09,
-	0x0a, 0x05, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x50,
-	0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49,
-	0x4e, 0x47, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x53,
-	0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x32, 0xad, 0x02, 0x0a, 0x04, 0x63, 0x73, 0x62,
-	0x69, 0x12, 0x36, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69,
-	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a,
+	0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64,
+	0x69, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69,
+	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41,
+	0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12,
+	0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10,
+	0x02, 0x2a, 0x85, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53,
+	0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
+	0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f,
+	0x55, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x45,
+	0x5f, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54,
+	0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d,
+	0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12,
+	0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x49,
+	0x53, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x32, 0xba, 0x02, 0x0a, 0x0b, 0x43, 0x73,
+	0x62, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x03, 0x47, 0x65, 0x74,
+	0x12, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x3f, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
+	0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x0f, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x53, 0x79, 0x6e, 0x1a, 0x0f, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x41, 0x63, 0x6b, 0x12, 0x46,
+	0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1f,
 	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62,
-	0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x44, 0x65, 0x6c,
-	0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x48,
-	0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x0f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62,
-	0x69, 0x2e, 0x53, 0x79, 0x6e, 0x1a, 0x0f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73,
-	0x62, 0x69, 0x2e, 0x41, 0x63, 0x6b, 0x12, 0x40, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
-	0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63,
-	0x73, 0x62, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x13, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x50,
-	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x42, 0x2a, 0x5a, 0x28, 0x63, 0x6f, 0x64, 0x65,
-	0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e,
-	0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f,
-	0x63, 0x73, 0x62, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x13, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x73, 0x62, 0x69, 0x2e, 0x50, 0x61, 0x79,
+	0x6c, 0x6f, 0x61, 0x64, 0x30, 0x01, 0x42, 0x2a, 0x5a, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66,
+	0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74,
+	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x63, 0x73,
+	0x62, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -796,44 +872,46 @@ func file_gosdn_csbi_csbi_proto_rawDescGZIP() []byte {
 }
 
 var file_gosdn_csbi_csbi_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_gosdn_csbi_csbi_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
+var file_gosdn_csbi_csbi_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
 var file_gosdn_csbi_csbi_proto_goTypes = []interface{}{
 	(State)(0),                        // 0: gosdn.csbi.State
-	(DeleteResponseStatus)(0),         // 1: gosdn.csbi.DeleteResponse.status
+	(DeleteResponse_Status)(0),        // 1: gosdn.csbi.DeleteResponse.Status
 	(*Syn)(nil),                       // 2: gosdn.csbi.Syn
 	(*Ack)(nil),                       // 3: gosdn.csbi.Ack
 	(*GetRequest)(nil),                // 4: gosdn.csbi.GetRequest
 	(*GetResponse)(nil),               // 5: gosdn.csbi.GetResponse
 	(*Deployment)(nil),                // 6: gosdn.csbi.Deployment
 	(*CreateRequest)(nil),             // 7: gosdn.csbi.CreateRequest
-	(*CreateResponse)(nil),            // 8: gosdn.csbi.CreateResponse
-	(*Payload)(nil),                   // 9: gosdn.csbi.Payload
-	(*DeleteRequest)(nil),             // 10: gosdn.csbi.DeleteRequest
-	(*DeleteResponse)(nil),            // 11: gosdn.csbi.DeleteResponse
-	(*transport.TransportOption)(nil), // 12: gosdn.transport.TransportOption
+	(*CreatePluginRequest)(nil),       // 8: gosdn.csbi.CreatePluginRequest
+	(*CreateResponse)(nil),            // 9: gosdn.csbi.CreateResponse
+	(*Payload)(nil),                   // 10: gosdn.csbi.Payload
+	(*DeleteRequest)(nil),             // 11: gosdn.csbi.DeleteRequest
+	(*DeleteResponse)(nil),            // 12: gosdn.csbi.DeleteResponse
+	(*transport.TransportOption)(nil), // 13: gosdn.transport.TransportOption
 }
 var file_gosdn_csbi_csbi_proto_depIdxs = []int32{
-	12, // 0: gosdn.csbi.Ack.TransportOption:type_name -> gosdn.transport.TransportOption
+	13, // 0: gosdn.csbi.Ack.transport_option:type_name -> gosdn.transport.TransportOption
 	6,  // 1: gosdn.csbi.GetResponse.deployments:type_name -> gosdn.csbi.Deployment
 	0,  // 2: gosdn.csbi.Deployment.state:type_name -> gosdn.csbi.State
-	12, // 3: gosdn.csbi.CreateRequest.TransportOption:type_name -> gosdn.transport.TransportOption
-	6,  // 4: gosdn.csbi.CreateResponse.deployments:type_name -> gosdn.csbi.Deployment
-	1,  // 5: gosdn.csbi.DeleteResponse.Status:type_name -> gosdn.csbi.DeleteResponse.status
-	4,  // 6: gosdn.csbi.csbi.Get:input_type -> gosdn.csbi.GetRequest
-	7,  // 7: gosdn.csbi.csbi.Create:input_type -> gosdn.csbi.CreateRequest
-	10, // 8: gosdn.csbi.csbi.Delete:input_type -> gosdn.csbi.DeleteRequest
-	2,  // 9: gosdn.csbi.csbi.Hello:input_type -> gosdn.csbi.Syn
-	7,  // 10: gosdn.csbi.csbi.CreatePlugin:input_type -> gosdn.csbi.CreateRequest
-	5,  // 11: gosdn.csbi.csbi.Get:output_type -> gosdn.csbi.GetResponse
-	8,  // 12: gosdn.csbi.csbi.Create:output_type -> gosdn.csbi.CreateResponse
-	11, // 13: gosdn.csbi.csbi.Delete:output_type -> gosdn.csbi.DeleteResponse
-	3,  // 14: gosdn.csbi.csbi.Hello:output_type -> gosdn.csbi.Ack
-	9,  // 15: gosdn.csbi.csbi.CreatePlugin:output_type -> gosdn.csbi.Payload
-	11, // [11:16] is the sub-list for method output_type
-	6,  // [6:11] is the sub-list for method input_type
-	6,  // [6:6] is the sub-list for extension type_name
-	6,  // [6:6] is the sub-list for extension extendee
-	0,  // [0:6] is the sub-list for field type_name
+	13, // 3: gosdn.csbi.CreateRequest.transport_option:type_name -> gosdn.transport.TransportOption
+	13, // 4: gosdn.csbi.CreatePluginRequest.transport_option:type_name -> gosdn.transport.TransportOption
+	6,  // 5: gosdn.csbi.CreateResponse.deployments:type_name -> gosdn.csbi.Deployment
+	1,  // 6: gosdn.csbi.DeleteResponse.status:type_name -> gosdn.csbi.DeleteResponse.Status
+	4,  // 7: gosdn.csbi.CsbiService.Get:input_type -> gosdn.csbi.GetRequest
+	7,  // 8: gosdn.csbi.CsbiService.Create:input_type -> gosdn.csbi.CreateRequest
+	11, // 9: gosdn.csbi.CsbiService.Delete:input_type -> gosdn.csbi.DeleteRequest
+	2,  // 10: gosdn.csbi.CsbiService.Hello:input_type -> gosdn.csbi.Syn
+	8,  // 11: gosdn.csbi.CsbiService.CreatePlugin:input_type -> gosdn.csbi.CreatePluginRequest
+	5,  // 12: gosdn.csbi.CsbiService.Get:output_type -> gosdn.csbi.GetResponse
+	9,  // 13: gosdn.csbi.CsbiService.Create:output_type -> gosdn.csbi.CreateResponse
+	12, // 14: gosdn.csbi.CsbiService.Delete:output_type -> gosdn.csbi.DeleteResponse
+	3,  // 15: gosdn.csbi.CsbiService.Hello:output_type -> gosdn.csbi.Ack
+	10, // 16: gosdn.csbi.CsbiService.CreatePlugin:output_type -> gosdn.csbi.Payload
+	12, // [12:17] is the sub-list for method output_type
+	7,  // [7:12] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
 }
 
 func init() { file_gosdn_csbi_csbi_proto_init() }
@@ -915,7 +993,7 @@ func file_gosdn_csbi_csbi_proto_init() {
 			}
 		}
 		file_gosdn_csbi_csbi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateResponse); i {
+			switch v := v.(*CreatePluginRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -927,7 +1005,7 @@ func file_gosdn_csbi_csbi_proto_init() {
 			}
 		}
 		file_gosdn_csbi_csbi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Payload); i {
+			switch v := v.(*CreateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -939,7 +1017,7 @@ func file_gosdn_csbi_csbi_proto_init() {
 			}
 		}
 		file_gosdn_csbi_csbi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteRequest); i {
+			switch v := v.(*Payload); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -951,6 +1029,18 @@ func file_gosdn_csbi_csbi_proto_init() {
 			}
 		}
 		file_gosdn_csbi_csbi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_csbi_csbi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeleteResponse); i {
 			case 0:
 				return &v.state
@@ -969,7 +1059,7 @@ func file_gosdn_csbi_csbi_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gosdn_csbi_csbi_proto_rawDesc,
 			NumEnums:      2,
-			NumMessages:   10,
+			NumMessages:   11,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/go/gosdn/csbi/csbi_grpc.pb.go b/go/gosdn/csbi/csbi_grpc.pb.go
index e3fa961e8ca86b17b0b87ca2e1a6568c1b5a42a5..f932112a5ccf4a5e0bc6e414e2455e4af40cbf61 100644
--- a/go/gosdn/csbi/csbi_grpc.pb.go
+++ b/go/gosdn/csbi/csbi_grpc.pb.go
@@ -11,69 +11,70 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
-// CsbiClient is the client API for Csbi service.
+// CsbiServiceClient is the client API for CsbiService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type CsbiClient interface {
+type CsbiServiceClient interface {
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
 	Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption) (*Ack, error)
-	CreatePlugin(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (Csbi_CreatePluginClient, error)
+	CreatePlugin(ctx context.Context, in *CreatePluginRequest, opts ...grpc.CallOption) (CsbiService_CreatePluginClient, error)
 }
 
-type csbiClient struct {
+type csbiServiceClient struct {
 	cc grpc.ClientConnInterface
 }
 
-func NewCsbiClient(cc grpc.ClientConnInterface) CsbiClient {
-	return &csbiClient{cc}
+func NewCsbiServiceClient(cc grpc.ClientConnInterface) CsbiServiceClient {
+	return &csbiServiceClient{cc}
 }
 
-func (c *csbiClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
+func (c *csbiServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.csbi.csbi/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Get", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *csbiClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
+func (c *csbiServiceClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.csbi.csbi/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Create", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *csbiClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
+func (c *csbiServiceClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
 	out := new(DeleteResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.csbi.csbi/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Delete", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *csbiClient) Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption) (*Ack, error) {
+func (c *csbiServiceClient) Hello(ctx context.Context, in *Syn, opts ...grpc.CallOption) (*Ack, error) {
 	out := new(Ack)
-	err := c.cc.Invoke(ctx, "/gosdn.csbi.csbi/Hello", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/gosdn.csbi.CsbiService/Hello", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *csbiClient) CreatePlugin(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (Csbi_CreatePluginClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Csbi_serviceDesc.Streams[0], "/gosdn.csbi.csbi/CreatePlugin", opts...)
+func (c *csbiServiceClient) CreatePlugin(ctx context.Context, in *CreatePluginRequest, opts ...grpc.CallOption) (CsbiService_CreatePluginClient, error) {
+	stream, err := c.cc.NewStream(ctx, &CsbiService_ServiceDesc.Streams[0], "/gosdn.csbi.CsbiService/CreatePlugin", opts...)
 	if err != nil {
 		return nil, err
 	}
-	x := &csbiCreatePluginClient{stream}
+	x := &csbiServiceCreatePluginClient{stream}
 	if err := x.ClientStream.SendMsg(in); err != nil {
 		return nil, err
 	}
@@ -83,16 +84,16 @@ func (c *csbiClient) CreatePlugin(ctx context.Context, in *CreateRequest, opts .
 	return x, nil
 }
 
-type Csbi_CreatePluginClient interface {
+type CsbiService_CreatePluginClient interface {
 	Recv() (*Payload, error)
 	grpc.ClientStream
 }
 
-type csbiCreatePluginClient struct {
+type csbiServiceCreatePluginClient struct {
 	grpc.ClientStream
 }
 
-func (x *csbiCreatePluginClient) Recv() (*Payload, error) {
+func (x *csbiServiceCreatePluginClient) Recv() (*Payload, error) {
 	m := new(Payload)
 	if err := x.ClientStream.RecvMsg(m); err != nil {
 		return nil, err
@@ -100,161 +101,171 @@ func (x *csbiCreatePluginClient) Recv() (*Payload, error) {
 	return m, nil
 }
 
-// CsbiServer is the server API for Csbi service.
-// All implementations must embed UnimplementedCsbiServer
+// CsbiServiceServer is the server API for CsbiService service.
+// All implementations must embed UnimplementedCsbiServiceServer
 // for forward compatibility
-type CsbiServer interface {
+type CsbiServiceServer interface {
 	Get(context.Context, *GetRequest) (*GetResponse, error)
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
 	Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
 	Hello(context.Context, *Syn) (*Ack, error)
-	CreatePlugin(*CreateRequest, Csbi_CreatePluginServer) error
-	mustEmbedUnimplementedCsbiServer()
+	CreatePlugin(*CreatePluginRequest, CsbiService_CreatePluginServer) error
+	mustEmbedUnimplementedCsbiServiceServer()
 }
 
-// UnimplementedCsbiServer must be embedded to have forward compatible implementations.
-type UnimplementedCsbiServer struct {
+// UnimplementedCsbiServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedCsbiServiceServer struct {
 }
 
-func (*UnimplementedCsbiServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
+func (UnimplementedCsbiServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
 }
-func (*UnimplementedCsbiServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
+func (UnimplementedCsbiServiceServer) Create(context.Context, *CreateRequest) (*CreateResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
 }
-func (*UnimplementedCsbiServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
+func (UnimplementedCsbiServiceServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
 }
-func (*UnimplementedCsbiServer) Hello(context.Context, *Syn) (*Ack, error) {
+func (UnimplementedCsbiServiceServer) Hello(context.Context, *Syn) (*Ack, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method Hello not implemented")
 }
-func (*UnimplementedCsbiServer) CreatePlugin(*CreateRequest, Csbi_CreatePluginServer) error {
+func (UnimplementedCsbiServiceServer) CreatePlugin(*CreatePluginRequest, CsbiService_CreatePluginServer) error {
 	return status.Errorf(codes.Unimplemented, "method CreatePlugin not implemented")
 }
-func (*UnimplementedCsbiServer) mustEmbedUnimplementedCsbiServer() {}
+func (UnimplementedCsbiServiceServer) mustEmbedUnimplementedCsbiServiceServer() {}
 
-func RegisterCsbiServer(s *grpc.Server, srv CsbiServer) {
-	s.RegisterService(&_Csbi_serviceDesc, srv)
+// UnsafeCsbiServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to CsbiServiceServer will
+// result in compilation errors.
+type UnsafeCsbiServiceServer interface {
+	mustEmbedUnimplementedCsbiServiceServer()
 }
 
-func _Csbi_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func RegisterCsbiServiceServer(s grpc.ServiceRegistrar, srv CsbiServiceServer) {
+	s.RegisterService(&CsbiService_ServiceDesc, srv)
+}
+
+func _CsbiService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(GetRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CsbiServer).Get(ctx, in)
+		return srv.(CsbiServiceServer).Get(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.csbi.csbi/Get",
+		FullMethod: "/gosdn.csbi.CsbiService/Get",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CsbiServer).Get(ctx, req.(*GetRequest))
+		return srv.(CsbiServiceServer).Get(ctx, req.(*GetRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Csbi_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _CsbiService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(CreateRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CsbiServer).Create(ctx, in)
+		return srv.(CsbiServiceServer).Create(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.csbi.csbi/Create",
+		FullMethod: "/gosdn.csbi.CsbiService/Create",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CsbiServer).Create(ctx, req.(*CreateRequest))
+		return srv.(CsbiServiceServer).Create(ctx, req.(*CreateRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Csbi_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _CsbiService_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(DeleteRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CsbiServer).Delete(ctx, in)
+		return srv.(CsbiServiceServer).Delete(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.csbi.csbi/Delete",
+		FullMethod: "/gosdn.csbi.CsbiService/Delete",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CsbiServer).Delete(ctx, req.(*DeleteRequest))
+		return srv.(CsbiServiceServer).Delete(ctx, req.(*DeleteRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Csbi_Hello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _CsbiService_Hello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(Syn)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(CsbiServer).Hello(ctx, in)
+		return srv.(CsbiServiceServer).Hello(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.csbi.csbi/Hello",
+		FullMethod: "/gosdn.csbi.CsbiService/Hello",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CsbiServer).Hello(ctx, req.(*Syn))
+		return srv.(CsbiServiceServer).Hello(ctx, req.(*Syn))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Csbi_CreatePlugin_Handler(srv interface{}, stream grpc.ServerStream) error {
-	m := new(CreateRequest)
+func _CsbiService_CreatePlugin_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(CreatePluginRequest)
 	if err := stream.RecvMsg(m); err != nil {
 		return err
 	}
-	return srv.(CsbiServer).CreatePlugin(m, &csbiCreatePluginServer{stream})
+	return srv.(CsbiServiceServer).CreatePlugin(m, &csbiServiceCreatePluginServer{stream})
 }
 
-type Csbi_CreatePluginServer interface {
+type CsbiService_CreatePluginServer interface {
 	Send(*Payload) error
 	grpc.ServerStream
 }
 
-type csbiCreatePluginServer struct {
+type csbiServiceCreatePluginServer struct {
 	grpc.ServerStream
 }
 
-func (x *csbiCreatePluginServer) Send(m *Payload) error {
+func (x *csbiServiceCreatePluginServer) Send(m *Payload) error {
 	return x.ServerStream.SendMsg(m)
 }
 
-var _Csbi_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "gosdn.csbi.csbi",
-	HandlerType: (*CsbiServer)(nil),
+// CsbiService_ServiceDesc is the grpc.ServiceDesc for CsbiService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var CsbiService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.csbi.CsbiService",
+	HandlerType: (*CsbiServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
 			MethodName: "Get",
-			Handler:    _Csbi_Get_Handler,
+			Handler:    _CsbiService_Get_Handler,
 		},
 		{
 			MethodName: "Create",
-			Handler:    _Csbi_Create_Handler,
+			Handler:    _CsbiService_Create_Handler,
 		},
 		{
 			MethodName: "Delete",
-			Handler:    _Csbi_Delete_Handler,
+			Handler:    _CsbiService_Delete_Handler,
 		},
 		{
 			MethodName: "Hello",
-			Handler:    _Csbi_Hello_Handler,
+			Handler:    _CsbiService_Hello_Handler,
 		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
 			StreamName:    "CreatePlugin",
-			Handler:       _Csbi_CreatePlugin_Handler,
+			Handler:       _CsbiService_CreatePlugin_Handler,
 			ServerStreams: true,
 		},
 	},
diff --git a/go/gosdn/pnd/pnd.pb.go b/go/gosdn/pnd/pnd.pb.go
index cc4e1f7eb1085456d4873e8e20a4298de766e250..fd8e4b87e33b7102338157efdbbf527c4f9a9e72 100644
--- a/go/gosdn/pnd/pnd.pb.go
+++ b/go/gosdn/pnd/pnd.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
 // source: gosdn/pnd/pnd.proto
 
 package pnd
@@ -9,7 +9,9 @@ package pnd
 import (
 	southbound "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
 	transport "code.fbi.h-da.de/danet/api/go/gosdn/transport"
+	_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"
 	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	_ "google.golang.org/genproto/googleapis/api/annotations"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	_ "google.golang.org/protobuf/types/descriptorpb"
@@ -24,315 +26,277 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
-type ApiOperation int32
+type ChangeState int32
 
 const (
-	ApiOperation_UPDATE  ApiOperation = 0
-	ApiOperation_REPLACE ApiOperation = 1
-	ApiOperation_DELETE  ApiOperation = 2
+	ChangeState_CHANGE_STATE_UNSPECIFIED  ChangeState = 0
+	ChangeState_CHANGE_STATE_PENDING      ChangeState = 1
+	ChangeState_CHANGE_STATE_COMMITTED    ChangeState = 2
+	ChangeState_CHANGE_STATE_CONFIRMED    ChangeState = 3
+	ChangeState_CHANGE_STATE_INCONSISTENT ChangeState = 4
 )
 
-// Enum value maps for ApiOperation.
+// Enum value maps for ChangeState.
 var (
-	ApiOperation_name = map[int32]string{
-		0: "UPDATE",
-		1: "REPLACE",
-		2: "DELETE",
-	}
-	ApiOperation_value = map[string]int32{
-		"UPDATE":  0,
-		"REPLACE": 1,
-		"DELETE":  2,
+	ChangeState_name = map[int32]string{
+		0: "CHANGE_STATE_UNSPECIFIED",
+		1: "CHANGE_STATE_PENDING",
+		2: "CHANGE_STATE_COMMITTED",
+		3: "CHANGE_STATE_CONFIRMED",
+		4: "CHANGE_STATE_INCONSISTENT",
+	}
+	ChangeState_value = map[string]int32{
+		"CHANGE_STATE_UNSPECIFIED":  0,
+		"CHANGE_STATE_PENDING":      1,
+		"CHANGE_STATE_COMMITTED":    2,
+		"CHANGE_STATE_CONFIRMED":    3,
+		"CHANGE_STATE_INCONSISTENT": 4,
 	}
 )
 
-func (x ApiOperation) Enum() *ApiOperation {
-	p := new(ApiOperation)
+func (x ChangeState) Enum() *ChangeState {
+	p := new(ChangeState)
 	*p = x
 	return p
 }
 
-func (x ApiOperation) String() string {
+func (x ChangeState) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (ApiOperation) Descriptor() protoreflect.EnumDescriptor {
+func (ChangeState) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_pnd_pnd_proto_enumTypes[0].Descriptor()
 }
 
-func (ApiOperation) Type() protoreflect.EnumType {
+func (ChangeState) Type() protoreflect.EnumType {
 	return &file_gosdn_pnd_pnd_proto_enumTypes[0]
 }
 
-func (x ApiOperation) Number() protoreflect.EnumNumber {
+func (x ChangeState) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use ApiOperation.Descriptor instead.
-func (ApiOperation) EnumDescriptor() ([]byte, []int) {
+// Deprecated: Use ChangeState.Descriptor instead.
+func (ChangeState) EnumDescriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{0}
 }
 
-type Change_State int32
+type ApiOperation int32
 
 const (
-	Change_PENDING      Change_State = 0
-	Change_COMMITTED    Change_State = 1
-	Change_CONFIRMED    Change_State = 2
-	Change_INCONSISTENT Change_State = 3
+	ApiOperation_API_OPERATION_UNSPECIFIED ApiOperation = 0
+	ApiOperation_API_OPERATION_UPDATE      ApiOperation = 1
+	ApiOperation_API_OPERATION_REPLACE     ApiOperation = 2
+	ApiOperation_API_OPERATION_DELETE      ApiOperation = 3
 )
 
-// Enum value maps for Change_State.
+// Enum value maps for ApiOperation.
 var (
-	Change_State_name = map[int32]string{
-		0: "PENDING",
-		1: "COMMITTED",
-		2: "CONFIRMED",
-		3: "INCONSISTENT",
-	}
-	Change_State_value = map[string]int32{
-		"PENDING":      0,
-		"COMMITTED":    1,
-		"CONFIRMED":    2,
-		"INCONSISTENT": 3,
+	ApiOperation_name = map[int32]string{
+		0: "API_OPERATION_UNSPECIFIED",
+		1: "API_OPERATION_UPDATE",
+		2: "API_OPERATION_REPLACE",
+		3: "API_OPERATION_DELETE",
+	}
+	ApiOperation_value = map[string]int32{
+		"API_OPERATION_UNSPECIFIED": 0,
+		"API_OPERATION_UPDATE":      1,
+		"API_OPERATION_REPLACE":     2,
+		"API_OPERATION_DELETE":      3,
 	}
 )
 
-func (x Change_State) Enum() *Change_State {
-	p := new(Change_State)
+func (x ApiOperation) Enum() *ApiOperation {
+	p := new(ApiOperation)
 	*p = x
 	return p
 }
 
-func (x Change_State) String() string {
+func (x ApiOperation) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (Change_State) Descriptor() protoreflect.EnumDescriptor {
+func (ApiOperation) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_pnd_pnd_proto_enumTypes[1].Descriptor()
 }
 
-func (Change_State) Type() protoreflect.EnumType {
+func (ApiOperation) Type() protoreflect.EnumType {
 	return &file_gosdn_pnd_pnd_proto_enumTypes[1]
 }
 
-func (x Change_State) Number() protoreflect.EnumNumber {
+func (x ApiOperation) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use Change_State.Descriptor instead.
-func (Change_State) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{9, 0}
+// Deprecated: Use ApiOperation.Descriptor instead.
+func (ApiOperation) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{1}
 }
 
-type SetChange_Operation int32
+type SbiType int32
 
 const (
-	SetChange_CREATE  SetChange_Operation = 0
-	SetChange_COMMIT  SetChange_Operation = 1
-	SetChange_CONFIRM SetChange_Operation = 2
+	SbiType_SBI_TYPE_UNSPECIFIED   SbiType = 0
+	SbiType_SBI_TYPE_OPENCONFIG    SbiType = 1
+	SbiType_SBI_TYPE_CONTAINERISED SbiType = 2
+	SbiType_SBI_TYPE_PLUGIN        SbiType = 3
 )
 
-// Enum value maps for SetChange_Operation.
+// Enum value maps for SbiType.
 var (
-	SetChange_Operation_name = map[int32]string{
-		0: "CREATE",
-		1: "COMMIT",
-		2: "CONFIRM",
-	}
-	SetChange_Operation_value = map[string]int32{
-		"CREATE":  0,
-		"COMMIT":  1,
-		"CONFIRM": 2,
+	SbiType_name = map[int32]string{
+		0: "SBI_TYPE_UNSPECIFIED",
+		1: "SBI_TYPE_OPENCONFIG",
+		2: "SBI_TYPE_CONTAINERISED",
+		3: "SBI_TYPE_PLUGIN",
+	}
+	SbiType_value = map[string]int32{
+		"SBI_TYPE_UNSPECIFIED":   0,
+		"SBI_TYPE_OPENCONFIG":    1,
+		"SBI_TYPE_CONTAINERISED": 2,
+		"SBI_TYPE_PLUGIN":        3,
 	}
 )
 
-func (x SetChange_Operation) Enum() *SetChange_Operation {
-	p := new(SetChange_Operation)
+func (x SbiType) Enum() *SbiType {
+	p := new(SbiType)
 	*p = x
 	return p
 }
 
-func (x SetChange_Operation) String() string {
+func (x SbiType) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (SetChange_Operation) Descriptor() protoreflect.EnumDescriptor {
+func (SbiType) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_pnd_pnd_proto_enumTypes[2].Descriptor()
 }
 
-func (SetChange_Operation) Type() protoreflect.EnumType {
+func (SbiType) Type() protoreflect.EnumType {
 	return &file_gosdn_pnd_pnd_proto_enumTypes[2]
 }
 
-func (x SetChange_Operation) Number() protoreflect.EnumNumber {
+func (x SbiType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use SetChange_Operation.Descriptor instead.
-func (SetChange_Operation) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{13, 0}
+// Deprecated: Use SbiType.Descriptor instead.
+func (SbiType) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{2}
 }
 
-type SetResponseStatus int32
+type Operation int32
 
 const (
-	SetResponse_OK    SetResponseStatus = 0
-	SetResponse_ERROR SetResponseStatus = 1
+	Operation_OPERATION_UNSPECIFIED Operation = 0
+	Operation_OPERATION_CREATE      Operation = 1
+	Operation_OPERATION_COMMIT      Operation = 2
+	Operation_OPERATION_CONFIRM     Operation = 3
 )
 
-// Enum value maps for SetResponseStatus.
+// Enum value maps for Operation.
 var (
-	SetResponseStatus_name = map[int32]string{
-		0: "OK",
-		1: "ERROR",
-	}
-	SetResponseStatus_value = map[string]int32{
-		"OK":    0,
-		"ERROR": 1,
+	Operation_name = map[int32]string{
+		0: "OPERATION_UNSPECIFIED",
+		1: "OPERATION_CREATE",
+		2: "OPERATION_COMMIT",
+		3: "OPERATION_CONFIRM",
+	}
+	Operation_value = map[string]int32{
+		"OPERATION_UNSPECIFIED": 0,
+		"OPERATION_CREATE":      1,
+		"OPERATION_COMMIT":      2,
+		"OPERATION_CONFIRM":     3,
 	}
 )
 
-func (x SetResponseStatus) Enum() *SetResponseStatus {
-	p := new(SetResponseStatus)
+func (x Operation) Enum() *Operation {
+	p := new(Operation)
 	*p = x
 	return p
 }
 
-func (x SetResponseStatus) String() string {
+func (x Operation) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (SetResponseStatus) Descriptor() protoreflect.EnumDescriptor {
+func (Operation) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_pnd_pnd_proto_enumTypes[3].Descriptor()
 }
 
-func (SetResponseStatus) Type() protoreflect.EnumType {
+func (Operation) Type() protoreflect.EnumType {
 	return &file_gosdn_pnd_pnd_proto_enumTypes[3]
 }
 
-func (x SetResponseStatus) Number() protoreflect.EnumNumber {
+func (x Operation) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use SetResponseStatus.Descriptor instead.
-func (SetResponseStatus) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{14, 0}
+// Deprecated: Use Operation.Descriptor instead.
+func (Operation) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{3}
 }
 
-type DeleteRequest_Type int32
+type Status int32
 
 const (
-	DeleteRequest_OND DeleteRequest_Type = 0
-	DeleteRequest_SBI DeleteRequest_Type = 1
-	DeleteRequest_PND DeleteRequest_Type = 2
+	Status_STATUS_UNSPECIFIED Status = 0
+	Status_STATUS_OK          Status = 1
+	Status_STATUS_ERROR       Status = 2
 )
 
-// Enum value maps for DeleteRequest_Type.
+// Enum value maps for Status.
 var (
-	DeleteRequest_Type_name = map[int32]string{
-		0: "OND",
-		1: "SBI",
-		2: "PND",
+	Status_name = map[int32]string{
+		0: "STATUS_UNSPECIFIED",
+		1: "STATUS_OK",
+		2: "STATUS_ERROR",
 	}
-	DeleteRequest_Type_value = map[string]int32{
-		"OND": 0,
-		"SBI": 1,
-		"PND": 2,
+	Status_value = map[string]int32{
+		"STATUS_UNSPECIFIED": 0,
+		"STATUS_OK":          1,
+		"STATUS_ERROR":       2,
 	}
 )
 
-func (x DeleteRequest_Type) Enum() *DeleteRequest_Type {
-	p := new(DeleteRequest_Type)
+func (x Status) Enum() *Status {
+	p := new(Status)
 	*p = x
 	return p
 }
 
-func (x DeleteRequest_Type) String() string {
+func (x Status) String() string {
 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (DeleteRequest_Type) Descriptor() protoreflect.EnumDescriptor {
+func (Status) Descriptor() protoreflect.EnumDescriptor {
 	return file_gosdn_pnd_pnd_proto_enumTypes[4].Descriptor()
 }
 
-func (DeleteRequest_Type) Type() protoreflect.EnumType {
+func (Status) Type() protoreflect.EnumType {
 	return &file_gosdn_pnd_pnd_proto_enumTypes[4]
 }
 
-func (x DeleteRequest_Type) Number() protoreflect.EnumNumber {
-	return protoreflect.EnumNumber(x)
-}
-
-// Deprecated: Use DeleteRequest_Type.Descriptor instead.
-func (DeleteRequest_Type) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{16, 0}
-}
-
-type DeleteResponseStatus int32
-
-const (
-	DeleteResponse_OK    DeleteResponseStatus = 0
-	DeleteResponse_ERROR DeleteResponseStatus = 1
-)
-
-// Enum value maps for DeleteResponseStatus.
-var (
-	DeleteResponseStatus_name = map[int32]string{
-		0: "OK",
-		1: "ERROR",
-	}
-	DeleteResponseStatus_value = map[string]int32{
-		"OK":    0,
-		"ERROR": 1,
-	}
-)
-
-func (x DeleteResponseStatus) Enum() *DeleteResponseStatus {
-	p := new(DeleteResponseStatus)
-	*p = x
-	return p
-}
-
-func (x DeleteResponseStatus) String() string {
-	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
-}
-
-func (DeleteResponseStatus) Descriptor() protoreflect.EnumDescriptor {
-	return file_gosdn_pnd_pnd_proto_enumTypes[5].Descriptor()
-}
-
-func (DeleteResponseStatus) Type() protoreflect.EnumType {
-	return &file_gosdn_pnd_pnd_proto_enumTypes[5]
-}
-
-func (x DeleteResponseStatus) Number() protoreflect.EnumNumber {
+func (x Status) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
 
-// Deprecated: Use DeleteResponseStatus.Descriptor instead.
-func (DeleteResponseStatus) EnumDescriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{17, 0}
+// Deprecated: Use Status.Descriptor instead.
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{4}
 }
 
-type GetRequest struct {
+type GetOndListRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	// Types that are assignable to Request:
-	//	*GetRequest_Pnd
-	//	*GetRequest_Ond
-	//	*GetRequest_Sbi
-	//	*GetRequest_Change
-	//	*GetRequest_Path
-	Request isGetRequest_Request `protobuf_oneof:"request"`
-	Pid     string               `protobuf:"bytes,6,opt,name=pid,proto3" json:"pid,omitempty"`
-}
-
-func (x *GetRequest) Reset() {
-	*x = GetRequest{}
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *GetOndListRequest) Reset() {
+	*x = GetOndListRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[0]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -340,13 +304,13 @@ func (x *GetRequest) Reset() {
 	}
 }
 
-func (x *GetRequest) String() string {
+func (x *GetOndListRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetRequest) ProtoMessage() {}
+func (*GetOndListRequest) ProtoMessage() {}
 
-func (x *GetRequest) ProtoReflect() protoreflect.Message {
+func (x *GetOndListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[0]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -358,109 +322,37 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
-func (*GetRequest) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetOndListRequest.ProtoReflect.Descriptor instead.
+func (*GetOndListRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{0}
 }
 
-func (x *GetRequest) GetTimestamp() int64 {
+func (x *GetOndListRequest) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (m *GetRequest) GetRequest() isGetRequest_Request {
-	if m != nil {
-		return m.Request
-	}
-	return nil
-}
-
-func (x *GetRequest) GetPnd() *GetPnd {
-	if x, ok := x.GetRequest().(*GetRequest_Pnd); ok {
-		return x.Pnd
-	}
-	return nil
-}
-
-func (x *GetRequest) GetOnd() *GetOnd {
-	if x, ok := x.GetRequest().(*GetRequest_Ond); ok {
-		return x.Ond
-	}
-	return nil
-}
-
-func (x *GetRequest) GetSbi() *GetSbi {
-	if x, ok := x.GetRequest().(*GetRequest_Sbi); ok {
-		return x.Sbi
-	}
-	return nil
-}
-
-func (x *GetRequest) GetChange() *GetChange {
-	if x, ok := x.GetRequest().(*GetRequest_Change); ok {
-		return x.Change
-	}
-	return nil
-}
-
-func (x *GetRequest) GetPath() *GetPath {
-	if x, ok := x.GetRequest().(*GetRequest_Path); ok {
-		return x.Path
-	}
-	return nil
-}
-
-func (x *GetRequest) GetPid() string {
+func (x *GetOndListRequest) GetPid() string {
 	if x != nil {
 		return x.Pid
 	}
 	return ""
 }
 
-type isGetRequest_Request interface {
-	isGetRequest_Request()
-}
-
-type GetRequest_Pnd struct {
-	Pnd *GetPnd `protobuf:"bytes,2,opt,name=pnd,proto3,oneof"`
-}
-
-type GetRequest_Ond struct {
-	Ond *GetOnd `protobuf:"bytes,3,opt,name=ond,proto3,oneof"`
-}
-
-type GetRequest_Sbi struct {
-	Sbi *GetSbi `protobuf:"bytes,4,opt,name=sbi,proto3,oneof"`
-}
-
-type GetRequest_Change struct {
-	Change *GetChange `protobuf:"bytes,5,opt,name=change,proto3,oneof"`
-}
-
-type GetRequest_Path struct {
-	Path *GetPath `protobuf:"bytes,7,opt,name=path,proto3,oneof"`
-}
-
-func (*GetRequest_Pnd) isGetRequest_Request() {}
-
-func (*GetRequest_Ond) isGetRequest_Request() {}
-
-func (*GetRequest_Sbi) isGetRequest_Request() {}
-
-func (*GetRequest_Change) isGetRequest_Request() {}
-
-func (*GetRequest_Path) isGetRequest_Request() {}
-
-type GetPnd struct {
+type GetOndRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Did       []string `protobuf:"bytes,3,rep,name=did,proto3" json:"did,omitempty"`
+	Pid       string   `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetPnd) Reset() {
-	*x = GetPnd{}
+func (x *GetOndRequest) Reset() {
+	*x = GetOndRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[1]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -468,13 +360,13 @@ func (x *GetPnd) Reset() {
 	}
 }
 
-func (x *GetPnd) String() string {
+func (x *GetOndRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetPnd) ProtoMessage() {}
+func (*GetOndRequest) ProtoMessage() {}
 
-func (x *GetPnd) ProtoReflect() protoreflect.Message {
+func (x *GetOndRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[1]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -486,22 +378,43 @@ func (x *GetPnd) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetPnd.ProtoReflect.Descriptor instead.
-func (*GetPnd) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetOndRequest.ProtoReflect.Descriptor instead.
+func (*GetOndRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{1}
 }
 
-type GetOnd struct {
+func (x *GetOndRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetOndRequest) GetDid() []string {
+	if x != nil {
+		return x.Did
+	}
+	return nil
+}
+
+func (x *GetOndRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetSbiListRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	All bool     `protobuf:"varint,1,opt,name=all,proto3" json:"all,omitempty"`
-	Did []string `protobuf:"bytes,2,rep,name=did,proto3" json:"did,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetOnd) Reset() {
-	*x = GetOnd{}
+func (x *GetSbiListRequest) Reset() {
+	*x = GetSbiListRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -509,13 +422,13 @@ func (x *GetOnd) Reset() {
 	}
 }
 
-func (x *GetOnd) String() string {
+func (x *GetSbiListRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetOnd) ProtoMessage() {}
+func (*GetSbiListRequest) ProtoMessage() {}
 
-func (x *GetOnd) ProtoReflect() protoreflect.Message {
+func (x *GetSbiListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -527,36 +440,37 @@ func (x *GetOnd) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetOnd.ProtoReflect.Descriptor instead.
-func (*GetOnd) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetSbiListRequest.ProtoReflect.Descriptor instead.
+func (*GetSbiListRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{2}
 }
 
-func (x *GetOnd) GetAll() bool {
+func (x *GetSbiListRequest) GetTimestamp() int64 {
 	if x != nil {
-		return x.All
+		return x.Timestamp
 	}
-	return false
+	return 0
 }
 
-func (x *GetOnd) GetDid() []string {
+func (x *GetSbiListRequest) GetPid() string {
 	if x != nil {
-		return x.Did
+		return x.Pid
 	}
-	return nil
+	return ""
 }
 
-type GetSbi struct {
+type GetSbiRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	All bool     `protobuf:"varint,1,opt,name=all,proto3" json:"all,omitempty"`
-	Sid []string `protobuf:"bytes,2,rep,name=sid,proto3" json:"sid,omitempty"`
+	Timestamp int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Sid       []string `protobuf:"bytes,3,rep,name=sid,proto3" json:"sid,omitempty"`
+	Pid       string   `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetSbi) Reset() {
-	*x = GetSbi{}
+func (x *GetSbiRequest) Reset() {
+	*x = GetSbiRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -564,13 +478,13 @@ func (x *GetSbi) Reset() {
 	}
 }
 
-func (x *GetSbi) String() string {
+func (x *GetSbiRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetSbi) ProtoMessage() {}
+func (*GetSbiRequest) ProtoMessage() {}
 
-func (x *GetSbi) ProtoReflect() protoreflect.Message {
+func (x *GetSbiRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -582,36 +496,43 @@ func (x *GetSbi) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetSbi.ProtoReflect.Descriptor instead.
-func (*GetSbi) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetSbiRequest.ProtoReflect.Descriptor instead.
+func (*GetSbiRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{3}
 }
 
-func (x *GetSbi) GetAll() bool {
+func (x *GetSbiRequest) GetTimestamp() int64 {
 	if x != nil {
-		return x.All
+		return x.Timestamp
 	}
-	return false
+	return 0
 }
 
-func (x *GetSbi) GetSid() []string {
+func (x *GetSbiRequest) GetSid() []string {
 	if x != nil {
 		return x.Sid
 	}
 	return nil
 }
 
-type GetChange struct {
+func (x *GetSbiRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type GetChangeListRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	All  bool     `protobuf:"varint,1,opt,name=all,proto3" json:"all,omitempty"`
-	Cuid []string `protobuf:"bytes,2,rep,name=cuid,proto3" json:"cuid,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetChange) Reset() {
-	*x = GetChange{}
+func (x *GetChangeListRequest) Reset() {
+	*x = GetChangeListRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -619,13 +540,13 @@ func (x *GetChange) Reset() {
 	}
 }
 
-func (x *GetChange) String() string {
+func (x *GetChangeListRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetChange) ProtoMessage() {}
+func (*GetChangeListRequest) ProtoMessage() {}
 
-func (x *GetChange) ProtoReflect() protoreflect.Message {
+func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -637,36 +558,37 @@ func (x *GetChange) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetChange.ProtoReflect.Descriptor instead.
-func (*GetChange) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetChangeListRequest.ProtoReflect.Descriptor instead.
+func (*GetChangeListRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{4}
 }
 
-func (x *GetChange) GetAll() bool {
+func (x *GetChangeListRequest) GetTimestamp() int64 {
 	if x != nil {
-		return x.All
+		return x.Timestamp
 	}
-	return false
+	return 0
 }
 
-func (x *GetChange) GetCuid() []string {
+func (x *GetChangeListRequest) GetPid() string {
 	if x != nil {
-		return x.Cuid
+		return x.Pid
 	}
-	return nil
+	return ""
 }
 
-type GetPath struct {
+type GetChangeRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Did  string `protobuf:"bytes,1,opt,name=did,proto3" json:"did,omitempty"`
-	Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Cuid      string `protobuf:"bytes,3,opt,name=cuid,proto3" json:"cuid,omitempty"`
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetPath) Reset() {
-	*x = GetPath{}
+func (x *GetChangeRequest) Reset() {
+	*x = GetChangeRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -674,13 +596,13 @@ func (x *GetPath) Reset() {
 	}
 }
 
-func (x *GetPath) String() string {
+func (x *GetChangeRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetPath) ProtoMessage() {}
+func (*GetChangeRequest) ProtoMessage() {}
 
-func (x *GetPath) ProtoReflect() protoreflect.Message {
+func (x *GetChangeRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -692,39 +614,45 @@ func (x *GetPath) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetPath.ProtoReflect.Descriptor instead.
-func (*GetPath) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetChangeRequest.ProtoReflect.Descriptor instead.
+func (*GetChangeRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{5}
 }
 
-func (x *GetPath) GetDid() string {
+func (x *GetChangeRequest) GetTimestamp() int64 {
 	if x != nil {
-		return x.Did
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeRequest) GetCuid() string {
+	if x != nil {
+		return x.Cuid
 	}
 	return ""
 }
 
-func (x *GetPath) GetPath() string {
+func (x *GetChangeRequest) GetPid() string {
 	if x != nil {
-		return x.Path
+		return x.Pid
 	}
 	return ""
 }
 
-type GetResponse struct {
+type GetPathRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64                             `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Pnd       *PrincipalNetworkDomain           `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
-	Ond       []*OrchestratedNetworkingDevice   `protobuf:"bytes,3,rep,name=ond,proto3" json:"ond,omitempty"`
-	Sbi       []*southbound.SouthboundInterface `protobuf:"bytes,5,rep,name=sbi,proto3" json:"sbi,omitempty"`
-	Change    []*Change                         `protobuf:"bytes,7,rep,name=change,proto3" json:"change,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Did       string `protobuf:"bytes,2,opt,name=did,proto3" json:"did,omitempty"`
+	Path      string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
 }
 
-func (x *GetResponse) Reset() {
-	*x = GetResponse{}
+func (x *GetPathRequest) Reset() {
+	*x = GetPathRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -732,13 +660,13 @@ func (x *GetResponse) Reset() {
 	}
 }
 
-func (x *GetResponse) String() string {
+func (x *GetPathRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetResponse) ProtoMessage() {}
+func (*GetPathRequest) ProtoMessage() {}
 
-func (x *GetResponse) ProtoReflect() protoreflect.Message {
+func (x *GetPathRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -750,61 +678,53 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
-func (*GetResponse) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetPathRequest.ProtoReflect.Descriptor instead.
+func (*GetPathRequest) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{6}
 }
 
-func (x *GetResponse) GetTimestamp() int64 {
+func (x *GetPathRequest) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *GetResponse) GetPnd() *PrincipalNetworkDomain {
-	if x != nil {
-		return x.Pnd
-	}
-	return nil
-}
-
-func (x *GetResponse) GetOnd() []*OrchestratedNetworkingDevice {
+func (x *GetPathRequest) GetDid() string {
 	if x != nil {
-		return x.Ond
+		return x.Did
 	}
-	return nil
+	return ""
 }
 
-func (x *GetResponse) GetSbi() []*southbound.SouthboundInterface {
+func (x *GetPathRequest) GetPath() string {
 	if x != nil {
-		return x.Sbi
+		return x.Path
 	}
-	return nil
+	return ""
 }
 
-func (x *GetResponse) GetChange() []*Change {
+func (x *GetPathRequest) GetPid() string {
 	if x != nil {
-		return x.Change
+		return x.Pid
 	}
-	return nil
+	return ""
 }
 
-type PrincipalNetworkDomain struct {
+type GetOndResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id          string                            `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Name        string                            `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-	Description string                            `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
-	Ond         []*OrchestratedNetworkingDevice   `protobuf:"bytes,4,rep,name=ond,proto3" json:"ond,omitempty"`
-	Sbi         []*southbound.SouthboundInterface `protobuf:"bytes,5,rep,name=sbi,proto3" json:"sbi,omitempty"`
-	Change      []*Change                         `protobuf:"bytes,6,rep,name=change,proto3" json:"change,omitempty"`
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain         `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Ond []*OrchestratedNetworkingDevice `protobuf:"bytes,3,rep,name=ond,proto3" json:"ond,omitempty"`
 }
 
-func (x *PrincipalNetworkDomain) Reset() {
-	*x = PrincipalNetworkDomain{}
+func (x *GetOndResponse) Reset() {
+	*x = GetOndResponse{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -812,13 +732,13 @@ func (x *PrincipalNetworkDomain) Reset() {
 	}
 }
 
-func (x *PrincipalNetworkDomain) String() string {
+func (x *GetOndResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*PrincipalNetworkDomain) ProtoMessage() {}
+func (*GetOndResponse) ProtoMessage() {}
 
-func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message {
+func (x *GetOndResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -830,66 +750,46 @@ func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use PrincipalNetworkDomain.ProtoReflect.Descriptor instead.
-func (*PrincipalNetworkDomain) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetOndResponse.ProtoReflect.Descriptor instead.
+func (*GetOndResponse) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{7}
 }
 
-func (x *PrincipalNetworkDomain) GetId() string {
-	if x != nil {
-		return x.Id
-	}
-	return ""
-}
-
-func (x *PrincipalNetworkDomain) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-func (x *PrincipalNetworkDomain) GetDescription() string {
-	if x != nil {
-		return x.Description
-	}
-	return ""
-}
-
-func (x *PrincipalNetworkDomain) GetOnd() []*OrchestratedNetworkingDevice {
+func (x *GetOndResponse) GetTimestamp() int64 {
 	if x != nil {
-		return x.Ond
+		return x.Timestamp
 	}
-	return nil
+	return 0
 }
 
-func (x *PrincipalNetworkDomain) GetSbi() []*southbound.SouthboundInterface {
+func (x *GetOndResponse) GetPnd() *PrincipalNetworkDomain {
 	if x != nil {
-		return x.Sbi
+		return x.Pnd
 	}
 	return nil
 }
 
-func (x *PrincipalNetworkDomain) GetChange() []*Change {
+func (x *GetOndResponse) GetOnd() []*OrchestratedNetworkingDevice {
 	if x != nil {
-		return x.Change
+		return x.Ond
 	}
 	return nil
 }
 
-type OrchestratedNetworkingDevice struct {
+type GetOndListResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id     string                          `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Name   string                          `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-	Device []*gnmi.Notification            `protobuf:"bytes,3,rep,name=device,proto3" json:"device,omitempty"`
-	Sbi    *southbound.SouthboundInterface `protobuf:"bytes,4,opt,name=sbi,proto3" json:"sbi,omitempty"`
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain         `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Ond []*OrchestratedNetworkingDevice `protobuf:"bytes,3,rep,name=ond,proto3" json:"ond,omitempty"`
 }
 
-func (x *OrchestratedNetworkingDevice) Reset() {
-	*x = OrchestratedNetworkingDevice{}
+func (x *GetOndListResponse) Reset() {
+	*x = GetOndListResponse{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -897,13 +797,13 @@ func (x *OrchestratedNetworkingDevice) Reset() {
 	}
 }
 
-func (x *OrchestratedNetworkingDevice) String() string {
+func (x *GetOndListResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*OrchestratedNetworkingDevice) ProtoMessage() {}
+func (*GetOndListResponse) ProtoMessage() {}
 
-func (x *OrchestratedNetworkingDevice) ProtoReflect() protoreflect.Message {
+func (x *GetOndListResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -915,51 +815,46 @@ func (x *OrchestratedNetworkingDevice) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use OrchestratedNetworkingDevice.ProtoReflect.Descriptor instead.
-func (*OrchestratedNetworkingDevice) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetOndListResponse.ProtoReflect.Descriptor instead.
+func (*GetOndListResponse) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{8}
 }
 
-func (x *OrchestratedNetworkingDevice) GetId() string {
-	if x != nil {
-		return x.Id
-	}
-	return ""
-}
-
-func (x *OrchestratedNetworkingDevice) GetName() string {
+func (x *GetOndListResponse) GetTimestamp() int64 {
 	if x != nil {
-		return x.Name
+		return x.Timestamp
 	}
-	return ""
+	return 0
 }
 
-func (x *OrchestratedNetworkingDevice) GetDevice() []*gnmi.Notification {
+func (x *GetOndListResponse) GetPnd() *PrincipalNetworkDomain {
 	if x != nil {
-		return x.Device
+		return x.Pnd
 	}
 	return nil
 }
 
-func (x *OrchestratedNetworkingDevice) GetSbi() *southbound.SouthboundInterface {
+func (x *GetOndListResponse) GetOnd() []*OrchestratedNetworkingDevice {
 	if x != nil {
-		return x.Sbi
+		return x.Ond
 	}
 	return nil
 }
 
-type Change struct {
+type GetSbiResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id    string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Age   int64        `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
-	State Change_State `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.pnd.Change_State" json:"state,omitempty"`
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain           `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Sbi []*southbound.SouthboundInterface `protobuf:"bytes,3,rep,name=sbi,proto3" json:"sbi,omitempty"`
 }
 
-func (x *Change) Reset() {
-	*x = Change{}
+func (x *GetSbiResponse) Reset() {
+	*x = GetSbiResponse{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_gosdn_pnd_pnd_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -967,13 +862,13 @@ func (x *Change) Reset() {
 	}
 }
 
-func (x *Change) String() string {
+func (x *GetSbiResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*Change) ProtoMessage() {}
+func (*GetSbiResponse) ProtoMessage() {}
 
-func (x *Change) ProtoReflect() protoreflect.Message {
+func (x *GetSbiResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_gosdn_pnd_pnd_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -985,62 +880,770 @@ func (x *Change) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use Change.ProtoReflect.Descriptor instead.
-func (*Change) Descriptor() ([]byte, []int) {
+// Deprecated: Use GetSbiResponse.ProtoReflect.Descriptor instead.
+func (*GetSbiResponse) Descriptor() ([]byte, []int) {
 	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{9}
 }
 
-func (x *Change) GetId() string {
+func (x *GetSbiResponse) GetTimestamp() int64 {
 	if x != nil {
-		return x.Id
+		return x.Timestamp
 	}
-	return ""
+	return 0
+}
+
+func (x *GetSbiResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetSbiResponse) GetSbi() []*southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type GetSbiListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd *PrincipalNetworkDomain           `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Sbi []*southbound.SouthboundInterface `protobuf:"bytes,3,rep,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *GetSbiListResponse) Reset() {
+	*x = GetSbiListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetSbiListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSbiListResponse) ProtoMessage() {}
+
+func (x *GetSbiListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetSbiListResponse.ProtoReflect.Descriptor instead.
+func (*GetSbiListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *GetSbiListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetSbiListResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetSbiListResponse) GetSbi() []*southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type GetPathResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Device []*gnmi.Notification    `protobuf:"bytes,3,rep,name=device,proto3" json:"device,omitempty"`
+}
+
+func (x *GetPathResponse) Reset() {
+	*x = GetPathResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPathResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPathResponse) ProtoMessage() {}
+
+func (x *GetPathResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetPathResponse.ProtoReflect.Descriptor instead.
+func (*GetPathResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *GetPathResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetPathResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetPathResponse) GetDevice() []*gnmi.Notification {
+	if x != nil {
+		return x.Device
+	}
+	return nil
+}
+
+type GetChangeResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Change []*Change               `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"`
+}
+
+func (x *GetChangeResponse) Reset() {
+	*x = GetChangeResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeResponse) ProtoMessage() {}
+
+func (x *GetChangeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeResponse.ProtoReflect.Descriptor instead.
+func (*GetChangeResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *GetChangeResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetChangeResponse) GetChange() []*Change {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+type GetChangeListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	// TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+	// is also sufficient.
+	Pnd    *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"`
+	Change []*Change               `protobuf:"bytes,3,rep,name=change,proto3" json:"change,omitempty"`
+}
+
+func (x *GetChangeListResponse) Reset() {
+	*x = GetChangeListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChangeListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChangeListResponse) ProtoMessage() {}
+
+func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetChangeListResponse.ProtoReflect.Descriptor instead.
+func (*GetChangeListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *GetChangeListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *GetChangeListResponse) GetPnd() *PrincipalNetworkDomain {
+	if x != nil {
+		return x.Pnd
+	}
+	return nil
+}
+
+func (x *GetChangeListResponse) GetChange() []*Change {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+type PrincipalNetworkDomain struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name        string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+}
+
+func (x *PrincipalNetworkDomain) Reset() {
+	*x = PrincipalNetworkDomain{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PrincipalNetworkDomain) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PrincipalNetworkDomain) ProtoMessage() {}
+
+func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PrincipalNetworkDomain.ProtoReflect.Descriptor instead.
+func (*PrincipalNetworkDomain) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *PrincipalNetworkDomain) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *PrincipalNetworkDomain) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *PrincipalNetworkDomain) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+type OrchestratedNetworkingDevice struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id     string                          `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name   string                          `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Device []*gnmi.Notification            `protobuf:"bytes,3,rep,name=device,proto3" json:"device,omitempty"`
+	Sbi    *southbound.SouthboundInterface `protobuf:"bytes,4,opt,name=sbi,proto3" json:"sbi,omitempty"`
+}
+
+func (x *OrchestratedNetworkingDevice) Reset() {
+	*x = OrchestratedNetworkingDevice{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OrchestratedNetworkingDevice) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OrchestratedNetworkingDevice) ProtoMessage() {}
+
+func (x *OrchestratedNetworkingDevice) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OrchestratedNetworkingDevice.ProtoReflect.Descriptor instead.
+func (*OrchestratedNetworkingDevice) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *OrchestratedNetworkingDevice) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *OrchestratedNetworkingDevice) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *OrchestratedNetworkingDevice) GetDevice() []*gnmi.Notification {
+	if x != nil {
+		return x.Device
+	}
+	return nil
+}
+
+func (x *OrchestratedNetworkingDevice) GetSbi() *southbound.SouthboundInterface {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+type Change struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id    string      `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Age   int64       `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
+	State ChangeState `protobuf:"varint,3,opt,name=state,proto3,enum=gosdn.pnd.ChangeState" json:"state,omitempty"`
+}
+
+func (x *Change) Reset() {
+	*x = Change{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Change) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Change) ProtoMessage() {}
+
+func (x *Change) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Change.ProtoReflect.Descriptor instead.
+func (*Change) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *Change) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
 }
 
 func (x *Change) GetAge() int64 {
 	if x != nil {
-		return x.Age
+		return x.Age
+	}
+	return 0
+}
+
+func (x *Change) GetState() ChangeState {
+	if x != nil {
+		return x.State
+	}
+	return ChangeState_CHANGE_STATE_UNSPECIFIED
+}
+
+type SetOndListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64     `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Ond       []*SetOnd `protobuf:"bytes,2,rep,name=ond,proto3" json:"ond,omitempty"`
+	Pid       string    `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetOndListRequest) Reset() {
+	*x = SetOndListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetOndListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetOndListRequest) ProtoMessage() {}
+
+func (x *SetOndListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetOndListRequest.ProtoReflect.Descriptor instead.
+func (*SetOndListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *SetOndListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetOndListRequest) GetOnd() []*SetOnd {
+	if x != nil {
+		return x.Ond
+	}
+	return nil
+}
+
+func (x *SetOndListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetSbiListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64     `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Sbi       []*SetSbi `protobuf:"bytes,2,rep,name=sbi,proto3" json:"sbi,omitempty"`
+	Pid       string    `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetSbiListRequest) Reset() {
+	*x = SetSbiListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetSbiListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetSbiListRequest) ProtoMessage() {}
+
+func (x *SetSbiListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetSbiListRequest.ProtoReflect.Descriptor instead.
+func (*SetSbiListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *SetSbiListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetSbiListRequest) GetSbi() []*SetSbi {
+	if x != nil {
+		return x.Sbi
+	}
+	return nil
+}
+
+func (x *SetSbiListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetChangeListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64        `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Change    []*SetChange `protobuf:"bytes,2,rep,name=change,proto3" json:"change,omitempty"`
+	Pid       string       `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetChangeListRequest) Reset() {
+	*x = SetChangeListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChangeListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChangeListRequest) ProtoMessage() {}
+
+func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChangeListRequest.ProtoReflect.Descriptor instead.
+func (*SetChangeListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *SetChangeListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetChangeListRequest) GetChange() []*SetChange {
+	if x != nil {
+		return x.Change
+	}
+	return nil
+}
+
+func (x *SetChangeListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
+	}
+	return ""
+}
+
+type SetPathListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp     int64            `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	ChangeRequest []*ChangeRequest `protobuf:"bytes,2,rep,name=change_request,json=changeRequest,proto3" json:"change_request,omitempty"`
+	Pid           string           `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"`
+}
+
+func (x *SetPathListRequest) Reset() {
+	*x = SetPathListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetPathListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetPathListRequest) ProtoMessage() {}
+
+func (x *SetPathListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetPathListRequest.ProtoReflect.Descriptor instead.
+func (*SetPathListRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *SetPathListRequest) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *Change) GetState() Change_State {
+func (x *SetPathListRequest) GetChangeRequest() []*ChangeRequest {
 	if x != nil {
-		return x.State
+		return x.ChangeRequest
+	}
+	return nil
+}
+
+func (x *SetPathListRequest) GetPid() string {
+	if x != nil {
+		return x.Pid
 	}
-	return Change_PENDING
+	return ""
 }
 
-type SetRequest struct {
+//TODO: rename
+type ChangeRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp     int64            `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Ond           []*SetOnd        `protobuf:"bytes,2,rep,name=ond,proto3" json:"ond,omitempty"`
-	Sbi           []*SetSbi        `protobuf:"bytes,3,rep,name=sbi,proto3" json:"sbi,omitempty"`
-	Change        []*SetChange     `protobuf:"bytes,4,rep,name=change,proto3" json:"change,omitempty"`
-	ChangeRequest []*ChangeRequest `protobuf:"bytes,5,rep,name=changeRequest,proto3" json:"changeRequest,omitempty"`
-	Pid           string           `protobuf:"bytes,6,opt,name=pid,proto3" json:"pid,omitempty"`
+	Did   string       `protobuf:"bytes,1,opt,name=did,proto3" json:"did,omitempty"`
+	Path  string       `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
+	Value string       `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
+	ApiOp ApiOperation `protobuf:"varint,4,opt,name=api_op,json=apiOp,proto3,enum=gosdn.pnd.ApiOperation" json:"api_op,omitempty"`
 }
 
-func (x *SetRequest) Reset() {
-	*x = SetRequest{}
+func (x *ChangeRequest) Reset() {
+	*x = ChangeRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetRequest) String() string {
+func (x *ChangeRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetRequest) ProtoMessage() {}
+func (*ChangeRequest) ProtoMessage() {}
 
-func (x *SetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[10]
+func (x *ChangeRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1051,51 +1654,37 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetRequest.ProtoReflect.Descriptor instead.
-func (*SetRequest) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{10}
-}
-
-func (x *SetRequest) GetTimestamp() int64 {
-	if x != nil {
-		return x.Timestamp
-	}
-	return 0
-}
-
-func (x *SetRequest) GetOnd() []*SetOnd {
-	if x != nil {
-		return x.Ond
-	}
-	return nil
+// Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead.
+func (*ChangeRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{21}
 }
 
-func (x *SetRequest) GetSbi() []*SetSbi {
+func (x *ChangeRequest) GetDid() string {
 	if x != nil {
-		return x.Sbi
+		return x.Did
 	}
-	return nil
+	return ""
 }
 
-func (x *SetRequest) GetChange() []*SetChange {
+func (x *ChangeRequest) GetPath() string {
 	if x != nil {
-		return x.Change
+		return x.Path
 	}
-	return nil
+	return ""
 }
 
-func (x *SetRequest) GetChangeRequest() []*ChangeRequest {
+func (x *ChangeRequest) GetValue() string {
 	if x != nil {
-		return x.ChangeRequest
+		return x.Value
 	}
-	return nil
+	return ""
 }
 
-func (x *SetRequest) GetPid() string {
+func (x *ChangeRequest) GetApiOp() ApiOperation {
 	if x != nil {
-		return x.Pid
+		return x.ApiOp
 	}
-	return ""
+	return ApiOperation_API_OPERATION_UNSPECIFIED
 }
 
 type SetOnd struct {
@@ -1105,14 +1694,14 @@ type SetOnd struct {
 
 	Address         string                          `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
 	Sbi             *southbound.SouthboundInterface `protobuf:"bytes,2,opt,name=sbi,proto3" json:"sbi,omitempty"`
-	DeviceName      string                          `protobuf:"bytes,3,opt,name=deviceName,proto3" json:"deviceName,omitempty"`
-	TransportOption *transport.TransportOption      `protobuf:"bytes,4,opt,name=transportOption,proto3" json:"transportOption,omitempty"`
+	DeviceName      string                          `protobuf:"bytes,3,opt,name=device_name,json=deviceName,proto3" json:"device_name,omitempty"`
+	TransportOption *transport.TransportOption      `protobuf:"bytes,4,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"`
 }
 
 func (x *SetOnd) Reset() {
 	*x = SetOnd{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1125,7 +1714,7 @@ func (x *SetOnd) String() string {
 func (*SetOnd) ProtoMessage() {}
 
 func (x *SetOnd) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[11]
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1138,7 +1727,7 @@ func (x *SetOnd) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SetOnd.ProtoReflect.Descriptor instead.
 func (*SetOnd) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{11}
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *SetOnd) GetAddress() string {
@@ -1173,12 +1762,14 @@ type SetSbi struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
+
+	SbiType SbiType `protobuf:"varint,1,opt,name=sbi_type,json=sbiType,proto3,enum=gosdn.pnd.SbiType" json:"sbi_type,omitempty"`
 }
 
 func (x *SetSbi) Reset() {
 	*x = SetSbi{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1191,7 +1782,7 @@ func (x *SetSbi) String() string {
 func (*SetSbi) ProtoMessage() {}
 
 func (x *SetSbi) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[12]
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1204,35 +1795,278 @@ func (x *SetSbi) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SetSbi.ProtoReflect.Descriptor instead.
 func (*SetSbi) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{12}
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SetSbi) GetSbiType() SbiType {
+	if x != nil {
+		return x.SbiType
+	}
+	return SbiType_SBI_TYPE_UNSPECIFIED
+}
+
+type SetChange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Cuid string    `protobuf:"bytes,1,opt,name=cuid,proto3" json:"cuid,omitempty"`
+	Op   Operation `protobuf:"varint,2,opt,name=op,proto3,enum=gosdn.pnd.Operation" json:"op,omitempty"`
+}
+
+func (x *SetChange) Reset() {
+	*x = SetChange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChange) ProtoMessage() {}
+
+func (x *SetChange) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChange.ProtoReflect.Descriptor instead.
+func (*SetChange) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *SetChange) GetCuid() string {
+	if x != nil {
+		return x.Cuid
+	}
+	return ""
+}
+
+func (x *SetChange) GetOp() Operation {
+	if x != nil {
+		return x.Op
+	}
+	return Operation_OPERATION_UNSPECIFIED
+}
+
+type SetResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+}
+
+func (x *SetResponse) Reset() {
+	*x = SetResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetResponse) ProtoMessage() {}
+
+func (x *SetResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetResponse.ProtoReflect.Descriptor instead.
+func (*SetResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *SetResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+type SetOndListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetOndListResponse) Reset() {
+	*x = SetOndListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetOndListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetOndListResponse) ProtoMessage() {}
+
+func (x *SetOndListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetOndListResponse.ProtoReflect.Descriptor instead.
+func (*SetOndListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *SetOndListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetOndListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetOndListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
+}
+
+type SetChangeListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+}
+
+func (x *SetChangeListResponse) Reset() {
+	*x = SetChangeListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetChangeListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetChangeListResponse) ProtoMessage() {}
+
+func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SetChangeListResponse.ProtoReflect.Descriptor instead.
+func (*SetChangeListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *SetChangeListResponse) GetTimestamp() int64 {
+	if x != nil {
+		return x.Timestamp
+	}
+	return 0
+}
+
+func (x *SetChangeListResponse) GetStatus() Status {
+	if x != nil {
+		return x.Status
+	}
+	return Status_STATUS_UNSPECIFIED
+}
+
+func (x *SetChangeListResponse) GetResponses() []*SetResponse {
+	if x != nil {
+		return x.Responses
+	}
+	return nil
 }
 
-type SetChange struct {
+type SetChangeResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Cuid string              `protobuf:"bytes,1,opt,name=cuid,proto3" json:"cuid,omitempty"`
-	Op   SetChange_Operation `protobuf:"varint,2,opt,name=op,proto3,enum=gosdn.pnd.SetChange_Operation" json:"op,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
 }
 
-func (x *SetChange) Reset() {
-	*x = SetChange{}
+func (x *SetChangeResponse) Reset() {
+	*x = SetChangeResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetChange) String() string {
+func (x *SetChangeResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetChange) ProtoMessage() {}
+func (*SetChangeResponse) ProtoMessage() {}
 
-func (x *SetChange) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[13]
+func (x *SetChangeResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1243,52 +2077,52 @@ func (x *SetChange) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetChange.ProtoReflect.Descriptor instead.
-func (*SetChange) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{13}
+// Deprecated: Use SetChangeResponse.ProtoReflect.Descriptor instead.
+func (*SetChangeResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{28}
 }
 
-func (x *SetChange) GetCuid() string {
+func (x *SetChangeResponse) GetTimestamp() int64 {
 	if x != nil {
-		return x.Cuid
+		return x.Timestamp
 	}
-	return ""
+	return 0
 }
 
-func (x *SetChange) GetOp() SetChange_Operation {
+func (x *SetChangeResponse) GetStatus() Status {
 	if x != nil {
-		return x.Op
+		return x.Status
 	}
-	return SetChange_CREATE
+	return Status_STATUS_UNSPECIFIED
 }
 
-type SetResponse struct {
+type SetSbiListResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64             `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Status    SetResponseStatus `protobuf:"varint,2,opt,name=Status,proto3,enum=gosdn.pnd.SetResponseStatus" json:"Status,omitempty"`
-	Responses []*SetResponse    `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
 }
 
-func (x *SetResponse) Reset() {
-	*x = SetResponse{}
+func (x *SetSbiListResponse) Reset() {
+	*x = SetSbiListResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[29]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *SetResponse) String() string {
+func (x *SetSbiListResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*SetResponse) ProtoMessage() {}
+func (*SetSbiListResponse) ProtoMessage() {}
 
-func (x *SetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[14]
+func (x *SetSbiListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[29]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1299,60 +2133,59 @@ func (x *SetResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use SetResponse.ProtoReflect.Descriptor instead.
-func (*SetResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{14}
+// Deprecated: Use SetSbiListResponse.ProtoReflect.Descriptor instead.
+func (*SetSbiListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{29}
 }
 
-func (x *SetResponse) GetTimestamp() int64 {
+func (x *SetSbiListResponse) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *SetResponse) GetStatus() SetResponseStatus {
+func (x *SetSbiListResponse) GetStatus() Status {
 	if x != nil {
 		return x.Status
 	}
-	return SetResponse_OK
+	return Status_STATUS_UNSPECIFIED
 }
 
-func (x *SetResponse) GetResponses() []*SetResponse {
+func (x *SetSbiListResponse) GetResponses() []*SetResponse {
 	if x != nil {
 		return x.Responses
 	}
 	return nil
 }
 
-type ChangeRequest struct {
+type SetPathListResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id    string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Path  string       `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
-	Value string       `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
-	ApiOp ApiOperation `protobuf:"varint,4,opt,name=apiOp,proto3,enum=gosdn.pnd.ApiOperation" json:"apiOp,omitempty"`
+	Timestamp int64          `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status         `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
+	Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"`
 }
 
-func (x *ChangeRequest) Reset() {
-	*x = ChangeRequest{}
+func (x *SetPathListResponse) Reset() {
+	*x = SetPathListResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[30]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *ChangeRequest) String() string {
+func (x *SetPathListResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*ChangeRequest) ProtoMessage() {}
+func (*SetPathListResponse) ProtoMessage() {}
 
-func (x *ChangeRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[15]
+func (x *SetPathListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[30]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1363,67 +2196,59 @@ func (x *ChangeRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead.
-func (*ChangeRequest) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{15}
-}
-
-func (x *ChangeRequest) GetId() string {
-	if x != nil {
-		return x.Id
-	}
-	return ""
+// Deprecated: Use SetPathListResponse.ProtoReflect.Descriptor instead.
+func (*SetPathListResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{30}
 }
 
-func (x *ChangeRequest) GetPath() string {
+func (x *SetPathListResponse) GetTimestamp() int64 {
 	if x != nil {
-		return x.Path
+		return x.Timestamp
 	}
-	return ""
+	return 0
 }
 
-func (x *ChangeRequest) GetValue() string {
+func (x *SetPathListResponse) GetStatus() Status {
 	if x != nil {
-		return x.Value
+		return x.Status
 	}
-	return ""
+	return Status_STATUS_UNSPECIFIED
 }
 
-func (x *ChangeRequest) GetApiOp() ApiOperation {
+func (x *SetPathListResponse) GetResponses() []*SetResponse {
 	if x != nil {
-		return x.ApiOp
+		return x.Responses
 	}
-	return ApiOperation_UPDATE
+	return nil
 }
 
-type DeleteRequest struct {
+type DeleteOndRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64              `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Type      DeleteRequest_Type `protobuf:"varint,2,opt,name=type,proto3,enum=gosdn.pnd.DeleteRequest_Type" json:"type,omitempty"`
-	Uuid      string             `protobuf:"bytes,3,opt,name=uuid,proto3" json:"uuid,omitempty"`
-	Pid       string             `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Pid       string `protobuf:"bytes,4,opt,name=pid,proto3" json:"pid,omitempty"`
+	Did       string `protobuf:"bytes,5,opt,name=did,proto3" json:"did,omitempty"`
 }
 
-func (x *DeleteRequest) Reset() {
-	*x = DeleteRequest{}
+func (x *DeleteOndRequest) Reset() {
+	*x = DeleteOndRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[31]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *DeleteRequest) String() string {
+func (x *DeleteOndRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*DeleteRequest) ProtoMessage() {}
+func (*DeleteOndRequest) ProtoMessage() {}
 
-func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[16]
+func (x *DeleteOndRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[31]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1434,65 +2259,58 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
-func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{16}
+// Deprecated: Use DeleteOndRequest.ProtoReflect.Descriptor instead.
+func (*DeleteOndRequest) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{31}
 }
 
-func (x *DeleteRequest) GetTimestamp() int64 {
+func (x *DeleteOndRequest) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *DeleteRequest) GetType() DeleteRequest_Type {
-	if x != nil {
-		return x.Type
-	}
-	return DeleteRequest_OND
-}
-
-func (x *DeleteRequest) GetUuid() string {
+func (x *DeleteOndRequest) GetPid() string {
 	if x != nil {
-		return x.Uuid
+		return x.Pid
 	}
 	return ""
 }
 
-func (x *DeleteRequest) GetPid() string {
+func (x *DeleteOndRequest) GetDid() string {
 	if x != nil {
-		return x.Pid
+		return x.Did
 	}
 	return ""
 }
 
-type DeleteResponse struct {
+type DeleteOndResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Timestamp int64                `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
-	Status    DeleteResponseStatus `protobuf:"varint,2,opt,name=Status,proto3,enum=gosdn.pnd.DeleteResponseStatus" json:"Status,omitempty"`
+	Timestamp int64  `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch.
+	Status    Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.pnd.Status" json:"status,omitempty"`
 }
 
-func (x *DeleteResponse) Reset() {
-	*x = DeleteResponse{}
+func (x *DeleteOndResponse) Reset() {
+	*x = DeleteOndResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+		mi := &file_gosdn_pnd_pnd_proto_msgTypes[32]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
 }
 
-func (x *DeleteResponse) String() string {
+func (x *DeleteOndResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*DeleteResponse) ProtoMessage() {}
+func (*DeleteOndResponse) ProtoMessage() {}
 
-func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_gosdn_pnd_pnd_proto_msgTypes[17]
+func (x *DeleteOndResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_gosdn_pnd_pnd_proto_msgTypes[32]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1503,23 +2321,23 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead.
-func (*DeleteResponse) Descriptor() ([]byte, []int) {
-	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{17}
+// Deprecated: Use DeleteOndResponse.ProtoReflect.Descriptor instead.
+func (*DeleteOndResponse) Descriptor() ([]byte, []int) {
+	return file_gosdn_pnd_pnd_proto_rawDescGZIP(), []int{32}
 }
 
-func (x *DeleteResponse) GetTimestamp() int64 {
+func (x *DeleteOndResponse) GetTimestamp() int64 {
 	if x != nil {
 		return x.Timestamp
 	}
 	return 0
 }
 
-func (x *DeleteResponse) GetStatus() DeleteResponseStatus {
+func (x *DeleteOndResponse) GetStatus() Status {
 	if x != nil {
 		return x.Status
 	}
-	return DeleteResponse_OK
+	return Status_STATUS_UNSPECIFIED
 }
 
 var File_gosdn_pnd_pnd_proto protoreflect.FileDescriptor
@@ -1527,192 +2345,400 @@ var File_gosdn_pnd_pnd_proto protoreflect.FileDescriptor
 var file_gosdn_pnd_pnd_proto_rawDesc = []byte{
 	0x0a, 0x13, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x2f, 0x70, 0x6e, 0x64, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64,
-	0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x1a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f,
-	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e,
-	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75,
-	0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75,
-	0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x96, 0x02, 0x0a, 0x0a, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
-	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x67,
-	0x65, 0x74, 0x50, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x03,
-	0x6f, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64,
-	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x03,
-	0x6f, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x67, 0x65, 0x74,
-	0x53, 0x62, 0x69, 0x48, 0x00, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x2e, 0x0a, 0x06, 0x63, 0x68,
-	0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73,
-	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
-	0x48, 0x00, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x70, 0x61,
-	0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x48, 0x00, 0x52, 0x04,
-	0x70, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x22, 0x08, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x50, 0x6e, 0x64, 0x22, 0x2c, 0x0a, 0x06, 0x67,
-	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x2c, 0x0a, 0x06, 0x67, 0x65, 0x74,
-	0x53, 0x62, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03,
-	0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x43, 0x68,
-	0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x02,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x22, 0x2f, 0x0a, 0x07, 0x67, 0x65,
-	0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xff, 0x01, 0x0a, 0x0b,
-	0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74,
+	0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,
+	0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x1a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67,
+	0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74,
 	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
-	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
-	0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77,
-	0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x39,
-	0x0a, 0x03, 0x6f, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f,
-	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
-	0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65,
-	0x76, 0x69, 0x63, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x64, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69,
-	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73,
-	0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62,
-	0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73,
-	0x62, 0x69, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43,
-	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xfd, 0x01,
-	0x0a, 0x16, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f,
-	0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b,
-	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39,
-	0x0a, 0x03, 0x6f, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f,
-	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72,
-	0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65,
-	0x76, 0x69, 0x63, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x64, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69,
-	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73,
-	0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62,
-	0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73,
-	0x62, 0x69, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x03,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x0d, 0x47,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69,
+	0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x43,
+	0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x03, 0x73, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x46, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x56,
+	0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x63, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x66, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74,
+	0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03,
+	0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x9e,
+	0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12,
+	0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,
+	0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52,
+	0x03, 0x70, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x6f, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x72,
+	0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72,
+	0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x03, 0x6f, 0x6e, 0x64, 0x22,
+	0xa2, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72,
+	0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x6f, 0x6e, 0x64,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
+	0x6e, 0x64, 0x2e, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e,
+	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
+	0x03, 0x6f, 0x6e, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50,
+	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62,
+	0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68,
+	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03,
+	0x73, 0x62, 0x69, 0x22, 0xa0, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x37, 0x0a,
+	0x03, 0x73, 0x62, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61,
+	0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x2a, 0x0a,
+	0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e,
+	0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x47, 0x65,
+	0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a,
+	0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c,
+	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70,
+	0x6e, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03,
 	0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43,
-	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa7, 0x01,
-	0x0a, 0x1c, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x65,
-	0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e,
-	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
-	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
-	0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69,
-	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37,
-	0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f,
-	0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53,
-	0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
-	0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e,
-	0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
-	0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x03, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
-	0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
-	0x61, 0x74, 0x65, 0x22, 0x44, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07,
-	0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d,
-	0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46,
-	0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x43, 0x4f, 0x4e,
-	0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x22, 0xf4, 0x01, 0x0a, 0x0a, 0x53, 0x65,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x95, 0x01,
+	0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x50,
+	0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44,
+	0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x5e, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70,
+	0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x1c, 0x4f, 0x72, 0x63, 0x68, 0x65, 0x73,
+	0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+	0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x64, 0x65,
+	0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d,
+	0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06,
+	0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74,
+	0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e,
+	0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22,
+	0x58, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61,
+	0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x74,
+	0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c,
+	0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03,
+	0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x03, 0x6f, 0x6e,
+	0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x68, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73,
 	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
 	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03, 0x6f, 0x6e, 0x64, 0x18, 0x02, 0x20,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20,
 	0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
-	0x73, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x03, 0x6f, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x03, 0x73,
-	0x62, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x73, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x03, 0x73, 0x62, 0x69,
-	0x12, 0x2c, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x73, 0x65, 0x74,
-	0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3e,
-	0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18,
-	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
-	0x64, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52,
-	0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10,
-	0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64,
-	0x22, 0xc7, 0x01, 0x0a, 0x06, 0x73, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61,
-	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68,
-	0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64,
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x1e,
-	0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a,
-	0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
-	0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70,
-	0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73,
-	0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x08, 0x0a, 0x06, 0x73, 0x65,
-	0x74, 0x53, 0x62, 0x69, 0x22, 0x81, 0x01, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e,
-	0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x73,
-	0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x30, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12,
-	0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43,
-	0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x02, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65,
-	0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x35, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
-	0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a,
-	0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x73, 0x22, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x06, 0x0a,
-	0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01,
-	0x22, 0x78, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69,
-	0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61,
-	0x70, 0x69, 0x4f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x73,
-	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x52, 0x05, 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0xa9, 0x01, 0x0a, 0x0d, 0x44,
-	0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09,
-	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79,
-	0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a,
-	0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69,
-	0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-	0x70, 0x69, 0x64, 0x22, 0x21, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4f,
-	0x4e, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x42, 0x49, 0x10, 0x01, 0x12, 0x07, 0x0a,
-	0x03, 0x50, 0x4e, 0x44, 0x10, 0x02, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69,
-	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
-	0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x22, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x06, 0x0a, 0x02, 0x4f,
-	0x4b, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x2a, 0x33,
-	0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a,
-	0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45,
-	0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54,
-	0x45, 0x10, 0x02, 0x32, 0xb0, 0x01, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x03, 0x47,
-	0x65, 0x74, 0x12, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47,
-	0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64,
-	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x34, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x70,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x74, 0x0a,
+	0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
+	0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67,
+	0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x70, 0x69, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x7b, 0x0a, 0x0d, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03,
+	0x64, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x12, 0x12,
+	0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61,
+	0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x5f,
+	0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x05, 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x74,
+	0x4f, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a,
+	0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76,
+	0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0x37, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x12, 0x2d,
+	0x0a, 0x08, 0x73, 0x62, 0x69, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x12, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x62, 0x69,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x62, 0x69, 0x54, 0x79, 0x70, 0x65, 0x22, 0x45, 0x0a,
+	0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x24,
+	0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x02, 0x6f, 0x70, 0x22, 0x56, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a,
+	0x12, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09,
+	0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
 	0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74,
-	0x65, 0x12, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f,
-	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x29, 0x5a, 0x27, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66,
-	0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74,
-	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e,
-	0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09,
+	0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x11, 0x53,
+	0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x53, 0x65,
+	0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29,
+	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22,
+	0x94, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e,
+	0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69,
+	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x11,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12,
+	0x29, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x11, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48,
+	0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e,
+	0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47,
+	0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41,
+	0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a,
+	0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43,
+	0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48,
+	0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e,
+	0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69,
+	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49,
+	0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f,
+	0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45,
+	0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54,
+	0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a,
+	0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44,
+	0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x07, 0x53, 0x62, 0x69, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,
+	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13,
+	0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e,
+	0x46, 0x49, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50,
+	0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x49, 0x53, 0x45, 0x44, 0x10,
+	0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x42, 0x49, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4c,
+	0x55, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e,
+	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14,
+	0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41,
+	0x54, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f,
+	0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50,
+	0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10,
+	0x03, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53,
+	0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
+	0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b,
+	0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52,
+	0x4f, 0x52, 0x10, 0x02, 0x32, 0xfc, 0x09, 0x0a, 0x0a, 0x50, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65,
+	0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4f,
+	0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x5c, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4f,
+	0x6e, 0x64, 0x12, 0x18, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12,
+	0x15, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64,
+	0x2f, 0x7b, 0x64, 0x69, 0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64,
+	0x2e, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53,
+	0x65, 0x74, 0x4f, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x70,
+	0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x63,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73,
+	0x62, 0x69, 0x73, 0x12, 0x5d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x12, 0x18, 0x2e,
+	0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e,
+	0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x62, 0x69, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x70, 0x6e, 0x64,
+	0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x62, 0x69, 0x73, 0x2f, 0x7b, 0x73, 0x69,
+	0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74,
+	0x53, 0x62, 0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x62,
+	0x69, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f,
+	0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x62, 0x69, 0x73, 0x12, 0x6f, 0x0a, 0x0d, 0x47, 0x65,
+	0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x6f,
+	0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67,
+	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e,
+	0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b,
+	0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x6a, 0x0a, 0x09, 0x47,
+	0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73,
+	0x2f, 0x7b, 0x63, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x72, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x43, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69,
+	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c,
+	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4,
+	0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70,
+	0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x07, 0x47,
+	0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70,
+	0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x47, 0x65,
+	0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69,
+	0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x64, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61,
+	0x74, 0x68, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x12, 0x6f, 0x0a, 0x0b, 0x53, 0x65,
+	0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x73, 0x64,
+	0x6e, 0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b,
+	0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d,
+	0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x66, 0x0a, 0x09, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x2e, 0x70, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x70, 0x6e,
+	0x64, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x70, 0x6e,
+	0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x64,
+	0x69, 0x64, 0x7d, 0x42, 0xa8, 0x02, 0x5a, 0x27, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69,
+	0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61,
+	0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x70, 0x6e, 0x64, 0x92,
+	0x41, 0xfb, 0x01, 0x12, 0xf8, 0x01, 0x0a, 0x10, 0x67, 0x6f, 0x53, 0x44, 0x4e, 0x20, 0x4e, 0x6f,
+	0x72, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x4d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x6f, 0x20,
+	0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6f, 0x53,
+	0x44, 0x4e, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x0a, 0x18, 0x67, 0x6f, 0x53, 0x44, 0x4e,
+	0x20, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x12, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x6f, 0x64,
+	0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61,
+	0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2a, 0x50, 0x0a, 0x14, 0x42, 0x53, 0x44, 0x20, 0x33,
+	0x2d, 0x43, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12,
+	0x38, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62,
+	0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f,
+	0x61, 0x70, 0x69, 0x2f, 0x2d, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65,
+	0x72, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x03, 0x30, 0x2e, 0x31, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1727,76 +2753,118 @@ func file_gosdn_pnd_pnd_proto_rawDescGZIP() []byte {
 	return file_gosdn_pnd_pnd_proto_rawDescData
 }
 
-var file_gosdn_pnd_pnd_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
-var file_gosdn_pnd_pnd_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
+var file_gosdn_pnd_pnd_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
+var file_gosdn_pnd_pnd_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
 var file_gosdn_pnd_pnd_proto_goTypes = []interface{}{
-	(ApiOperation)(0),                      // 0: gosdn.pnd.ApiOperation
-	(Change_State)(0),                      // 1: gosdn.pnd.Change.State
-	(SetChange_Operation)(0),               // 2: gosdn.pnd.setChange.Operation
-	(SetResponseStatus)(0),                 // 3: gosdn.pnd.SetResponse.status
-	(DeleteRequest_Type)(0),                // 4: gosdn.pnd.DeleteRequest.Type
-	(DeleteResponseStatus)(0),              // 5: gosdn.pnd.DeleteResponse.status
-	(*GetRequest)(nil),                     // 6: gosdn.pnd.GetRequest
-	(*GetPnd)(nil),                         // 7: gosdn.pnd.getPnd
-	(*GetOnd)(nil),                         // 8: gosdn.pnd.getOnd
-	(*GetSbi)(nil),                         // 9: gosdn.pnd.getSbi
-	(*GetChange)(nil),                      // 10: gosdn.pnd.getChange
-	(*GetPath)(nil),                        // 11: gosdn.pnd.getPath
-	(*GetResponse)(nil),                    // 12: gosdn.pnd.GetResponse
-	(*PrincipalNetworkDomain)(nil),         // 13: gosdn.pnd.PrincipalNetworkDomain
-	(*OrchestratedNetworkingDevice)(nil),   // 14: gosdn.pnd.OrchestratedNetworkingDevice
-	(*Change)(nil),                         // 15: gosdn.pnd.Change
-	(*SetRequest)(nil),                     // 16: gosdn.pnd.SetRequest
-	(*SetOnd)(nil),                         // 17: gosdn.pnd.setOnd
-	(*SetSbi)(nil),                         // 18: gosdn.pnd.setSbi
-	(*SetChange)(nil),                      // 19: gosdn.pnd.setChange
-	(*SetResponse)(nil),                    // 20: gosdn.pnd.SetResponse
-	(*ChangeRequest)(nil),                  // 21: gosdn.pnd.ChangeRequest
-	(*DeleteRequest)(nil),                  // 22: gosdn.pnd.DeleteRequest
-	(*DeleteResponse)(nil),                 // 23: gosdn.pnd.DeleteResponse
-	(*southbound.SouthboundInterface)(nil), // 24: gosdn.southbound.SouthboundInterface
-	(*gnmi.Notification)(nil),              // 25: gnmi.Notification
-	(*transport.TransportOption)(nil),      // 26: gosdn.transport.TransportOption
+	(ChangeState)(0),                       // 0: gosdn.pnd.ChangeState
+	(ApiOperation)(0),                      // 1: gosdn.pnd.ApiOperation
+	(SbiType)(0),                           // 2: gosdn.pnd.SbiType
+	(Operation)(0),                         // 3: gosdn.pnd.Operation
+	(Status)(0),                            // 4: gosdn.pnd.Status
+	(*GetOndListRequest)(nil),              // 5: gosdn.pnd.GetOndListRequest
+	(*GetOndRequest)(nil),                  // 6: gosdn.pnd.GetOndRequest
+	(*GetSbiListRequest)(nil),              // 7: gosdn.pnd.GetSbiListRequest
+	(*GetSbiRequest)(nil),                  // 8: gosdn.pnd.GetSbiRequest
+	(*GetChangeListRequest)(nil),           // 9: gosdn.pnd.GetChangeListRequest
+	(*GetChangeRequest)(nil),               // 10: gosdn.pnd.GetChangeRequest
+	(*GetPathRequest)(nil),                 // 11: gosdn.pnd.GetPathRequest
+	(*GetOndResponse)(nil),                 // 12: gosdn.pnd.GetOndResponse
+	(*GetOndListResponse)(nil),             // 13: gosdn.pnd.GetOndListResponse
+	(*GetSbiResponse)(nil),                 // 14: gosdn.pnd.GetSbiResponse
+	(*GetSbiListResponse)(nil),             // 15: gosdn.pnd.GetSbiListResponse
+	(*GetPathResponse)(nil),                // 16: gosdn.pnd.GetPathResponse
+	(*GetChangeResponse)(nil),              // 17: gosdn.pnd.GetChangeResponse
+	(*GetChangeListResponse)(nil),          // 18: gosdn.pnd.GetChangeListResponse
+	(*PrincipalNetworkDomain)(nil),         // 19: gosdn.pnd.PrincipalNetworkDomain
+	(*OrchestratedNetworkingDevice)(nil),   // 20: gosdn.pnd.OrchestratedNetworkingDevice
+	(*Change)(nil),                         // 21: gosdn.pnd.Change
+	(*SetOndListRequest)(nil),              // 22: gosdn.pnd.SetOndListRequest
+	(*SetSbiListRequest)(nil),              // 23: gosdn.pnd.SetSbiListRequest
+	(*SetChangeListRequest)(nil),           // 24: gosdn.pnd.SetChangeListRequest
+	(*SetPathListRequest)(nil),             // 25: gosdn.pnd.SetPathListRequest
+	(*ChangeRequest)(nil),                  // 26: gosdn.pnd.ChangeRequest
+	(*SetOnd)(nil),                         // 27: gosdn.pnd.SetOnd
+	(*SetSbi)(nil),                         // 28: gosdn.pnd.SetSbi
+	(*SetChange)(nil),                      // 29: gosdn.pnd.SetChange
+	(*SetResponse)(nil),                    // 30: gosdn.pnd.SetResponse
+	(*SetOndListResponse)(nil),             // 31: gosdn.pnd.SetOndListResponse
+	(*SetChangeListResponse)(nil),          // 32: gosdn.pnd.SetChangeListResponse
+	(*SetChangeResponse)(nil),              // 33: gosdn.pnd.SetChangeResponse
+	(*SetSbiListResponse)(nil),             // 34: gosdn.pnd.SetSbiListResponse
+	(*SetPathListResponse)(nil),            // 35: gosdn.pnd.SetPathListResponse
+	(*DeleteOndRequest)(nil),               // 36: gosdn.pnd.DeleteOndRequest
+	(*DeleteOndResponse)(nil),              // 37: gosdn.pnd.DeleteOndResponse
+	(*southbound.SouthboundInterface)(nil), // 38: gosdn.southbound.SouthboundInterface
+	(*gnmi.Notification)(nil),              // 39: gnmi.Notification
+	(*transport.TransportOption)(nil),      // 40: gosdn.transport.TransportOption
 }
 var file_gosdn_pnd_pnd_proto_depIdxs = []int32{
-	7,  // 0: gosdn.pnd.GetRequest.pnd:type_name -> gosdn.pnd.getPnd
-	8,  // 1: gosdn.pnd.GetRequest.ond:type_name -> gosdn.pnd.getOnd
-	9,  // 2: gosdn.pnd.GetRequest.sbi:type_name -> gosdn.pnd.getSbi
-	10, // 3: gosdn.pnd.GetRequest.change:type_name -> gosdn.pnd.getChange
-	11, // 4: gosdn.pnd.GetRequest.path:type_name -> gosdn.pnd.getPath
-	13, // 5: gosdn.pnd.GetResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
-	14, // 6: gosdn.pnd.GetResponse.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
-	24, // 7: gosdn.pnd.GetResponse.sbi:type_name -> gosdn.southbound.SouthboundInterface
-	15, // 8: gosdn.pnd.GetResponse.change:type_name -> gosdn.pnd.Change
-	14, // 9: gosdn.pnd.PrincipalNetworkDomain.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
-	24, // 10: gosdn.pnd.PrincipalNetworkDomain.sbi:type_name -> gosdn.southbound.SouthboundInterface
-	15, // 11: gosdn.pnd.PrincipalNetworkDomain.change:type_name -> gosdn.pnd.Change
-	25, // 12: gosdn.pnd.OrchestratedNetworkingDevice.device:type_name -> gnmi.Notification
-	24, // 13: gosdn.pnd.OrchestratedNetworkingDevice.sbi:type_name -> gosdn.southbound.SouthboundInterface
-	1,  // 14: gosdn.pnd.Change.state:type_name -> gosdn.pnd.Change.State
-	17, // 15: gosdn.pnd.SetRequest.ond:type_name -> gosdn.pnd.setOnd
-	18, // 16: gosdn.pnd.SetRequest.sbi:type_name -> gosdn.pnd.setSbi
-	19, // 17: gosdn.pnd.SetRequest.change:type_name -> gosdn.pnd.setChange
-	21, // 18: gosdn.pnd.SetRequest.changeRequest:type_name -> gosdn.pnd.ChangeRequest
-	24, // 19: gosdn.pnd.setOnd.sbi:type_name -> gosdn.southbound.SouthboundInterface
-	26, // 20: gosdn.pnd.setOnd.transportOption:type_name -> gosdn.transport.TransportOption
-	2,  // 21: gosdn.pnd.setChange.op:type_name -> gosdn.pnd.setChange.Operation
-	3,  // 22: gosdn.pnd.SetResponse.Status:type_name -> gosdn.pnd.SetResponse.status
-	20, // 23: gosdn.pnd.SetResponse.responses:type_name -> gosdn.pnd.SetResponse
-	0,  // 24: gosdn.pnd.ChangeRequest.apiOp:type_name -> gosdn.pnd.ApiOperation
-	4,  // 25: gosdn.pnd.DeleteRequest.type:type_name -> gosdn.pnd.DeleteRequest.Type
-	5,  // 26: gosdn.pnd.DeleteResponse.Status:type_name -> gosdn.pnd.DeleteResponse.status
-	6,  // 27: gosdn.pnd.pnd.Get:input_type -> gosdn.pnd.GetRequest
-	16, // 28: gosdn.pnd.pnd.Set:input_type -> gosdn.pnd.SetRequest
-	22, // 29: gosdn.pnd.pnd.Delete:input_type -> gosdn.pnd.DeleteRequest
-	12, // 30: gosdn.pnd.pnd.Get:output_type -> gosdn.pnd.GetResponse
-	20, // 31: gosdn.pnd.pnd.Set:output_type -> gosdn.pnd.SetResponse
-	23, // 32: gosdn.pnd.pnd.Delete:output_type -> gosdn.pnd.DeleteResponse
-	30, // [30:33] is the sub-list for method output_type
-	27, // [27:30] is the sub-list for method input_type
-	27, // [27:27] is the sub-list for extension type_name
-	27, // [27:27] is the sub-list for extension extendee
-	0,  // [0:27] is the sub-list for field type_name
+	19, // 0: gosdn.pnd.GetOndResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	20, // 1: gosdn.pnd.GetOndResponse.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
+	19, // 2: gosdn.pnd.GetOndListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	20, // 3: gosdn.pnd.GetOndListResponse.ond:type_name -> gosdn.pnd.OrchestratedNetworkingDevice
+	19, // 4: gosdn.pnd.GetSbiResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	38, // 5: gosdn.pnd.GetSbiResponse.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	19, // 6: gosdn.pnd.GetSbiListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	38, // 7: gosdn.pnd.GetSbiListResponse.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	19, // 8: gosdn.pnd.GetPathResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	39, // 9: gosdn.pnd.GetPathResponse.device:type_name -> gnmi.Notification
+	19, // 10: gosdn.pnd.GetChangeResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	21, // 11: gosdn.pnd.GetChangeResponse.change:type_name -> gosdn.pnd.Change
+	19, // 12: gosdn.pnd.GetChangeListResponse.pnd:type_name -> gosdn.pnd.PrincipalNetworkDomain
+	21, // 13: gosdn.pnd.GetChangeListResponse.change:type_name -> gosdn.pnd.Change
+	39, // 14: gosdn.pnd.OrchestratedNetworkingDevice.device:type_name -> gnmi.Notification
+	38, // 15: gosdn.pnd.OrchestratedNetworkingDevice.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	0,  // 16: gosdn.pnd.Change.state:type_name -> gosdn.pnd.ChangeState
+	27, // 17: gosdn.pnd.SetOndListRequest.ond:type_name -> gosdn.pnd.SetOnd
+	28, // 18: gosdn.pnd.SetSbiListRequest.sbi:type_name -> gosdn.pnd.SetSbi
+	29, // 19: gosdn.pnd.SetChangeListRequest.change:type_name -> gosdn.pnd.SetChange
+	26, // 20: gosdn.pnd.SetPathListRequest.change_request:type_name -> gosdn.pnd.ChangeRequest
+	1,  // 21: gosdn.pnd.ChangeRequest.api_op:type_name -> gosdn.pnd.ApiOperation
+	38, // 22: gosdn.pnd.SetOnd.sbi:type_name -> gosdn.southbound.SouthboundInterface
+	40, // 23: gosdn.pnd.SetOnd.transport_option:type_name -> gosdn.transport.TransportOption
+	2,  // 24: gosdn.pnd.SetSbi.sbi_type:type_name -> gosdn.pnd.SbiType
+	3,  // 25: gosdn.pnd.SetChange.op:type_name -> gosdn.pnd.Operation
+	4,  // 26: gosdn.pnd.SetResponse.status:type_name -> gosdn.pnd.Status
+	4,  // 27: gosdn.pnd.SetOndListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 28: gosdn.pnd.SetOndListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 29: gosdn.pnd.SetChangeListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 30: gosdn.pnd.SetChangeListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 31: gosdn.pnd.SetChangeResponse.status:type_name -> gosdn.pnd.Status
+	4,  // 32: gosdn.pnd.SetSbiListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 33: gosdn.pnd.SetSbiListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 34: gosdn.pnd.SetPathListResponse.status:type_name -> gosdn.pnd.Status
+	30, // 35: gosdn.pnd.SetPathListResponse.responses:type_name -> gosdn.pnd.SetResponse
+	4,  // 36: gosdn.pnd.DeleteOndResponse.status:type_name -> gosdn.pnd.Status
+	5,  // 37: gosdn.pnd.PndService.GetOndList:input_type -> gosdn.pnd.GetOndListRequest
+	6,  // 38: gosdn.pnd.PndService.GetOnd:input_type -> gosdn.pnd.GetOndRequest
+	22, // 39: gosdn.pnd.PndService.SetOndList:input_type -> gosdn.pnd.SetOndListRequest
+	7,  // 40: gosdn.pnd.PndService.GetSbiList:input_type -> gosdn.pnd.GetSbiListRequest
+	8,  // 41: gosdn.pnd.PndService.GetSbi:input_type -> gosdn.pnd.GetSbiRequest
+	23, // 42: gosdn.pnd.PndService.SetSbiList:input_type -> gosdn.pnd.SetSbiListRequest
+	9,  // 43: gosdn.pnd.PndService.GetChangeList:input_type -> gosdn.pnd.GetChangeListRequest
+	10, // 44: gosdn.pnd.PndService.GetChange:input_type -> gosdn.pnd.GetChangeRequest
+	24, // 45: gosdn.pnd.PndService.SetChangeList:input_type -> gosdn.pnd.SetChangeListRequest
+	11, // 46: gosdn.pnd.PndService.GetPath:input_type -> gosdn.pnd.GetPathRequest
+	25, // 47: gosdn.pnd.PndService.SetPathList:input_type -> gosdn.pnd.SetPathListRequest
+	36, // 48: gosdn.pnd.PndService.DeleteOnd:input_type -> gosdn.pnd.DeleteOndRequest
+	13, // 49: gosdn.pnd.PndService.GetOndList:output_type -> gosdn.pnd.GetOndListResponse
+	12, // 50: gosdn.pnd.PndService.GetOnd:output_type -> gosdn.pnd.GetOndResponse
+	31, // 51: gosdn.pnd.PndService.SetOndList:output_type -> gosdn.pnd.SetOndListResponse
+	15, // 52: gosdn.pnd.PndService.GetSbiList:output_type -> gosdn.pnd.GetSbiListResponse
+	14, // 53: gosdn.pnd.PndService.GetSbi:output_type -> gosdn.pnd.GetSbiResponse
+	34, // 54: gosdn.pnd.PndService.SetSbiList:output_type -> gosdn.pnd.SetSbiListResponse
+	18, // 55: gosdn.pnd.PndService.GetChangeList:output_type -> gosdn.pnd.GetChangeListResponse
+	17, // 56: gosdn.pnd.PndService.GetChange:output_type -> gosdn.pnd.GetChangeResponse
+	32, // 57: gosdn.pnd.PndService.SetChangeList:output_type -> gosdn.pnd.SetChangeListResponse
+	16, // 58: gosdn.pnd.PndService.GetPath:output_type -> gosdn.pnd.GetPathResponse
+	35, // 59: gosdn.pnd.PndService.SetPathList:output_type -> gosdn.pnd.SetPathListResponse
+	37, // 60: gosdn.pnd.PndService.DeleteOnd:output_type -> gosdn.pnd.DeleteOndResponse
+	49, // [49:61] is the sub-list for method output_type
+	37, // [37:49] is the sub-list for method input_type
+	37, // [37:37] is the sub-list for extension type_name
+	37, // [37:37] is the sub-list for extension extendee
+	0,  // [0:37] is the sub-list for field type_name
 }
 
 func init() { file_gosdn_pnd_pnd_proto_init() }
@@ -1806,7 +2874,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 	}
 	if !protoimpl.UnsafeEnabled {
 		file_gosdn_pnd_pnd_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetRequest); i {
+			switch v := v.(*GetOndListRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1818,7 +2886,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPnd); i {
+			switch v := v.(*GetOndRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1830,7 +2898,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetOnd); i {
+			switch v := v.(*GetSbiListRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1842,7 +2910,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetSbi); i {
+			switch v := v.(*GetSbiRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1854,7 +2922,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetChange); i {
+			switch v := v.(*GetChangeListRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1866,7 +2934,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetPath); i {
+			switch v := v.(*GetChangeRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1878,7 +2946,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetResponse); i {
+			switch v := v.(*GetPathRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1890,7 +2958,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PrincipalNetworkDomain); i {
+			switch v := v.(*GetOndResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1902,7 +2970,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*OrchestratedNetworkingDevice); i {
+			switch v := v.(*GetOndListResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1914,7 +2982,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Change); i {
+			switch v := v.(*GetSbiResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1926,7 +2994,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetRequest); i {
+			switch v := v.(*GetSbiListResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1938,7 +3006,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetOnd); i {
+			switch v := v.(*GetPathResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1950,7 +3018,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetSbi); i {
+			switch v := v.(*GetChangeResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1962,7 +3030,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetChange); i {
+			switch v := v.(*GetChangeListResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1974,7 +3042,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*SetResponse); i {
+			switch v := v.(*PrincipalNetworkDomain); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1986,7 +3054,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ChangeRequest); i {
+			switch v := v.(*OrchestratedNetworkingDevice); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1998,7 +3066,7 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteRequest); i {
+			switch v := v.(*Change); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2010,7 +3078,187 @@ func file_gosdn_pnd_pnd_proto_init() {
 			}
 		}
 		file_gosdn_pnd_pnd_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteResponse); i {
+			switch v := v.(*SetOndListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbiListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPathListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChangeRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetOnd); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbi); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetOndListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetChangeResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetSbiListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPathListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteOndRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gosdn_pnd_pnd_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteOndResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2021,21 +3269,14 @@ func file_gosdn_pnd_pnd_proto_init() {
 				return nil
 			}
 		}
-	}
-	file_gosdn_pnd_pnd_proto_msgTypes[0].OneofWrappers = []interface{}{
-		(*GetRequest_Pnd)(nil),
-		(*GetRequest_Ond)(nil),
-		(*GetRequest_Sbi)(nil),
-		(*GetRequest_Change)(nil),
-		(*GetRequest_Path)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gosdn_pnd_pnd_proto_rawDesc,
-			NumEnums:      6,
-			NumMessages:   18,
+			NumEnums:      5,
+			NumMessages:   33,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/go/gosdn/pnd/pnd.pb.gw.go b/go/gosdn/pnd/pnd.pb.gw.go
new file mode 100644
index 0000000000000000000000000000000000000000..2b75200c8fad1fa6fe38831ee7293ad358a82c8b
--- /dev/null
+++ b/go/gosdn/pnd/pnd.pb.gw.go
@@ -0,0 +1,1602 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: gosdn/pnd/pnd.proto
+
+/*
+Package pnd is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package pnd
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/metadata"
+	"google.golang.org/grpc/status"
+	"google.golang.org/protobuf/proto"
+)
+
+// Suppress "imported and not used" errors
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+var _ = metadata.Join
+
+var (
+	filter_PndService_GetOndList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetOndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetOndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetOndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOndList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetOndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetOnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetOnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetOnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetOnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetOnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetOndList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetOndList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetOndList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetOndListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetOndList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetSbiList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbiList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetSbiList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbiList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetSbiList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetSbi_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "sid": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetSbi_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["sid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sid")
+	}
+
+	protoReq.Sid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbi_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetSbi(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetSbi_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetSbiRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["sid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sid")
+	}
+
+	protoReq.Sid, err = runtime.StringSlice(val, ",")
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetSbi_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetSbi(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetSbiList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetSbiList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetSbiListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetSbiList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetChangeList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
+)
+
+func request_PndService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChangeList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChangeList_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetChangeList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetChange_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "cuid": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["cuid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid")
+	}
+
+	protoReq.Cuid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChange_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetChange(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetChange_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetChangeRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["cuid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cuid")
+	}
+
+	protoReq.Cuid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cuid", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetChange_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetChange(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetChangeList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetChangeList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetChangeListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetChangeList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_GetPath_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1, "path": 2}, Base: []int{1, 1, 2, 3, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 3, 4}}
+)
+
+func request_PndService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPathRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	val, ok = pathParams["path"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path")
+	}
+
+	protoReq.Path, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPath_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.GetPath(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_GetPath_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq GetPathRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	val, ok = pathParams["path"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "path")
+	}
+
+	protoReq.Path, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "path", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_GetPath_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.GetPath(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+func request_PndService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetPathListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := client.SetPathList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_SetPathList_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq SetPathListRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	msg, err := server.SetPathList(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+var (
+	filter_PndService_DeleteOnd_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0, "did": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
+)
+
+func request_PndService_DeleteOnd_0(ctx context.Context, marshaler runtime.Marshaler, client PndServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeleteOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeleteOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := client.DeleteOnd(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_PndService_DeleteOnd_0(ctx context.Context, marshaler runtime.Marshaler, server PndServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq DeleteOndRequest
+	var metadata runtime.ServerMetadata
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["pid"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pid")
+	}
+
+	protoReq.Pid, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pid", err)
+	}
+
+	val, ok = pathParams["did"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "did")
+	}
+
+	protoReq.Did, err = runtime.String(val)
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "did", err)
+	}
+
+	if err := req.ParseForm(); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+	if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_PndService_DeleteOnd_0); err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	msg, err := server.DeleteOnd(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
+// RegisterPndServiceHandlerServer registers the http handlers for service PndService to "mux".
+// UnaryRPC     :call PndServiceServer directly.
+// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
+// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterPndServiceHandlerFromEndpoint instead.
+func RegisterPndServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server PndServiceServer) error {
+
+	mux.Handle("GET", pattern_PndService_GetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetOndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/ond/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetOnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetOndList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetSbiList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbi_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbi", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis/{sid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetSbi_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbi_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetSbiList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetChangeList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChange", runtime.WithHTTPPathPattern("/pnds/{pid}/changes/{cuid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetChange_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChange_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetChangeList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPath", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}/paths/{path}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_GetPath_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetPath_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/SetPathList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/paths"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_SetPathList_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetPathList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_PndService_DeleteOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		var stream runtime.ServerTransportStream
+		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.pnd.PndService/DeleteOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_PndService_DeleteOnd_0(rctx, inboundMarshaler, server, req, pathParams)
+		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_DeleteOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+// RegisterPndServiceHandlerFromEndpoint is same as RegisterPndServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterPndServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterPndServiceHandler(ctx, mux, conn)
+}
+
+// RegisterPndServiceHandler registers the http handlers for service PndService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterPndServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterPndServiceHandlerClient(ctx, mux, NewPndServiceClient(conn))
+}
+
+// RegisterPndServiceHandlerClient registers the http handlers for service PndService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "PndServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "PndServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "PndServiceClient" to call the correct interceptors.
+func RegisterPndServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client PndServiceClient) error {
+
+	mux.Handle("GET", pattern_PndService_GetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetOndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/ond/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetOnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetOndList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetOndList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetOndList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetOndList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetSbiList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetSbi_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetSbi", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis/{sid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetSbi_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetSbi_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetSbiList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetSbiList", runtime.WithHTTPPathPattern("/pnds/{pid}/sbis"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetSbiList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetSbiList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetChangeList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetChange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetChange", runtime.WithHTTPPathPattern("/pnds/{pid}/changes/{cuid}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetChange_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetChange_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetChangeList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetChangeList", runtime.WithHTTPPathPattern("/pnds/{pid}/changes"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetChangeList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetChangeList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("GET", pattern_PndService_GetPath_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/GetPath", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}/paths/{path}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_GetPath_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_GetPath_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("POST", pattern_PndService_SetPathList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/SetPathList", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/paths"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_SetPathList_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_SetPathList_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	mux.Handle("DELETE", pattern_PndService_DeleteOnd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.pnd.PndService/DeleteOnd", runtime.WithHTTPPathPattern("/pnds/{pid}/onds/{did}"))
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_PndService_DeleteOnd_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_PndService_DeleteOnd_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_PndService_GetOndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "onds"}, ""))
+
+	pattern_PndService_GetOnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "ond", "did"}, ""))
+
+	pattern_PndService_SetOndList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "onds"}, ""))
+
+	pattern_PndService_GetSbiList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "sbis"}, ""))
+
+	pattern_PndService_GetSbi_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "sbis", "sid"}, ""))
+
+	pattern_PndService_SetSbiList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "sbis"}, ""))
+
+	pattern_PndService_GetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "changes"}, ""))
+
+	pattern_PndService_GetChange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "changes", "cuid"}, ""))
+
+	pattern_PndService_SetChangeList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "changes"}, ""))
+
+	pattern_PndService_GetPath_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"pnds", "pid", "onds", "did", "paths", "path"}, ""))
+
+	pattern_PndService_SetPathList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"pnds", "pid", "onds", "paths"}, ""))
+
+	pattern_PndService_DeleteOnd_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "onds", "did"}, ""))
+)
+
+var (
+	forward_PndService_GetOndList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetOnd_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetOndList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetSbiList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetSbi_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetSbiList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetChangeList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetChange_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetChangeList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_GetPath_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_SetPathList_0 = runtime.ForwardResponseMessage
+
+	forward_PndService_DeleteOnd_0 = runtime.ForwardResponseMessage
+)
diff --git a/go/gosdn/pnd/pnd_grpc.pb.go b/go/gosdn/pnd/pnd_grpc.pb.go
index edfb8e5cf6c746a774eae0ad8cc50f855dd810ee..bc681280de05002ce2a8bcacb94bd30e6e03cc44 100644
--- a/go/gosdn/pnd/pnd_grpc.pb.go
+++ b/go/gosdn/pnd/pnd_grpc.pb.go
@@ -11,150 +11,527 @@ import (
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
 
-// PndClient is the client API for Pnd service.
+// PndServiceClient is the client API for PndService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type PndClient interface {
-	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
-	Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*SetResponse, error)
-	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error)
+type PndServiceClient interface {
+	// Allows to request all Orchestrated Networking Devices which are managed by a
+	// specific Principal Network Domain.
+	GetOndList(ctx context.Context, in *GetOndListRequest, opts ...grpc.CallOption) (*GetOndListResponse, error)
+	// Allows to request a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	GetOnd(ctx context.Context, in *GetOndRequest, opts ...grpc.CallOption) (*GetOndResponse, error)
+	// Allows add multiple Orchestrated Networking Devices to be managed by a
+	// specific Principal Network Domain.
+	SetOndList(ctx context.Context, in *SetOndListRequest, opts ...grpc.CallOption) (*SetOndListResponse, error)
+	// Allows to request all Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbiList(ctx context.Context, in *GetSbiListRequest, opts ...grpc.CallOption) (*GetSbiListResponse, error)
+	// Allows to request a specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbi(ctx context.Context, in *GetSbiRequest, opts ...grpc.CallOption) (*GetSbiResponse, error)
+	// Allows to add multiple specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	SetSbiList(ctx context.Context, in *SetSbiListRequest, opts ...grpc.CallOption) (*SetSbiListResponse, error)
+	// Allows to request all Changes registered for a specific Principal Network Domain.
+	GetChangeList(ctx context.Context, in *GetChangeListRequest, opts ...grpc.CallOption) (*GetChangeListResponse, error)
+	// Allows to request a specific Change registered for a specific Principal Network Domain.
+	GetChange(ctx context.Context, in *GetChangeRequest, opts ...grpc.CallOption) (*GetChangeResponse, error)
+	// Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+	SetChangeList(ctx context.Context, in *SetChangeListRequest, opts ...grpc.CallOption) (*SetChangeListResponse, error)
+	// Allows to request a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	GetPath(ctx context.Context, in *GetPathRequest, opts ...grpc.CallOption) (*GetPathResponse, error)
+	// Allows to set a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	SetPathList(ctx context.Context, in *SetPathListRequest, opts ...grpc.CallOption) (*SetPathListResponse, error)
+	// Allows to delete a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	DeleteOnd(ctx context.Context, in *DeleteOndRequest, opts ...grpc.CallOption) (*DeleteOndResponse, error)
 }
 
-type pndClient struct {
+type pndServiceClient struct {
 	cc grpc.ClientConnInterface
 }
 
-func NewPndClient(cc grpc.ClientConnInterface) PndClient {
-	return &pndClient{cc}
+func NewPndServiceClient(cc grpc.ClientConnInterface) PndServiceClient {
+	return &pndServiceClient{cc}
 }
 
-func (c *pndClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
-	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.pnd.pnd/Get", in, out, opts...)
+func (c *pndServiceClient) GetOndList(ctx context.Context, in *GetOndListRequest, opts ...grpc.CallOption) (*GetOndListResponse, error) {
+	out := new(GetOndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetOndList", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *pndClient) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*SetResponse, error) {
-	out := new(SetResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.pnd.pnd/Set", in, out, opts...)
+func (c *pndServiceClient) GetOnd(ctx context.Context, in *GetOndRequest, opts ...grpc.CallOption) (*GetOndResponse, error) {
+	out := new(GetOndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetOnd", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-func (c *pndClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*DeleteResponse, error) {
-	out := new(DeleteResponse)
-	err := c.cc.Invoke(ctx, "/gosdn.pnd.pnd/Delete", in, out, opts...)
+func (c *pndServiceClient) SetOndList(ctx context.Context, in *SetOndListRequest, opts ...grpc.CallOption) (*SetOndListResponse, error) {
+	out := new(SetOndListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetOndList", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
 	return out, nil
 }
 
-// PndServer is the server API for Pnd service.
-// All implementations must embed UnimplementedPndServer
+func (c *pndServiceClient) GetSbiList(ctx context.Context, in *GetSbiListRequest, opts ...grpc.CallOption) (*GetSbiListResponse, error) {
+	out := new(GetSbiListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetSbiList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetSbi(ctx context.Context, in *GetSbiRequest, opts ...grpc.CallOption) (*GetSbiResponse, error) {
+	out := new(GetSbiResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetSbi", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetSbiList(ctx context.Context, in *SetSbiListRequest, opts ...grpc.CallOption) (*SetSbiListResponse, error) {
+	out := new(SetSbiListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetSbiList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetChangeList(ctx context.Context, in *GetChangeListRequest, opts ...grpc.CallOption) (*GetChangeListResponse, error) {
+	out := new(GetChangeListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetChangeList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetChange(ctx context.Context, in *GetChangeRequest, opts ...grpc.CallOption) (*GetChangeResponse, error) {
+	out := new(GetChangeResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetChange", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetChangeList(ctx context.Context, in *SetChangeListRequest, opts ...grpc.CallOption) (*SetChangeListResponse, error) {
+	out := new(SetChangeListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetChangeList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) GetPath(ctx context.Context, in *GetPathRequest, opts ...grpc.CallOption) (*GetPathResponse, error) {
+	out := new(GetPathResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/GetPath", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) SetPathList(ctx context.Context, in *SetPathListRequest, opts ...grpc.CallOption) (*SetPathListResponse, error) {
+	out := new(SetPathListResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/SetPathList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *pndServiceClient) DeleteOnd(ctx context.Context, in *DeleteOndRequest, opts ...grpc.CallOption) (*DeleteOndResponse, error) {
+	out := new(DeleteOndResponse)
+	err := c.cc.Invoke(ctx, "/gosdn.pnd.PndService/DeleteOnd", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PndServiceServer is the server API for PndService service.
+// All implementations must embed UnimplementedPndServiceServer
 // for forward compatibility
-type PndServer interface {
-	Get(context.Context, *GetRequest) (*GetResponse, error)
-	Set(context.Context, *SetRequest) (*SetResponse, error)
-	Delete(context.Context, *DeleteRequest) (*DeleteResponse, error)
-	mustEmbedUnimplementedPndServer()
+type PndServiceServer interface {
+	// Allows to request all Orchestrated Networking Devices which are managed by a
+	// specific Principal Network Domain.
+	GetOndList(context.Context, *GetOndListRequest) (*GetOndListResponse, error)
+	// Allows to request a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	GetOnd(context.Context, *GetOndRequest) (*GetOndResponse, error)
+	// Allows add multiple Orchestrated Networking Devices to be managed by a
+	// specific Principal Network Domain.
+	SetOndList(context.Context, *SetOndListRequest) (*SetOndListResponse, error)
+	// Allows to request all Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbiList(context.Context, *GetSbiListRequest) (*GetSbiListResponse, error)
+	// Allows to request a specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	GetSbi(context.Context, *GetSbiRequest) (*GetSbiResponse, error)
+	// Allows to add multiple specific Southbound Interfaces a specific Principal Network
+	// Domain supports.
+	SetSbiList(context.Context, *SetSbiListRequest) (*SetSbiListResponse, error)
+	// Allows to request all Changes registered for a specific Principal Network Domain.
+	GetChangeList(context.Context, *GetChangeListRequest) (*GetChangeListResponse, error)
+	// Allows to request a specific Change registered for a specific Principal Network Domain.
+	GetChange(context.Context, *GetChangeRequest) (*GetChangeResponse, error)
+	// Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+	SetChangeList(context.Context, *SetChangeListRequest) (*SetChangeListResponse, error)
+	// Allows to request a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	GetPath(context.Context, *GetPathRequest) (*GetPathResponse, error)
+	// Allows to set a specific Path of a Orchestrated Networking Device,
+	// managed by a specific Principal Network Domain.
+	SetPathList(context.Context, *SetPathListRequest) (*SetPathListResponse, error)
+	// Allows to delete a specific Orchestrated Networking Device which is managed by a
+	// specific Principal Network Domain.
+	DeleteOnd(context.Context, *DeleteOndRequest) (*DeleteOndResponse, error)
+	mustEmbedUnimplementedPndServiceServer()
+}
+
+// UnimplementedPndServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedPndServiceServer struct {
+}
+
+func (UnimplementedPndServiceServer) GetOndList(context.Context, *GetOndListRequest) (*GetOndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOndList not implemented")
+}
+func (UnimplementedPndServiceServer) GetOnd(context.Context, *GetOndRequest) (*GetOndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetOnd not implemented")
+}
+func (UnimplementedPndServiceServer) SetOndList(context.Context, *SetOndListRequest) (*SetOndListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetOndList not implemented")
+}
+func (UnimplementedPndServiceServer) GetSbiList(context.Context, *GetSbiListRequest) (*GetSbiListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSbiList not implemented")
+}
+func (UnimplementedPndServiceServer) GetSbi(context.Context, *GetSbiRequest) (*GetSbiResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSbi not implemented")
+}
+func (UnimplementedPndServiceServer) SetSbiList(context.Context, *SetSbiListRequest) (*SetSbiListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetSbiList not implemented")
+}
+func (UnimplementedPndServiceServer) GetChangeList(context.Context, *GetChangeListRequest) (*GetChangeListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetChangeList not implemented")
+}
+func (UnimplementedPndServiceServer) GetChange(context.Context, *GetChangeRequest) (*GetChangeResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetChange not implemented")
+}
+func (UnimplementedPndServiceServer) SetChangeList(context.Context, *SetChangeListRequest) (*SetChangeListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetChangeList not implemented")
+}
+func (UnimplementedPndServiceServer) GetPath(context.Context, *GetPathRequest) (*GetPathResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetPath not implemented")
+}
+func (UnimplementedPndServiceServer) SetPathList(context.Context, *SetPathListRequest) (*SetPathListResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SetPathList not implemented")
+}
+func (UnimplementedPndServiceServer) DeleteOnd(context.Context, *DeleteOndRequest) (*DeleteOndResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteOnd not implemented")
+}
+func (UnimplementedPndServiceServer) mustEmbedUnimplementedPndServiceServer() {}
+
+// UnsafePndServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to PndServiceServer will
+// result in compilation errors.
+type UnsafePndServiceServer interface {
+	mustEmbedUnimplementedPndServiceServer()
+}
+
+func RegisterPndServiceServer(s grpc.ServiceRegistrar, srv PndServiceServer) {
+	s.RegisterService(&PndService_ServiceDesc, srv)
+}
+
+func _PndService_GetOndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetOndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetOndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetOndList(ctx, req.(*GetOndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetOnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOndRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetOnd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetOnd",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetOnd(ctx, req.(*GetOndRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_SetOndList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetOndListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetOndList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetOndList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetOndList(ctx, req.(*SetOndListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _PndService_GetSbiList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSbiListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetSbiList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetSbiList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetSbiList(ctx, req.(*GetSbiListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
 
-// UnimplementedPndServer must be embedded to have forward compatible implementations.
-type UnimplementedPndServer struct {
+func _PndService_GetSbi_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSbiRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetSbi(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetSbi",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetSbi(ctx, req.(*GetSbiRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
 
-func (*UnimplementedPndServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
+func _PndService_SetSbiList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetSbiListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetSbiList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetSbiList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetSbiList(ctx, req.(*SetSbiListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
-func (*UnimplementedPndServer) Set(context.Context, *SetRequest) (*SetResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Set not implemented")
+
+func _PndService_GetChangeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetChangeListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetChangeList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetChangeList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetChangeList(ctx, req.(*GetChangeListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
-func (*UnimplementedPndServer) Delete(context.Context, *DeleteRequest) (*DeleteResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented")
+
+func _PndService_GetChange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetChangeRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).GetChange(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/GetChange",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).GetChange(ctx, req.(*GetChangeRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
-func (*UnimplementedPndServer) mustEmbedUnimplementedPndServer() {}
 
-func RegisterPndServer(s *grpc.Server, srv PndServer) {
-	s.RegisterService(&_Pnd_serviceDesc, srv)
+func _PndService_SetChangeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetChangeListRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PndServiceServer).SetChangeList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/gosdn.pnd.PndService/SetChangeList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PndServiceServer).SetChangeList(ctx, req.(*SetChangeListRequest))
+	}
+	return interceptor(ctx, in, info, handler)
 }
 
-func _Pnd_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetRequest)
+func _PndService_GetPath_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetPathRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(PndServer).Get(ctx, in)
+		return srv.(PndServiceServer).GetPath(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.pnd.pnd/Get",
+		FullMethod: "/gosdn.pnd.PndService/GetPath",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(PndServer).Get(ctx, req.(*GetRequest))
+		return srv.(PndServiceServer).GetPath(ctx, req.(*GetPathRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Pnd_Set_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(SetRequest)
+func _PndService_SetPathList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SetPathListRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(PndServer).Set(ctx, in)
+		return srv.(PndServiceServer).SetPathList(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.pnd.pnd/Set",
+		FullMethod: "/gosdn.pnd.PndService/SetPathList",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(PndServer).Set(ctx, req.(*SetRequest))
+		return srv.(PndServiceServer).SetPathList(ctx, req.(*SetPathListRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-func _Pnd_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(DeleteRequest)
+func _PndService_DeleteOnd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteOndRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(PndServer).Delete(ctx, in)
+		return srv.(PndServiceServer).DeleteOnd(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/gosdn.pnd.pnd/Delete",
+		FullMethod: "/gosdn.pnd.PndService/DeleteOnd",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(PndServer).Delete(ctx, req.(*DeleteRequest))
+		return srv.(PndServiceServer).DeleteOnd(ctx, req.(*DeleteOndRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
 
-var _Pnd_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "gosdn.pnd.pnd",
-	HandlerType: (*PndServer)(nil),
+// PndService_ServiceDesc is the grpc.ServiceDesc for PndService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var PndService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "gosdn.pnd.PndService",
+	HandlerType: (*PndServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
-			MethodName: "Get",
-			Handler:    _Pnd_Get_Handler,
+			MethodName: "GetOndList",
+			Handler:    _PndService_GetOndList_Handler,
+		},
+		{
+			MethodName: "GetOnd",
+			Handler:    _PndService_GetOnd_Handler,
+		},
+		{
+			MethodName: "SetOndList",
+			Handler:    _PndService_SetOndList_Handler,
+		},
+		{
+			MethodName: "GetSbiList",
+			Handler:    _PndService_GetSbiList_Handler,
+		},
+		{
+			MethodName: "GetSbi",
+			Handler:    _PndService_GetSbi_Handler,
+		},
+		{
+			MethodName: "SetSbiList",
+			Handler:    _PndService_SetSbiList_Handler,
+		},
+		{
+			MethodName: "GetChangeList",
+			Handler:    _PndService_GetChangeList_Handler,
+		},
+		{
+			MethodName: "GetChange",
+			Handler:    _PndService_GetChange_Handler,
+		},
+		{
+			MethodName: "SetChangeList",
+			Handler:    _PndService_SetChangeList_Handler,
+		},
+		{
+			MethodName: "GetPath",
+			Handler:    _PndService_GetPath_Handler,
 		},
 		{
-			MethodName: "Set",
-			Handler:    _Pnd_Set_Handler,
+			MethodName: "SetPathList",
+			Handler:    _PndService_SetPathList_Handler,
 		},
 		{
-			MethodName: "Delete",
-			Handler:    _Pnd_Delete_Handler,
+			MethodName: "DeleteOnd",
+			Handler:    _PndService_DeleteOnd_Handler,
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
diff --git a/go/gosdn/southbound/southbound.pb.go b/go/gosdn/southbound/southbound.pb.go
index 216d34115ced38abac1fa95d21286ee37f422eb2..d326feaeb6e5a24be11ad47e77a5deef7af885fe 100644
--- a/go/gosdn/southbound/southbound.pb.go
+++ b/go/gosdn/southbound/southbound.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
 // source: gosdn/southbound/southbound.proto
 
 package southbound
@@ -21,25 +21,30 @@ const (
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
 
+// Changed accoprding to style guide:
+// https://docs.buf.build/best-practices/style-guide#enums
 type Type int32
 
 const (
-	Type_OPENCONFIG    Type = 0
-	Type_CONTAINERISED Type = 1
-	Type_PLUGIN        Type = 2
+	Type_TYPE_UNSPECIFIED   Type = 0
+	Type_TYPE_OPENCONFIG    Type = 1
+	Type_TYPE_CONTAINERISED Type = 2
+	Type_TYPE_PLUGIN        Type = 3
 )
 
 // Enum value maps for Type.
 var (
 	Type_name = map[int32]string{
-		0: "OPENCONFIG",
-		1: "CONTAINERISED",
-		2: "PLUGIN",
+		0: "TYPE_UNSPECIFIED",
+		1: "TYPE_OPENCONFIG",
+		2: "TYPE_CONTAINERISED",
+		3: "TYPE_PLUGIN",
 	}
 	Type_value = map[string]int32{
-		"OPENCONFIG":    0,
-		"CONTAINERISED": 1,
-		"PLUGIN":        2,
+		"TYPE_UNSPECIFIED":   0,
+		"TYPE_OPENCONFIG":    1,
+		"TYPE_CONTAINERISED": 2,
+		"TYPE_PLUGIN":        3,
 	}
 )
 
@@ -122,7 +127,7 @@ func (x *SouthboundInterface) GetType() Type {
 	if x != nil {
 		return x.Type
 	}
-	return Type_OPENCONFIG
+	return Type_TYPE_UNSPECIFIED
 }
 
 var File_gosdn_southbound_southbound_proto protoreflect.FileDescriptor
@@ -138,14 +143,16 @@ var file_gosdn_southbound_southbound_proto_rawDesc = []byte{
 	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a,
 	0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67,
 	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e,
-	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x35, 0x0a, 0x04, 0x54, 0x79,
-	0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47,
-	0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x49,
-	0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x4c, 0x55, 0x47, 0x49, 0x4e, 0x10,
-	0x02, 0x42, 0x30, 0x5a, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d,
-	0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f,
-	0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f,
-	0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x5a, 0x0a, 0x04, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x59, 0x50, 0x45,
+	0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a,
+	0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x49,
+	0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4c,
+	0x55, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x42, 0x30, 0x5a, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66,
+	0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74,
+	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f,
+	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/go/gosdn/transport/transport.pb.go b/go/gosdn/transport/transport.pb.go
index c042703ff9a38ef8c3c997a9a3886ad862dbc8b2..15ebfa0d1ade7b19a011ef2e10f6fb976486f284 100644
--- a/go/gosdn/transport/transport.pb.go
+++ b/go/gosdn/transport/transport.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.17.2
+// 	protoc-gen-go v1.27.1
+// 	protoc        (unknown)
 // source: gosdn/transport/transport.proto
 
 package transport
@@ -35,7 +35,7 @@ type TransportOption struct {
 	// Types that are assignable to TransportOption:
 	//	*TransportOption_GnmiTransportOption
 	//	*TransportOption_RestconfTransportOption
-	TransportOption isTransportOption_TransportOption `protobuf_oneof:"transportOption"`
+	TransportOption isTransportOption_TransportOption `protobuf_oneof:"transport_option"`
 	Type            southbound.Type                   `protobuf:"varint,7,opt,name=type,proto3,enum=gosdn.southbound.Type" json:"type,omitempty"`
 }
 
@@ -124,7 +124,7 @@ func (x *TransportOption) GetType() southbound.Type {
 	if x != nil {
 		return x.Type
 	}
-	return southbound.Type_OPENCONFIG
+	return southbound.Type(0)
 }
 
 type isTransportOption_TransportOption interface {
@@ -132,11 +132,11 @@ type isTransportOption_TransportOption interface {
 }
 
 type TransportOption_GnmiTransportOption struct {
-	GnmiTransportOption *GnmiTransportOption `protobuf:"bytes,5,opt,name=GnmiTransportOption,proto3,oneof"`
+	GnmiTransportOption *GnmiTransportOption `protobuf:"bytes,5,opt,name=gnmi_transport_option,json=gnmiTransportOption,proto3,oneof"`
 }
 
 type TransportOption_RestconfTransportOption struct {
-	RestconfTransportOption *RestconfTransportOption `protobuf:"bytes,6,opt,name=RestconfTransportOption,proto3,oneof"`
+	RestconfTransportOption *RestconfTransportOption `protobuf:"bytes,6,opt,name=restconf_transport_option,json=restconfTransportOption,proto3,oneof"`
 }
 
 func (*TransportOption_GnmiTransportOption) isTransportOption_TransportOption() {}
@@ -149,7 +149,7 @@ type GnmiTransportOption struct {
 	unknownFields protoimpl.UnknownFields
 
 	Compression     string            `protobuf:"bytes,1,opt,name=compression,proto3" json:"compression,omitempty"`
-	GrpcDialOptions map[string]string `protobuf:"bytes,2,rep,name=grpcDialOptions,proto3" json:"grpcDialOptions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	GrpcDialOptions map[string]string `protobuf:"bytes,2,rep,name=grpc_dial_options,json=grpcDialOptions,proto3" json:"grpc_dial_options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	Token           string            `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
 	Encoding        gnmi.Encoding     `protobuf:"varint,4,opt,name=encoding,proto3,enum=gnmi.Encoding" json:"encoding,omitempty"`
 }
@@ -211,7 +211,7 @@ func (x *GnmiTransportOption) GetEncoding() gnmi.Encoding {
 	if x != nil {
 		return x.Encoding
 	}
-	return gnmi.Encoding_JSON
+	return gnmi.Encoding(0)
 }
 
 type RestconfTransportOption struct {
@@ -265,7 +265,7 @@ var file_gosdn_transport_transport_proto_rawDesc = []byte{
 	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6e, 0x6d, 0x69, 0x2f, 0x67, 0x6e, 0x6d, 0x69,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f,
 	0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f,
-	0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf4, 0x02, 0x0a, 0x0f, 0x54, 0x72,
+	0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf9, 0x02, 0x0a, 0x0f, 0x54, 0x72,
 	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
 	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
 	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e,
@@ -273,46 +273,46 @@ var file_gosdn_transport_transport_proto_rawDesc = []byte{
 	0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,
 	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12,
 	0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c,
-	0x73, 0x12, 0x58, 0x0a, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
-	0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
-	0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
-	0x2e, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e,
-	0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x17, 0x52,
-	0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
-	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67,
-	0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52,
-	0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
-	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x52, 0x65, 0x73, 0x74, 0x63, 0x6f,
-	0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75,
-	0x6e, 0x64, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x11, 0x0a,
-	0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x22, 0xa2, 0x02, 0x0a, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
-	0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70,
-	0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63,
-	0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x63, 0x0a, 0x0f, 0x67, 0x72,
-	0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e,
-	0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70,
-	0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x44, 0x69,
-	0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f,
-	0x67, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
-	0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
-	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
-	0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x45,
-	0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
-	0x67, 0x1a, 0x42, 0x0a, 0x14, 0x47, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e,
-	0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-	0x42, 0x2f, 0x5a, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64,
-	0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67,
-	0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
-	0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x12, 0x5a, 0x0a, 0x15, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74,
+	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x67, 0x6e, 0x6d, 0x69, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a,
+	0x19, 0x72, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f,
+	0x72, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73,
+	0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65,
+	0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74,
+	0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x42, 0x12, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x13, 0x47, 0x6e, 0x6d, 0x69, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a,
+	0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+	0x65, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x5f, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x47, 0x6e, 0x6d,
+	0x69, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x47, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x44, 0x69, 0x61, 0x6c, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x08,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e,
+	0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08,
+	0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x1a, 0x42, 0x0a, 0x14, 0x47, 0x72, 0x70, 0x63,
+	0x44, 0x69, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17,
+	0x52, 0x65, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
+	0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x2f, 0x5a, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x2e,
+	0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65,
+	0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -337,10 +337,10 @@ var file_gosdn_transport_transport_proto_goTypes = []interface{}{
 	(gnmi.Encoding)(0),              // 5: gnmi.Encoding
 }
 var file_gosdn_transport_transport_proto_depIdxs = []int32{
-	1, // 0: gosdn.transport.TransportOption.GnmiTransportOption:type_name -> gosdn.transport.GnmiTransportOption
-	2, // 1: gosdn.transport.TransportOption.RestconfTransportOption:type_name -> gosdn.transport.RestconfTransportOption
+	1, // 0: gosdn.transport.TransportOption.gnmi_transport_option:type_name -> gosdn.transport.GnmiTransportOption
+	2, // 1: gosdn.transport.TransportOption.restconf_transport_option:type_name -> gosdn.transport.RestconfTransportOption
 	4, // 2: gosdn.transport.TransportOption.type:type_name -> gosdn.southbound.Type
-	3, // 3: gosdn.transport.GnmiTransportOption.grpcDialOptions:type_name -> gosdn.transport.GnmiTransportOption.GrpcDialOptionsEntry
+	3, // 3: gosdn.transport.GnmiTransportOption.grpc_dial_options:type_name -> gosdn.transport.GnmiTransportOption.GrpcDialOptionsEntry
 	5, // 4: gosdn.transport.GnmiTransportOption.encoding:type_name -> gnmi.Encoding
 	5, // [5:5] is the sub-list for method output_type
 	5, // [5:5] is the sub-list for method input_type
diff --git a/openapiv2/gosdn_northbound.swagger.json b/openapiv2/gosdn_northbound.swagger.json
new file mode 100644
index 0000000000000000000000000000000000000000..ee8475143432e7e000ed643beab980cf068c59b5
--- /dev/null
+++ b/openapiv2/gosdn_northbound.swagger.json
@@ -0,0 +1,2443 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "goSDN Northbound",
+    "description": "Protocol Buffer specifications and Go code for the goSDN northbound Interface",
+    "version": "0.1",
+    "contact": {
+      "name": "goSDN Northbound project",
+      "url": "https://code.fbi.h-da.de/danet/api"
+    },
+    "license": {
+      "name": "BSD 3-Clause License",
+      "url": "https://code.fbi.h-da.de/danet/api/-/blob/master/LICENSE"
+    }
+  },
+  "tags": [
+    {
+      "name": "PndService"
+    },
+    {
+      "name": "Collector"
+    },
+    {
+      "name": "gNMI"
+    },
+    {
+      "name": "AgentManager"
+    },
+    {
+      "name": "CoreService"
+    },
+    {
+      "name": "CsbiService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/pnd/{pid}": {
+      "get": {
+        "summary": "Allows to request a specific Principal Network Domain.",
+        "operationId": "CoreService_GetPnd",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/coreGetPndResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "csv",
+            "minItems": 1
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "CoreService"
+        ]
+      }
+    },
+    "/pnds": {
+      "get": {
+        "summary": "Allows to request all Principal Network Domains.",
+        "operationId": "CoreService_GetPndList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/coreGetPndListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "CoreService"
+        ]
+      },
+      "post": {
+        "summary": "Allows create a Principal Network Domain.",
+        "operationId": "CoreService_CreatePndList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/coreCreatePndListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/coreCreatePndListRequest"
+            }
+          }
+        ],
+        "tags": [
+          "CoreService"
+        ]
+      }
+    },
+    "/pnds/{pid}": {
+      "delete": {
+        "summary": "Allows to delete a specific Principal Network Domain.",
+        "operationId": "CoreService_DeletePnd",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/coreDeletePndResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "CoreService"
+        ]
+      }
+    },
+    "/pnds/{pid}/changes": {
+      "get": {
+        "summary": "Allows to request all Changes registered for a specific Principal Network Domain.",
+        "operationId": "PndService_GetChangeList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetChangeListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      },
+      "post": {
+        "summary": "Allows to operate on multiple Changes registered for a specific Principal Network Domain.",
+        "operationId": "PndService_SetChangeList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndSetChangeListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "object",
+              "properties": {
+                "timestamp": {
+                  "type": "string",
+                  "format": "int64"
+                },
+                "change": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/pndSetChange"
+                  }
+                }
+              }
+            }
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/changes/{cuid}": {
+      "get": {
+        "summary": "Allows to request a specific Change registered for a specific Principal Network Domain.",
+        "operationId": "PndService_GetChange",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetChangeResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "cuid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/ond/{did}": {
+      "get": {
+        "summary": "Allows to request a specific Orchestrated Networking Device which is managed by a\nspecific Principal Network Domain.",
+        "operationId": "PndService_GetOnd",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetOndResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "did",
+            "in": "path",
+            "required": true,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "csv",
+            "minItems": 1
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/onds": {
+      "get": {
+        "summary": "Allows to request all Orchestrated Networking Devices which are managed by a\nspecific Principal Network Domain.",
+        "operationId": "PndService_GetOndList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetOndListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      },
+      "post": {
+        "summary": "Allows add multiple Orchestrated Networking Devices to be managed by a\nspecific Principal Network Domain.",
+        "operationId": "PndService_SetOndList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndSetOndListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "object",
+              "properties": {
+                "timestamp": {
+                  "type": "string",
+                  "format": "int64"
+                },
+                "ond": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/pndSetOnd"
+                  }
+                }
+              }
+            }
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/onds/paths": {
+      "post": {
+        "summary": "Allows to set a specific Path of a Orchestrated Networking Device,\nmanaged by a specific Principal Network Domain.",
+        "operationId": "PndService_SetPathList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndSetPathListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "object",
+              "properties": {
+                "timestamp": {
+                  "type": "string",
+                  "format": "int64"
+                },
+                "changeRequest": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/pndChangeRequest"
+                  }
+                }
+              }
+            }
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/onds/{did}": {
+      "delete": {
+        "summary": "Allows to delete a specific Orchestrated Networking Device which is managed by a\nspecific Principal Network Domain.",
+        "operationId": "PndService_DeleteOnd",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndDeleteOndResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "did",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/onds/{did}/paths/{path}": {
+      "get": {
+        "summary": "Allows to request a specific Path of a Orchestrated Networking Device,\nmanaged by a specific Principal Network Domain.",
+        "operationId": "PndService_GetPath",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetPathResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "did",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "path",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/sbis": {
+      "get": {
+        "summary": "Allows to request all Southbound Interfaces a specific Principal Network\nDomain supports.",
+        "operationId": "PndService_GetSbiList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetSbiListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      },
+      "post": {
+        "summary": "Allows to add multiple specific Southbound Interfaces a specific Principal Network\nDomain supports.",
+        "operationId": "PndService_SetSbiList",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndSetSbiListResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "type": "object",
+              "properties": {
+                "timestamp": {
+                  "type": "string",
+                  "format": "int64"
+                },
+                "sbi": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/definitions/pndSetSbi"
+                  }
+                }
+              }
+            }
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    },
+    "/pnds/{pid}/sbis/{sid}": {
+      "get": {
+        "summary": "Allows to request a specific Southbound Interfaces a specific Principal Network\nDomain supports.",
+        "operationId": "PndService_GetSbi",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/pndGetSbiResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "pid",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "sid",
+            "in": "path",
+            "required": true,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "csv",
+            "minItems": 1
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "PndService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "ConfigClientType": {
+      "type": "string",
+      "enum": [
+        "GRPC",
+        "STUBBY",
+        "GRPC_GNMI",
+        "GRPC_GNMI_PROD"
+      ],
+      "default": "GRPC"
+    },
+    "GetRequestDataType": {
+      "type": "string",
+      "enum": [
+        "ALL",
+        "CONFIG",
+        "STATE",
+        "OPERATIONAL"
+      ],
+      "default": "ALL",
+      "description": "Type of elements within the data tree.\n\n - OPERATIONAL: Data elements marked in the schema as operational. This refers to data\nelements whose value relates to the state of processes or interactions\nrunning on the device."
+    },
+    "SubscriptionListMode": {
+      "type": "string",
+      "enum": [
+        "STREAM",
+        "ONCE",
+        "POLL"
+      ],
+      "default": "STREAM",
+      "description": "Mode of the subscription."
+    },
+    "coreCreatePndListRequest": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/corePndCreateProperties"
+          }
+        }
+      }
+    },
+    "coreCreatePndListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdncoreStatus"
+        }
+      }
+    },
+    "coreDeletePndResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdncoreStatus"
+        }
+      }
+    },
+    "coreGetPndListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndPrincipalNetworkDomain"
+          }
+        }
+      }
+    },
+    "coreGetPndResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndPrincipalNetworkDomain"
+          }
+        }
+      }
+    },
+    "corePndCreateProperties": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "sbi": {
+          "type": "string"
+        }
+      }
+    },
+    "csbiAck": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "transportOption": {
+          "$ref": "#/definitions/transportTransportOption"
+        }
+      }
+    },
+    "csbiCreateResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "deployments": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/csbiDeployment"
+          }
+        }
+      }
+    },
+    "csbiDeleteResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/csbiDeleteResponseStatus"
+        }
+      }
+    },
+    "csbiDeleteResponseStatus": {
+      "type": "string",
+      "enum": [
+        "STATUS_UNSPECIFIED",
+        "STATUS_OK",
+        "STATUS_ERROR"
+      ],
+      "default": "STATUS_UNSPECIFIED"
+    },
+    "csbiDeployment": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "state": {
+          "$ref": "#/definitions/gosdncsbiState"
+        }
+      }
+    },
+    "csbiPayload": {
+      "type": "object",
+      "properties": {
+        "chunk": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "fakeBoolList": {
+      "type": "object",
+      "properties": {
+        "options": {
+          "type": "array",
+          "items": {
+            "type": "boolean"
+          },
+          "description": "The set of values which can be used."
+        },
+        "random": {
+          "type": "boolean",
+          "description": "Set to true to randomize selection of value from options. If false, the\nvalues are cycled in order, starting at index 0."
+        }
+      }
+    },
+    "fakeBoolValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "boolean",
+          "description": "If distribution is BoolList, value is only used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "list": {
+          "$ref": "#/definitions/fakeBoolList"
+        }
+      }
+    },
+    "fakeConfig": {
+      "type": "object",
+      "properties": {
+        "target": {
+          "type": "string",
+          "description": "The target for which the fake will publish values for."
+        },
+        "port": {
+          "type": "integer",
+          "format": "int32",
+          "description": "Port for the agent to listen on. If 0 or unset the agent will pick a port\nfor this agent."
+        },
+        "seed": {
+          "type": "string",
+          "format": "int64",
+          "description": "A global random seed used in generating subsequent values. Set to have\nreproducible results."
+        },
+        "values": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmifakeValue"
+          },
+          "description": "The list of values generated.  Each value will contain its corresponding\ntarget as the first string in the event.GetValue().path meaning that it is\npossible to generate streams that will be rejected by the cache for testing\npurposes."
+        },
+        "disableSync": {
+          "type": "boolean",
+          "description": "Setting disable sync will keep the configured client from autogenerating a\nsync message. This allows negative testing on sync handling."
+        },
+        "clientType": {
+          "$ref": "#/definitions/ConfigClientType",
+          "description": "Type of client to fake either Stubby or GRPC based fake."
+        },
+        "disableEof": {
+          "type": "boolean",
+          "description": "Disable EOF will hold open the subscription and not automagically close\nthe stream once the value queue is empty."
+        },
+        "credentials": {
+          "$ref": "#/definitions/gnmifakeCredentials",
+          "description": "Per RPC credentials for the agent. If not set no per RPC auth will be used."
+        },
+        "cert": {
+          "type": "string",
+          "format": "byte",
+          "description": "TLS cert for use on the agent. If not set the transport will not be TLS."
+        },
+        "enableDelay": {
+          "type": "boolean",
+          "description": "Honor the delay between events in the generated value streams. Default will\nplay events as fast as the can be streamed."
+        },
+        "custom": {
+          "$ref": "#/definitions/protobufAny"
+        },
+        "random": {
+          "$ref": "#/definitions/fakeRandomGenerator"
+        },
+        "fixed": {
+          "$ref": "#/definitions/fakeFixedGenerator"
+        },
+        "tunnelAddr": {
+          "type": "string",
+          "description": "tunnel_addr is the address of the tunnel server."
+        },
+        "tunnelCrt": {
+          "type": "string",
+          "description": "tunnel_crt is the certificate file for the tunnel conection."
+        }
+      },
+      "description": "Config is a collection of values that together represent the update streams\nfor one or more fake devices."
+    },
+    "fakeDeleteValue": {
+      "type": "object",
+      "description": "Delete will cause the value to be deleted at the Value's path."
+    },
+    "fakeDoubleList": {
+      "type": "object",
+      "properties": {
+        "options": {
+          "type": "array",
+          "items": {
+            "type": "number",
+            "format": "double"
+          },
+          "description": "The set of values which can be used."
+        },
+        "random": {
+          "type": "boolean",
+          "description": "Set to true to randomize selection of value from options. If false, the\nvalues are cycled in order."
+        }
+      }
+    },
+    "fakeDoubleRange": {
+      "type": "object",
+      "properties": {
+        "minimum": {
+          "type": "number",
+          "format": "double",
+          "description": "The range of the value allowed."
+        },
+        "maximum": {
+          "type": "number",
+          "format": "double"
+        },
+        "deltaMin": {
+          "type": "number",
+          "format": "double",
+          "description": "If set, the value is cumulative and the subsequent value is value + delta\nwhere delta is randomly chosen between delta_min and delta_max. The range\nminimum and maximum are still respected. If not set subsequent value is a\nvalue randomly chosen between minimum and maximum."
+        },
+        "deltaMax": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    },
+    "fakeDoubleValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "number",
+          "format": "double",
+          "description": "If distribution is DoubleRange, value is used as the initial value\ninside [minimum, maximum] and hold the value as it mutates.\nIf distribution is DoubleList, value is only used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "range": {
+          "$ref": "#/definitions/fakeDoubleRange"
+        },
+        "list": {
+          "$ref": "#/definitions/fakeDoubleList"
+        }
+      }
+    },
+    "fakeFixedGenerator": {
+      "type": "object",
+      "properties": {
+        "responses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiSubscribeResponse"
+          }
+        }
+      }
+    },
+    "fakeIntList": {
+      "type": "object",
+      "properties": {
+        "options": {
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "int64"
+          },
+          "description": "The set of values which can be used."
+        },
+        "random": {
+          "type": "boolean",
+          "description": "Set to true to randomize selection of value from options. If false, the\nvalues are cycled in order, starting at index 0."
+        }
+      }
+    },
+    "fakeIntRange": {
+      "type": "object",
+      "properties": {
+        "minimum": {
+          "type": "string",
+          "format": "int64",
+          "description": "The range of the value allowed."
+        },
+        "maximum": {
+          "type": "string",
+          "format": "int64"
+        },
+        "deltaMin": {
+          "type": "string",
+          "format": "int64",
+          "description": "If set, the value is cumulative and the subsequent value is value + delta\nwhere delta is randomly chosen between delta_min and delta_max.  The range\nminimum and maximum are still respected and values will saturate at the\nboundaries if they are exceeded. If not set subsequent value is a value\nrandomly chosen between minimum and maximum."
+        },
+        "deltaMax": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "fakeIntValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "string",
+          "format": "int64",
+          "description": "If distribution is IntRange, value is used as the initial value\ninside [minimum, maximum] and hold the value as it mutates.\nIf distribution is IntList, value is only used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "range": {
+          "$ref": "#/definitions/fakeIntRange"
+        },
+        "list": {
+          "$ref": "#/definitions/fakeIntList"
+        }
+      }
+    },
+    "fakeRandomGenerator": {
+      "type": "object",
+      "properties": {
+        "seed": {
+          "type": "string",
+          "format": "int64"
+        },
+        "values": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmifakeValue"
+          }
+        }
+      }
+    },
+    "fakeStringList": {
+      "type": "object",
+      "properties": {
+        "options": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "The set of strings which can be used."
+        },
+        "random": {
+          "type": "boolean",
+          "description": "Set to true to randomize selection of value from options. If false, the\nvalues are cycled in order, starting at index 0."
+        }
+      }
+    },
+    "fakeStringListValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "If distribution is StringList, value is used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "list": {
+          "$ref": "#/definitions/fakeStringList"
+        }
+      }
+    },
+    "fakeStringValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "string",
+          "description": "If distribution is StringList, value is used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "list": {
+          "$ref": "#/definitions/fakeStringList"
+        }
+      }
+    },
+    "fakeTimestamp": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64",
+          "description": "Initial timestamp for the corresponding value, nanoseconds since epoch.\nThis value need have no relation to absolute real-time as the stream of\nof updates is generated without regard to the real clock and can be run\nrepeatably at any time if the seed is set in the corresponding Value."
+        },
+        "deltaMin": {
+          "type": "string",
+          "format": "int64",
+          "description": "These values will vary the change in the timestamp for subsequent outputs\nby a value between delta_min and delta_max.  Set to the same value to force\na set periodic interval."
+        },
+        "deltaMax": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "fakeUintList": {
+      "type": "object",
+      "properties": {
+        "options": {
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "uint64"
+          },
+          "description": "The set of values which can be used."
+        },
+        "random": {
+          "type": "boolean",
+          "description": "Set to true to randomize selection of value from options. If false, the\nvalues are cycled in order, starting at index 0."
+        }
+      }
+    },
+    "fakeUintRange": {
+      "type": "object",
+      "properties": {
+        "minimum": {
+          "type": "string",
+          "format": "uint64",
+          "description": "The range of the value allowed."
+        },
+        "maximum": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "deltaMin": {
+          "type": "string",
+          "format": "int64",
+          "description": "If set, the value is cumulative and the subsequent value is value + delta\nwhere delta is randomly chosen between delta_min and delta_max.  The range\nminimum and maximum are still respected and values will saturate at the\nboundaries if they are exceeded. If not set subsequent value is a value\nrandomly chosen between minimum and maximum."
+        },
+        "deltaMax": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "fakeUintValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "string",
+          "format": "uint64",
+          "description": "If distribution is UintRange, value is used as the initial value\ninside [minimum, maximum] and hold the value as it mutates.\nIf distribution is UintList, value is only used to hold the value as it\nmutates.\nIf no distribution is set, value is used as it mutates, i.e. constant\nupdate."
+        },
+        "range": {
+          "$ref": "#/definitions/fakeUintRange"
+        },
+        "list": {
+          "$ref": "#/definitions/fakeUintList"
+        }
+      }
+    },
+    "gnmiAlias": {
+      "type": "object",
+      "properties": {
+        "path": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "alias": {
+          "type": "string"
+        }
+      },
+      "title": "Alias specifies a data tree path, and an associated string which defines an\nalias which is to be used for this path in the context of the RPC. The alias\nis specified as a string which is prefixed with \"#\" to disambiguate it from\ndata tree element paths.\nReference: gNMI Specification Section 2.4.2"
+    },
+    "gnmiAliasList": {
+      "type": "object",
+      "properties": {
+        "alias": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiAlias"
+          }
+        }
+      },
+      "title": "AliasList specifies a list of aliases. It is used in a SubscribeRequest for\na client to create a set of aliases that the target is to utilize.\nReference: gNMI Specification Section 3.5.1.6"
+    },
+    "gnmiCapabilityResponse": {
+      "type": "object",
+      "properties": {
+        "supportedModels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiModelData"
+          }
+        },
+        "supportedEncodings": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiEncoding"
+          }
+        },
+        "gNMIVersion": {
+          "type": "string"
+        },
+        "extension": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmi_extExtension"
+          },
+          "description": "Extension messages associated with the CapabilityResponse. See the\ngNMI extension specification for further definition."
+        }
+      },
+      "title": "CapabilityResponse is used by the target to report its capabilities to the\nclient within the Capabilities RPC.\nReference: gNMI Specification Section 3.2.2"
+    },
+    "gnmiDecimal64": {
+      "type": "object",
+      "properties": {
+        "digits": {
+          "type": "string",
+          "format": "int64"
+        },
+        "precision": {
+          "type": "integer",
+          "format": "int64"
+        }
+      },
+      "description": "Decimal64 is used to encode a fixed precision decimal number. The value\nis expressed as a set of digits with the precision specifying the\nnumber of digits following the decimal point in the digit set."
+    },
+    "gnmiEncoding": {
+      "type": "string",
+      "enum": [
+        "JSON",
+        "BYTES",
+        "PROTO",
+        "ASCII",
+        "JSON_IETF"
+      ],
+      "default": "JSON",
+      "title": "Encoding defines the value encoding formats that are supported by the gNMI\nprotocol. These encodings are used by both the client (when sending Set\nmessages to modify the state of the target) and the target when serializing\ndata to be returned to the client (in both Subscribe and Get RPCs).\nReference: gNMI Specification Section 2.3"
+    },
+    "gnmiError": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "message": {
+          "type": "string"
+        },
+        "data": {
+          "$ref": "#/definitions/protobufAny"
+        }
+      },
+      "title": "Error message previously utilised to return errors to the client. Deprecated\nin favour of using the google.golang.org/genproto/googleapis/rpc/status\nmessage in the RPC response.\nReference: gNMI Specification Section 2.5"
+    },
+    "gnmiGetResponse": {
+      "type": "object",
+      "properties": {
+        "notification": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiNotification"
+          }
+        },
+        "error": {
+          "$ref": "#/definitions/gnmiError"
+        },
+        "extension": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmi_extExtension"
+          },
+          "description": "Extension messages associated with the GetResponse. See the\ngNMI extension specification for further definition."
+        }
+      },
+      "title": "GetResponse is used by the target to respond to a GetRequest from a client.\nThe set of Notifications corresponds to the data values that are requested\nby the client in the GetRequest.\nReference: gNMI Specification Section 3.3.2"
+    },
+    "gnmiModelData": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "organization": {
+          "type": "string"
+        },
+        "version": {
+          "type": "string"
+        }
+      },
+      "title": "ModelData is used to describe a set of schema modules. It can be used in a\nCapabilityResponse where a target reports the set of modules that it\nsupports, and within the SubscribeRequest and GetRequest messages to specify\nthe set of models from which data tree elements should be reported.\nReference: gNMI Specification Section 3.2.3"
+    },
+    "gnmiNil": {
+      "type": "object"
+    },
+    "gnmiNotification": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "prefix": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "alias": {
+          "type": "string",
+          "title": "An alias for the path specified in the prefix field.\nReference: gNMI Specification Section 2.4.2"
+        },
+        "update": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiUpdate"
+          }
+        },
+        "delete": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiPath"
+          }
+        },
+        "atomic": {
+          "type": "boolean",
+          "description": "This notification contains a set of paths that are always updated together\nreferenced by a globally unique prefix."
+        }
+      },
+      "title": "Notification is a re-usable message that is used to encode data from the\ntarget to the client. A Notification carries two types of changes to the data\ntree:\n - Deleted values (delete) - a set of paths that have been removed from the\n   data tree.\n - Updated values (update) - a set of path-value pairs indicating the path\n   whose value has changed in the data tree.\nReference: gNMI Specification Section 2.1"
+    },
+    "gnmiPath": {
+      "type": "object",
+      "properties": {
+        "element": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Elements of the path are no longer encoded as a string, but rather within\nthe elem field as a PathElem message."
+        },
+        "origin": {
+          "type": "string"
+        },
+        "elem": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiPathElem"
+          }
+        },
+        "target": {
+          "type": "string"
+        }
+      },
+      "description": "Path encodes a data tree path as a series of repeated strings, with\neach element of the path representing a data tree node name and the\nassociated attributes.\nReference: gNMI Specification Section 2.2.2."
+    },
+    "gnmiPathElem": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "key": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        }
+      },
+      "description": "PathElem encodes an element of a gNMI path, along with any attributes (keys)\nthat may be associated with it.\nReference: gNMI Specification Section 2.2.2."
+    },
+    "gnmiPoll": {
+      "type": "object",
+      "title": "Poll is sent within a SubscribeRequest to trigger the device to\nsend telemetry updates for the paths that are associated with the\nsubscription.\nReference: gNMI Specification Section Section 3.5.1.4"
+    },
+    "gnmiQOSMarking": {
+      "type": "object",
+      "properties": {
+        "marking": {
+          "type": "integer",
+          "format": "int64"
+        }
+      },
+      "title": "QOSMarking specifies the DSCP value to be set on transmitted telemetry\nupdates from the target.\nReference: gNMI Specification Section 3.5.1.2"
+    },
+    "gnmiScalarArray": {
+      "type": "object",
+      "properties": {
+        "element": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiTypedValue"
+          },
+          "description": "The set of elements within the array. Each TypedValue message should\nspecify only elements that have a field identifier of 1-7 (i.e., the\nvalues are scalar values)."
+        }
+      },
+      "description": "ScalarArray is used to encode a mixed-type array of values."
+    },
+    "gnmiSetResponse": {
+      "type": "object",
+      "properties": {
+        "prefix": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "response": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiUpdateResult"
+          },
+          "description": "A set of responses specifying the result of the operations specified in\nthe SetRequest."
+        },
+        "message": {
+          "$ref": "#/definitions/gnmiError"
+        },
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "extension": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmi_extExtension"
+          },
+          "description": "Extension messages associated with the SetResponse. See the\ngNMI extension specification for further definition."
+        }
+      },
+      "title": "SetResponse is the response to a SetRequest, sent from the target to the\nclient. It reports the result of the modifications to the data tree that were\nspecified by the client. Errors for this RPC should be reported using the\nhttps://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto\nmessage in the RPC return. The gnmi.Error message can be used to add additional\ndetails where required.\nReference: gNMI Specification Section 3.4.2"
+    },
+    "gnmiSubscribeResponse": {
+      "type": "object",
+      "properties": {
+        "update": {
+          "$ref": "#/definitions/gnmiNotification"
+        },
+        "syncResponse": {
+          "type": "boolean",
+          "description": "Indicate target has sent all values associated with the subscription\nat least once."
+        },
+        "error": {
+          "$ref": "#/definitions/gnmiError",
+          "title": "Deprecated in favour of google.golang.org/genproto/googleapis/rpc/status"
+        },
+        "extension": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmi_extExtension"
+          },
+          "description": "Extension messages associated with the SubscribeResponse. See the\ngNMI extension specification for further definition."
+        }
+      },
+      "title": "SubscribeResponse is the message used by the target within a Subscribe RPC.\nThe target includes a Notification message which is used to transmit values\nof the path(s) that are associated with the subscription. The same message\nis to indicate that the target has sent all data values once (is\nsynchronized).\nReference: gNMI Specification Section 3.5.1.4"
+    },
+    "gnmiSubscription": {
+      "type": "object",
+      "properties": {
+        "path": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "mode": {
+          "$ref": "#/definitions/gnmiSubscriptionMode"
+        },
+        "sampleInterval": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "suppressRedundant": {
+          "type": "boolean",
+          "description": "Indicates whether values that have not changed should be sent in a SAMPLE\nsubscription."
+        },
+        "heartbeatInterval": {
+          "type": "string",
+          "format": "uint64",
+          "description": "Specifies the maximum allowable silent period in nanoseconds when\nsuppress_redundant is in use. The target should send a value at least once\nin the period specified."
+        }
+      },
+      "title": "Subscription is a single request within a SubscriptionList. The path\nspecified is interpreted (along with the prefix) as the elements of the data\ntree that the client is subscribing to. The mode determines how the target\nshould trigger updates to be sent.\nReference: gNMI Specification Section 3.5.1.3"
+    },
+    "gnmiSubscriptionList": {
+      "type": "object",
+      "properties": {
+        "prefix": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "subscription": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiSubscription"
+          }
+        },
+        "useAliases": {
+          "type": "boolean",
+          "description": "Whether target defined aliases are allowed within the subscription."
+        },
+        "qos": {
+          "$ref": "#/definitions/gnmiQOSMarking"
+        },
+        "mode": {
+          "$ref": "#/definitions/SubscriptionListMode"
+        },
+        "allowAggregation": {
+          "type": "boolean",
+          "description": "Whether elements of the schema that are marked as eligible for aggregation\nshould be aggregated or not."
+        },
+        "useModels": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiModelData"
+          },
+          "description": "The set of schemas that define the elements of the data tree that should\nbe sent by the target."
+        },
+        "encoding": {
+          "$ref": "#/definitions/gnmiEncoding",
+          "description": "The encoding that the target should use within the Notifications generated\ncorresponding to the SubscriptionList."
+        },
+        "updatesOnly": {
+          "type": "boolean",
+          "description": "An optional field to specify that only updates to current state should be\nsent to a client. If set, the initial state is not sent to the client but\nrather only the sync message followed by any subsequent updates to the\ncurrent state. For ONCE and POLL modes, this causes the server to send only\nthe sync message (Sec. 3.5.2.3)."
+        }
+      },
+      "title": "SubscriptionList is used within a Subscribe message to specify the list of\npaths that the client wishes to subscribe to. The message consists of a\nlist of (possibly prefixed) paths, and options that relate to the\nsubscription.\nReference: gNMI Specification Section 3.5.1.2"
+    },
+    "gnmiSubscriptionMode": {
+      "type": "string",
+      "enum": [
+        "TARGET_DEFINED",
+        "ON_CHANGE",
+        "SAMPLE"
+      ],
+      "default": "TARGET_DEFINED",
+      "title": "SubscriptionMode is the mode of the subscription, specifying how the\ntarget must return values in a subscription.\nReference: gNMI Specification Section 3.5.1.3"
+    },
+    "gnmiTypedValue": {
+      "type": "object",
+      "properties": {
+        "stringVal": {
+          "type": "string"
+        },
+        "intVal": {
+          "type": "string",
+          "format": "int64"
+        },
+        "uintVal": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "boolVal": {
+          "type": "boolean"
+        },
+        "bytesVal": {
+          "type": "string",
+          "format": "byte"
+        },
+        "floatVal": {
+          "type": "number",
+          "format": "float"
+        },
+        "decimalVal": {
+          "$ref": "#/definitions/gnmiDecimal64"
+        },
+        "leaflistVal": {
+          "$ref": "#/definitions/gnmiScalarArray"
+        },
+        "anyVal": {
+          "$ref": "#/definitions/protobufAny"
+        },
+        "jsonVal": {
+          "type": "string",
+          "format": "byte"
+        },
+        "jsonIetfVal": {
+          "type": "string",
+          "format": "byte"
+        },
+        "asciiVal": {
+          "type": "string"
+        },
+        "protoBytes": {
+          "type": "string",
+          "format": "byte",
+          "description": "Protobuf binary encoded bytes. The message type is not included.\nSee the specification at\ngithub.com/openconfig/reference/blob/master/rpc/gnmi/protobuf-vals.md\nfor a complete specification."
+        }
+      },
+      "description": "TypedValue is used to encode a value being sent between the client and\ntarget (originated by either entity)."
+    },
+    "gnmiUpdate": {
+      "type": "object",
+      "properties": {
+        "path": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "value": {
+          "$ref": "#/definitions/gnmiValue"
+        },
+        "val": {
+          "$ref": "#/definitions/gnmiTypedValue"
+        },
+        "duplicates": {
+          "type": "integer",
+          "format": "int64"
+        }
+      },
+      "title": "Update is a re-usable message that is used to store a particular Path,\nValue pair.\nReference: gNMI Specification Section 2.1"
+    },
+    "gnmiUpdateResult": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64",
+          "description": "Deprecated timestamp for the UpdateResult, this field has been\nreplaced by the timestamp within the SetResponse message, since\nall mutations effected by a set should be applied as a single\ntransaction."
+        },
+        "path": {
+          "$ref": "#/definitions/gnmiPath"
+        },
+        "message": {
+          "$ref": "#/definitions/gnmiError"
+        },
+        "op": {
+          "$ref": "#/definitions/gnmiUpdateResultOperation"
+        }
+      },
+      "title": "UpdateResult is used within the SetResponse message to communicate the\nresult of an operation specified within a SetRequest message.\nReference: gNMI Specification Section 3.4.2"
+    },
+    "gnmiUpdateResultOperation": {
+      "type": "string",
+      "enum": [
+        "INVALID",
+        "DELETE",
+        "REPLACE",
+        "UPDATE"
+      ],
+      "default": "INVALID",
+      "description": "The operation that was associated with the Path specified."
+    },
+    "gnmiValue": {
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "string",
+          "format": "byte"
+        },
+        "type": {
+          "$ref": "#/definitions/gnmiEncoding"
+        }
+      },
+      "description": "Value encodes a data tree node's value - along with the way in which\nthe value is encoded. This message is deprecated by gNMI 0.3.0.\nReference: gNMI Specification Section 2.2.3."
+    },
+    "gnmi_extExtension": {
+      "type": "object",
+      "properties": {
+        "registeredExt": {
+          "$ref": "#/definitions/gnmi_extRegisteredExtension"
+        },
+        "masterArbitration": {
+          "$ref": "#/definitions/gnmi_extMasterArbitration",
+          "description": "Well known extensions."
+        },
+        "history": {
+          "$ref": "#/definitions/gnmi_extHistory"
+        }
+      },
+      "description": "The Extension message contains a single gNMI extension."
+    },
+    "gnmi_extExtensionID": {
+      "type": "string",
+      "enum": [
+        "EID_UNSET",
+        "EID_EXPERIMENTAL"
+      ],
+      "default": "EID_UNSET",
+      "description": "RegisteredExtension is an enumeration acting as a registry for extensions\ndefined by external sources.\n\n - EID_EXPERIMENTAL: An experimental extension that may be used during prototyping of a new\nextension."
+    },
+    "gnmi_extHistory": {
+      "type": "object",
+      "properties": {
+        "snapshotTime": {
+          "type": "string",
+          "format": "int64"
+        },
+        "range": {
+          "$ref": "#/definitions/gnmi_extTimeRange"
+        }
+      },
+      "title": "The History extension allows clients to request historical data. Its\nspec can be found at\nhttps://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md"
+    },
+    "gnmi_extMasterArbitration": {
+      "type": "object",
+      "properties": {
+        "role": {
+          "$ref": "#/definitions/gnmi_extRole"
+        },
+        "electionId": {
+          "$ref": "#/definitions/gnmi_extUint128"
+        }
+      },
+      "title": "MasterArbitration is used to select the master among multiple gNMI clients\nwith the same Roles. The client with the largest election_id is honored as\nthe master.\nThe document about gNMI master arbitration can be found at\nhttps://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-master-arbitration.md"
+    },
+    "gnmi_extRegisteredExtension": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "$ref": "#/definitions/gnmi_extExtensionID"
+        },
+        "msg": {
+          "type": "string",
+          "format": "byte"
+        }
+      },
+      "description": "The RegisteredExtension message defines an extension which is defined outside\nof this file."
+    },
+    "gnmi_extRole": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        }
+      },
+      "description": "There can be one master for each role. The role is identified by its id."
+    },
+    "gnmi_extTimeRange": {
+      "type": "object",
+      "properties": {
+        "start": {
+          "type": "string",
+          "format": "int64"
+        },
+        "end": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "gnmi_extUint128": {
+      "type": "object",
+      "properties": {
+        "high": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "low": {
+          "type": "string",
+          "format": "uint64"
+        }
+      },
+      "description": "Representation of unsigned 128-bit integer."
+    },
+    "gnmifakeCredentials": {
+      "type": "object",
+      "properties": {
+        "username": {
+          "type": "string"
+        },
+        "password": {
+          "type": "string"
+        }
+      }
+    },
+    "gnmifakeValue": {
+      "type": "object",
+      "properties": {
+        "path": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "The device specific, or OpenConfig path corresponding to a value."
+        },
+        "timestamp": {
+          "$ref": "#/definitions/fakeTimestamp",
+          "description": "The initial timestamp and configuration on how the timestamp will change\nfor subsequent values. If timestamp is not set the default will assume to\nbe the current system time."
+        },
+        "repeat": {
+          "type": "integer",
+          "format": "int32",
+          "description": "If set, repeat indicates that the value should be repeated this many times,\notherwise it is repeated indefinitely."
+        },
+        "seed": {
+          "type": "string",
+          "format": "int64",
+          "description": "A local random seed used in generating subsequent values for this path. If\nnot set, will share the global random source with seed defined in Config."
+        },
+        "intValue": {
+          "$ref": "#/definitions/fakeIntValue"
+        },
+        "doubleValue": {
+          "$ref": "#/definitions/fakeDoubleValue"
+        },
+        "stringValue": {
+          "$ref": "#/definitions/fakeStringValue"
+        },
+        "sync": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "delete": {
+          "$ref": "#/definitions/fakeDeleteValue"
+        },
+        "boolValue": {
+          "$ref": "#/definitions/fakeBoolValue"
+        },
+        "uintValue": {
+          "$ref": "#/definitions/fakeUintValue"
+        },
+        "stringListValue": {
+          "$ref": "#/definitions/fakeStringListValue"
+        }
+      },
+      "description": "Value is the main message that will trigger a stream of updates for a given\npath.  A file containing a list of values can be used to simulate a network\ndevice for integration tests."
+    },
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "gosdncoreStatus": {
+      "type": "string",
+      "enum": [
+        "STATUS_UNSPECIFIED",
+        "STATUS_OK",
+        "STATUS_ERROR"
+      ],
+      "default": "STATUS_UNSPECIFIED"
+    },
+    "gosdncsbiGetResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "deployments": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/csbiDeployment"
+          }
+        }
+      }
+    },
+    "gosdncsbiState": {
+      "type": "string",
+      "enum": [
+        "STATE_UNSPECIFIED",
+        "STATE_ANNOUNCED",
+        "STATE_BUILT",
+        "STATE_DEPLOYED",
+        "STATE_RUNNING",
+        "STATE_DECOMMISSIONED"
+      ],
+      "default": "STATE_UNSPECIFIED"
+    },
+    "gosdnpndOperation": {
+      "type": "string",
+      "enum": [
+        "OPERATION_UNSPECIFIED",
+        "OPERATION_CREATE",
+        "OPERATION_COMMIT",
+        "OPERATION_CONFIRM"
+      ],
+      "default": "OPERATION_UNSPECIFIED"
+    },
+    "gosdnpndSetResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        }
+      }
+    },
+    "gosdnpndStatus": {
+      "type": "string",
+      "enum": [
+        "STATUS_UNSPECIFIED",
+        "STATUS_OK",
+        "STATUS_ERROR"
+      ],
+      "default": "STATUS_UNSPECIFIED"
+    },
+    "gosdnsouthboundType": {
+      "type": "string",
+      "enum": [
+        "TYPE_UNSPECIFIED",
+        "TYPE_OPENCONFIG",
+        "TYPE_CONTAINERISED",
+        "TYPE_PLUGIN"
+      ],
+      "default": "TYPE_UNSPECIFIED",
+      "title": "Changed accoprding to style guide: \r\nhttps://docs.buf.build/best-practices/style-guide#enums"
+    },
+    "pndApiOperation": {
+      "type": "string",
+      "enum": [
+        "API_OPERATION_UNSPECIFIED",
+        "API_OPERATION_UPDATE",
+        "API_OPERATION_REPLACE",
+        "API_OPERATION_DELETE"
+      ],
+      "default": "API_OPERATION_UNSPECIFIED"
+    },
+    "pndChange": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "age": {
+          "type": "string",
+          "format": "int64"
+        },
+        "state": {
+          "$ref": "#/definitions/pndChangeState"
+        }
+      }
+    },
+    "pndChangeRequest": {
+      "type": "object",
+      "properties": {
+        "did": {
+          "type": "string"
+        },
+        "path": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string"
+        },
+        "apiOp": {
+          "$ref": "#/definitions/pndApiOperation"
+        }
+      },
+      "title": "TODO: rename"
+    },
+    "pndChangeState": {
+      "type": "string",
+      "enum": [
+        "CHANGE_STATE_UNSPECIFIED",
+        "CHANGE_STATE_PENDING",
+        "CHANGE_STATE_COMMITTED",
+        "CHANGE_STATE_CONFIRMED",
+        "CHANGE_STATE_INCONSISTENT"
+      ],
+      "default": "CHANGE_STATE_UNSPECIFIED"
+    },
+    "pndDeleteOndResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        }
+      }
+    },
+    "pndGetChangeListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "change": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndChange"
+          }
+        }
+      }
+    },
+    "pndGetChangeResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "change": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndChange"
+          }
+        }
+      }
+    },
+    "pndGetOndListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "ond": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndOrchestratedNetworkingDevice"
+          }
+        }
+      }
+    },
+    "pndGetOndResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "ond": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/pndOrchestratedNetworkingDevice"
+          }
+        }
+      }
+    },
+    "pndGetPathResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "device": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiNotification"
+          }
+        }
+      }
+    },
+    "pndGetSbiListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "sbi": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/southboundSouthboundInterface"
+          }
+        }
+      }
+    },
+    "pndGetSbiResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "pnd": {
+          "$ref": "#/definitions/pndPrincipalNetworkDomain",
+          "description": "TODO: Check if this is really needed. Perhaps a reference to the PND's ID\nis also sufficient."
+        },
+        "sbi": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/southboundSouthboundInterface"
+          }
+        }
+      }
+    },
+    "pndOrchestratedNetworkingDevice": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "device": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gnmiNotification"
+          }
+        },
+        "sbi": {
+          "$ref": "#/definitions/southboundSouthboundInterface"
+        }
+      }
+    },
+    "pndPrincipalNetworkDomain": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        }
+      }
+    },
+    "pndSbiType": {
+      "type": "string",
+      "enum": [
+        "SBI_TYPE_UNSPECIFIED",
+        "SBI_TYPE_OPENCONFIG",
+        "SBI_TYPE_CONTAINERISED",
+        "SBI_TYPE_PLUGIN"
+      ],
+      "default": "SBI_TYPE_UNSPECIFIED"
+    },
+    "pndSetChange": {
+      "type": "object",
+      "properties": {
+        "cuid": {
+          "type": "string"
+        },
+        "op": {
+          "$ref": "#/definitions/gosdnpndOperation"
+        }
+      }
+    },
+    "pndSetChangeListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        },
+        "responses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gosdnpndSetResponse"
+          }
+        }
+      }
+    },
+    "pndSetOnd": {
+      "type": "object",
+      "properties": {
+        "address": {
+          "type": "string"
+        },
+        "sbi": {
+          "$ref": "#/definitions/southboundSouthboundInterface"
+        },
+        "deviceName": {
+          "type": "string"
+        },
+        "transportOption": {
+          "$ref": "#/definitions/transportTransportOption"
+        }
+      }
+    },
+    "pndSetOndListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        },
+        "responses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gosdnpndSetResponse"
+          }
+        }
+      }
+    },
+    "pndSetPathListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        },
+        "responses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gosdnpndSetResponse"
+          }
+        }
+      }
+    },
+    "pndSetSbi": {
+      "type": "object",
+      "properties": {
+        "sbiType": {
+          "$ref": "#/definitions/pndSbiType"
+        }
+      }
+    },
+    "pndSetSbiListResponse": {
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/gosdnpndStatus"
+        },
+        "responses": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/gosdnpndSetResponse"
+          }
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "@type": {
+          "type": "string",
+          "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n  URL, or have them precompiled into a binary to avoid any\n  lookup. Therefore, binary compatibility needs to be preserved\n  on changes to types. (Use versioned type names to manage\n  breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
+        }
+      },
+      "additionalProperties": {},
+      "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n    Foo foo = ...;\n    Any any;\n    any.PackFrom(foo);\n    ...\n    if (any.UnpackTo(\u0026foo)) {\n      ...\n    }\n\nExample 2: Pack and unpack a message in Java.\n\n    Foo foo = ...;\n    Any any = Any.pack(foo);\n    ...\n    if (any.is(Foo.class)) {\n      foo = any.unpack(Foo.class);\n    }\n\n Example 3: Pack and unpack a message in Python.\n\n    foo = Foo(...)\n    any = Any()\n    any.Pack(foo)\n    ...\n    if any.Is(Foo.DESCRIPTOR):\n      any.Unpack(foo)\n      ...\n\n Example 4: Pack and unpack a message in Go\n\n     foo := \u0026pb.Foo{...}\n     any, err := anypb.New(foo)\n     if err != nil {\n       ...\n     }\n     ...\n     foo := \u0026pb.Foo{}\n     if err := any.UnmarshalTo(foo); err != nil {\n       ...\n     }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n    package google.profile;\n    message Person {\n      string first_name = 1;\n      string last_name = 2;\n    }\n\n    {\n      \"@type\": \"type.googleapis.com/google.profile.Person\",\n      \"firstName\": \u003cstring\u003e,\n      \"lastName\": \u003cstring\u003e\n    }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n    {\n      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n      \"value\": \"1.212s\"\n    }"
+    },
+    "southboundSouthboundInterface": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "type": {
+          "$ref": "#/definitions/gosdnsouthboundType"
+        }
+      }
+    },
+    "transportGnmiTransportOption": {
+      "type": "object",
+      "properties": {
+        "compression": {
+          "type": "string"
+        },
+        "grpcDialOptions": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "token": {
+          "type": "string"
+        },
+        "encoding": {
+          "$ref": "#/definitions/gnmiEncoding"
+        }
+      }
+    },
+    "transportRestconfTransportOption": {
+      "type": "object"
+    },
+    "transportTransportOption": {
+      "type": "object",
+      "properties": {
+        "address": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        },
+        "password": {
+          "type": "string"
+        },
+        "tls": {
+          "type": "boolean"
+        },
+        "gnmiTransportOption": {
+          "$ref": "#/definitions/transportGnmiTransportOption"
+        },
+        "restconfTransportOption": {
+          "$ref": "#/definitions/transportRestconfTransportOption"
+        },
+        "type": {
+          "$ref": "#/definitions/gosdnsouthboundType"
+        }
+      }
+    }
+  }
+}
diff --git a/proto/buf.yaml b/proto/buf.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5040f7d87feb52a90a4c32fa02facc17f3155f14
--- /dev/null
+++ b/proto/buf.yaml
@@ -0,0 +1,10 @@
+version: v1
+deps:
+  - buf.build/googleapis/googleapis
+  - buf.build/grpc-ecosystem/grpc-gateway
+lint:
+  use:
+    - DEFAULT
+breaking:
+  use:
+    - FILE
diff --git a/proto/gosdn/core/core.proto b/proto/gosdn/core/core.proto
index 91407d1fa8d9aa4a1f898ae7f8eb6018434afc00..b5ad8c013a4170cd660d6498ec2d8547e4b0d249 100644
--- a/proto/gosdn/core/core.proto
+++ b/proto/gosdn/core/core.proto
@@ -2,40 +2,86 @@ syntax = "proto3";
 
 package gosdn.core;
 
+import "google/api/annotations.proto";
 import "gosdn/pnd/pnd.proto";
 
 option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/core";
 
-service core {
-  rpc Get(GetRequest) returns (GetResponse);
-  rpc Set(SetRequest) returns (SetResponse);
+service CoreService {
+  // Allows to request a specific Principal Network Domain.
+  rpc GetPnd(GetPndRequest) returns (GetPndResponse) {
+    option (google.api.http) = {
+      get: "/pnd/{pid}"
+    };
+  }
+  // Allows to request all Principal Network Domains.
+  rpc GetPndList(GetPndListRequest) returns (GetPndListResponse) {
+    option (google.api.http) = {
+      get: "/pnds"
+    };
+  }
+  // Allows create a Principal Network Domain.
+  rpc CreatePndList(CreatePndListRequest) returns (CreatePndListResponse) {
+    option (google.api.http) = {
+      post: "/pnds"
+      body: "*"
+    };
+  }
+  // Allows to delete a specific Principal Network Domain.
+  rpc DeletePnd(DeletePndRequest) returns (DeletePndResponse) {
+    option (google.api.http) = {
+      delete: "/pnds/{pid}"
+    };
+  }
 }
 
-message GetRequest {
+message GetPndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+}
+
+message GetPndRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  bool all = 2;
   repeated string pid = 3;
 }
-message GetResponse {
+
+message GetPndListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated .gosdn.pnd.PrincipalNetworkDomain pnd = 2;
+}
+
+message GetPndResponse {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
   repeated .gosdn.pnd.PrincipalNetworkDomain pnd = 2;
 }
-message SetRequest {
+
+message CreatePndListRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  repeated setPnd pnd = 2;
+  repeated PndCreateProperties pnd = 2;
 }
 
-message setPnd {
+message PndCreateProperties {
   string name = 1;
   string description = 2;
   string sbi = 3;
 }
 
-message SetResponse {
+message CreatePndListResponse {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  enum status {
-    OK = 0;
-    ERROR = 1;
-  }
-  status Status = 2;
+  Status status = 2;
+}
+
+message DeletePndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+
+message DeletePndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+}
+
+enum Status {
+  STATUS_UNSPECIFIED = 0;
+  STATUS_OK = 1;
+  STATUS_ERROR = 2;
 }
diff --git a/proto/gosdn/csbi/csbi.proto b/proto/gosdn/csbi/csbi.proto
index e8273bac96f0414b30ac167b31eb81b1e8179426..633115be837f9d33478b5eac45ebce03afbbd639 100644
--- a/proto/gosdn/csbi/csbi.proto
+++ b/proto/gosdn/csbi/csbi.proto
@@ -6,12 +6,12 @@ import "gosdn/transport/transport.proto";
 
 option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/csbi";
 
-service csbi {
+service CsbiService {
   rpc Get(GetRequest) returns (GetResponse);
   rpc Create(CreateRequest) returns (CreateResponse);
   rpc Delete(DeleteRequest) returns (DeleteResponse);
   rpc Hello(Syn) returns (Ack);
-  rpc CreatePlugin(CreateRequest) returns (stream Payload);
+  rpc CreatePlugin(CreatePluginRequest) returns (stream Payload);
 }
 
 message Syn {
@@ -22,7 +22,7 @@ message Syn {
 
 message Ack {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  .gosdn.transport.TransportOption TransportOption = 2;
+  .gosdn.transport.TransportOption transport_option = 2;
 }
 
 message GetRequest {
@@ -43,16 +43,22 @@ message Deployment {
 }
 
 enum State {
-  ANNOUNCED = 0;
-  BUILT = 1;
-  DEPLOYED = 2;
-  RUNNING = 3;
-  DECOMMISSIONED = 4;
+  STATE_UNSPECIFIED = 0;
+  STATE_ANNOUNCED = 1;
+  STATE_BUILT = 2;
+  STATE_DEPLOYED = 3;
+  STATE_RUNNING = 4;
+  STATE_DECOMMISSIONED = 5;
 }
 
 message CreateRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  repeated .gosdn.transport.TransportOption TransportOption = 2;
+  repeated .gosdn.transport.TransportOption transport_option = 2;
+}
+
+message CreatePluginRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated .gosdn.transport.TransportOption transport_option = 2;
 }
 
 message CreateResponse {
@@ -61,7 +67,7 @@ message CreateResponse {
 }
 
 message Payload {
-  bytes Chunk = 1;
+  bytes chunk = 1;
 }
 
 message DeleteRequest {
@@ -71,9 +77,10 @@ message DeleteRequest {
 
 message DeleteResponse {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  enum status {
-    OK = 0;
-    ERROR = 1;
+  enum Status {
+    STATUS_UNSPECIFIED = 0;
+    STATUS_OK = 1;
+    STATUS_ERROR = 2;
   }
-  status Status = 2;
+  Status status = 2;
 }
diff --git a/proto/gosdn/pnd/pnd.proto b/proto/gosdn/pnd/pnd.proto
index 8ec81ec77bd5ea04b649a905ea889d046aa1cf64..2835bbbdf1f71368bd7217879a214864d09d753f 100644
--- a/proto/gosdn/pnd/pnd.proto
+++ b/proto/gosdn/pnd/pnd.proto
@@ -2,68 +2,220 @@ syntax = "proto3";
 
 package gosdn.pnd;
 
+import "google/api/annotations.proto";
+//import "protoc-gen-openapiv2/options/annotations.proto";
 import "google/protobuf/descriptor.proto";
 import "github.com/openconfig/gnmi/proto/gnmi/gnmi.proto";
 import "gosdn/transport/transport.proto";
 import "gosdn/southbound/southbound.proto";
+import "protoc-gen-openapiv2/options/annotations.proto";
 
 option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/pnd";
 
-service pnd {
-  rpc Get(GetRequest) returns (GetResponse);
-  rpc Set(SetRequest) returns (SetResponse);
-  rpc Delete(DeleteRequest) returns (DeleteResponse);
+option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
+	info: {
+		title: "goSDN Northbound";
+    description: "Protocol Buffer specifications and Go code for the goSDN northbound Interface"
+		version: "0.1";
+		contact: {
+			name: "goSDN Northbound project";
+			url: "https://code.fbi.h-da.de/danet/api";
+			//email: "none@example.com";
+		};
+		license: {
+			name: "BSD 3-Clause License";
+			url: "https://code.fbi.h-da.de/danet/api/-/blob/master/LICENSE";
+		};
+  };
+};
+
+service PndService {
+  // Allows to request all Orchestrated Networking Devices which are managed by a
+  // specific Principal Network Domain.
+  rpc GetOndList(GetOndListRequest) returns (GetOndListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/onds"
+    };
+  }
+  // Allows to request a specific Orchestrated Networking Device which is managed by a
+  // specific Principal Network Domain.
+  rpc GetOnd(GetOndRequest) returns (GetOndResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/ond/{did}"
+    };
+  }
+  // Allows add multiple Orchestrated Networking Devices to be managed by a
+  // specific Principal Network Domain.
+  rpc SetOndList(SetOndListRequest) returns (SetOndListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/onds"
+      body: "*"
+    };
+  }
+  // Allows to request all Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc GetSbiList(GetSbiListRequest) returns (GetSbiListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/sbis"
+    };
+  }
+  // Allows to request a specific Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc GetSbi(GetSbiRequest) returns (GetSbiResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/sbis/{sid}"
+    };
+  }
+  // Allows to add multiple specific Southbound Interfaces a specific Principal Network
+  // Domain supports.
+  rpc SetSbiList(SetSbiListRequest) returns (SetSbiListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/sbis"
+      body: "*"
+    };
+  }
+  // Allows to request all Changes registered for a specific Principal Network Domain.
+  rpc GetChangeList(GetChangeListRequest) returns (GetChangeListResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/changes"
+    };
+  }
+  // Allows to request a specific Change registered for a specific Principal Network Domain.
+  rpc GetChange(GetChangeRequest) returns (GetChangeResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/changes/{cuid}"
+    };
+  }
+  // Allows to operate on multiple Changes registered for a specific Principal Network Domain.
+  rpc SetChangeList(SetChangeListRequest) returns (SetChangeListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/changes"
+      body: "*"
+    };
+  }
+  // Allows to request a specific Path of a Orchestrated Networking Device,
+  // managed by a specific Principal Network Domain.
+  rpc GetPath(GetPathRequest) returns (GetPathResponse) {
+    option (google.api.http) = {
+      get: "/pnds/{pid}/onds/{did}/paths/{path}"
+    };
+  }
+  // Allows to set a specific Path of a Orchestrated Networking Device,
+  // managed by a specific Principal Network Domain.
+  rpc SetPathList(SetPathListRequest) returns (SetPathListResponse) {
+    option (google.api.http) = {
+      post: "/pnds/{pid}/onds/paths"
+      body: "*"
+    };
+  }
+  // Allows to delete a specific Orchestrated Networking Device which is managed by a
+  // specific Principal Network Domain.
+  rpc DeleteOnd(DeleteOndRequest) returns (DeleteOndResponse) {
+    option (google.api.http) = {
+      delete: "/pnds/{pid}/onds/{did}"
+    };
+  }
 }
 
-message GetRequest {
+message GetOndListRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  oneof request {
-    getPnd pnd = 2;
-    getOnd ond = 3;
-    getSbi sbi = 4;
-    getChange change = 5;
-    getPath path = 7;
-  }
-  string pid = 6;
+  string pid = 4;
+}
+
+message GetOndRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string did = 3;
+  string pid = 4;
+}
+
+message GetSbiListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
+message GetSbiRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated string sid = 3;
+  string pid = 4;
 }
 
-message getPnd {}
+message GetChangeListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string pid = 4;
+}
 
-message getOnd {
-  bool all = 1;
-  repeated string did = 2;
+message GetChangeRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string cuid = 3;
+  string pid = 4;
 }
 
-message getSbi {
-  bool all = 1;
-  repeated string sid = 2;
+message GetPathRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  string did = 2;
+  string path = 3;
+  string pid = 4;
 }
 
-message getChange {
-  bool all = 1;
-  repeated string cuid = 2;
+message GetOndResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated OrchestratedNetworkingDevice ond = 3;
 }
 
-message getPath {
-  string did = 1;
-  string path = 2;
+message GetOndListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated OrchestratedNetworkingDevice ond = 3;
+}
+
+message GetSbiResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated .gosdn.southbound.SouthboundInterface sbi = 3;
+}
+
+message GetSbiListResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated .gosdn.southbound.SouthboundInterface sbi = 3;
+}
+
+message GetPathResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated gnmi.Notification device = 3;
+}
+
+message GetChangeResponse {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated Change change = 3;
 }
 
-message GetResponse {
+message GetChangeListResponse {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-    PrincipalNetworkDomain pnd = 2;
-    repeated OrchestratedNetworkingDevice ond = 3;
-    repeated .gosdn.southbound.SouthboundInterface sbi = 5;
-    repeated Change change = 7;
+  // TODO: Check if this is really needed. Perhaps a reference to the PND's ID
+  // is also sufficient.
+  PrincipalNetworkDomain pnd = 2;
+  repeated Change change = 3;
 }
 
 message PrincipalNetworkDomain {
   string id = 1;
   string name = 2;
   string description = 3;
-  repeated OrchestratedNetworkingDevice ond = 4;
-  repeated .gosdn.southbound.SouthboundInterface sbi = 5;
-  repeated Change change = 6;
 }
 
 message OrchestratedNetworkingDevice {
@@ -73,88 +225,137 @@ message OrchestratedNetworkingDevice {
   .gosdn.southbound.SouthboundInterface sbi = 4;
 }
 
+enum ChangeState {
+  CHANGE_STATE_UNSPECIFIED = 0;
+  CHANGE_STATE_PENDING = 1;
+  CHANGE_STATE_COMMITTED = 2;
+  CHANGE_STATE_CONFIRMED = 3;
+  CHANGE_STATE_INCONSISTENT = 4;
+}
+
 message Change {
   string id = 1;
   int64 age = 2;
-  enum State {
-    PENDING = 0;
-    COMMITTED = 1;
-    CONFIRMED = 2;
-    INCONSISTENT = 3;
-  }
-  State state = 3;
+
+  ChangeState state = 3;
+}
+
+message SetOndListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetOnd ond = 2;
+  string pid = 3;
+}
+
+message SetSbiListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetSbi sbi = 2;
+  string pid = 3;
+}
+
+message SetChangeListRequest {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  repeated SetChange change = 2;
+  string pid = 3;
 }
 
-message SetRequest {
+message SetPathListRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  repeated setOnd ond = 2;
-  repeated setSbi sbi = 3;
-  repeated setChange change = 4;
-  repeated ChangeRequest changeRequest = 5;
-  string pid = 6;
+  repeated ChangeRequest change_request = 2;
+  string pid = 3;
 }
 
-message setOnd {
+//TODO: rename
+message ChangeRequest {
+  string did = 1;
+  string path = 2;
+  string value = 3;
+  ApiOperation api_op = 4;
+}
+
+enum ApiOperation {
+  API_OPERATION_UNSPECIFIED = 0;
+  API_OPERATION_UPDATE = 1;
+  API_OPERATION_REPLACE = 2;
+  API_OPERATION_DELETE = 3;
+}
+
+message SetOnd {
   string address = 1;
   .gosdn.southbound.SouthboundInterface sbi = 2;
-  string deviceName = 3;
-  .gosdn.transport.TransportOption transportOption = 4;
+  string device_name = 3;
+  .gosdn.transport.TransportOption transport_option = 4;
 }
 
-message setSbi {
+message SetSbi {
+  SbiType sbi_type = 1;
+}
 
+enum SbiType {
+  SBI_TYPE_UNSPECIFIED = 0;
+  SBI_TYPE_OPENCONFIG = 1;
+  SBI_TYPE_CONTAINERISED = 2;
+  SBI_TYPE_PLUGIN = 3;
 }
 
-message setChange {
-  enum Operation {
-    CREATE = 0;
-    COMMIT = 1;
-    CONFIRM = 2;
-  }
+enum Operation {
+  OPERATION_UNSPECIFIED = 0;
+  OPERATION_CREATE = 1;
+  OPERATION_COMMIT = 2;
+  OPERATION_CONFIRM = 3;
+}
+
+message SetChange {
   string cuid = 1;
   Operation op = 2;
 }
 
 message SetResponse{
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  enum status {
-    OK = 0;
-    ERROR = 1;
-  }
-  status Status = 2;
+  Status status = 2;
+}
+
+message SetOndListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
   repeated SetResponse responses = 3;
 }
 
-message ChangeRequest {
-  string id = 1;
-  string path = 2;
-  string value = 3;
-  ApiOperation apiOp = 4;
+message SetChangeListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
 }
 
-enum ApiOperation {
-  UPDATE = 0;
-  REPLACE = 1;
-  DELETE = 2;
+message SetChangeResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
 }
 
-message DeleteRequest {
-  enum Type {
-    OND = 0;
-    SBI = 1;
-    PND = 2;
-  }
+message SetSbiListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message SetPathListResponse{
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Status status = 2;
+  repeated SetResponse responses = 3;
+}
+
+message DeleteOndRequest {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  Type type = 2;
-  string uuid = 3;
   string pid = 4;
+  string did = 5;
 }
 
-message DeleteResponse {
+message DeleteOndResponse {
   int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
-  enum status {
-    OK = 0;
-    ERROR = 1;
-  }
-  status Status = 2;
+  Status status = 2;
 }
+
+enum Status {
+  STATUS_UNSPECIFIED = 0;
+  STATUS_OK = 1;
+  STATUS_ERROR = 2;
+}
\ No newline at end of file
diff --git a/proto/gosdn/southbound/southbound.proto b/proto/gosdn/southbound/southbound.proto
index f3ec369140ae7dcbae428502be61514dc47d7bcb..3054bac76dc6aef7495a24f6b825bd060c6f87d4 100644
--- a/proto/gosdn/southbound/southbound.proto
+++ b/proto/gosdn/southbound/southbound.proto
@@ -1,19 +1,22 @@
-syntax = "proto3";
-
-package gosdn.southbound;
-
-import "google/protobuf/descriptor.proto";
-
-option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/southbound";
-
-
-message SouthboundInterface {
-  string id = 1;
-  Type type = 2;
-}
-
-enum Type {
-  OPENCONFIG = 0;
-  CONTAINERISED = 1;
-  PLUGIN = 2;
-}
+syntax = "proto3";
+
+package gosdn.southbound;
+
+import "google/protobuf/descriptor.proto";
+
+option go_package = "code.fbi.h-da.de/danet/api/go/gosdn/southbound";
+
+
+message SouthboundInterface {
+  string id = 1;
+  Type type = 2;
+}
+
+// Changed accoprding to style guide: 
+// https://docs.buf.build/best-practices/style-guide#enums
+enum Type {
+  TYPE_UNSPECIFIED = 0;
+  TYPE_OPENCONFIG = 1;
+  TYPE_CONTAINERISED = 2;
+  TYPE_PLUGIN = 3;
+}
diff --git a/proto/gosdn/transport/transport.proto b/proto/gosdn/transport/transport.proto
index a1191e6f724de78f037135438b450897950eee82..5e8d2f646b6e69bb8caac31818d563364f97d103 100644
--- a/proto/gosdn/transport/transport.proto
+++ b/proto/gosdn/transport/transport.proto
@@ -13,20 +13,20 @@ message TransportOption {
   string username = 2;
   string password = 3;
   bool tls = 4;
-  oneof transportOption {
-    GnmiTransportOption GnmiTransportOption = 5;
-    RestconfTransportOption RestconfTransportOption = 6;
+  oneof transport_option {
+    GnmiTransportOption gnmi_transport_option = 5;
+    RestconfTransportOption restconf_transport_option = 6;
   }
   .gosdn.southbound.Type type = 7;
 }
 
 message GnmiTransportOption {
   string compression = 1;
-  map<string,string> grpcDialOptions = 2;
+  map<string,string> grpc_dial_options = 2;
   string token = 3;
   gnmi.Encoding encoding = 4;
 }
 
 message RestconfTransportOption {
 
-}
\ No newline at end of file
+}