diff --git a/.cobra.yaml b/.cobra.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..781bc21df45db1f7d98acc65acecc2b5e674b467
--- /dev/null
+++ b/.cobra.yaml
@@ -0,0 +1,3 @@
+author: da/net research group <danet.fbi.h-da.de>
+year: 2021
+license: BSD
diff --git a/.gitignore b/.gitignore
index efd36da89cad30d35c25ad1ff48db91f4e67b332..78c6e10062c15b5eb23543e4c43b585851060baa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,6 @@ documentation/design/*.pdf
 .idea/modules.xml
 .idea/vcs.xml
 .idea/workspace.xml
-restconf/bin/bin
\ No newline at end of file
+restconf/bin/bin
+test/.terraform.local/
+configs/gosdn.toml
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 62c3508c65fa68225115d4c536221518e6c1ee82..f349425303deb49011ea9c21fb27879088fdbb5f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,143 +3,22 @@ variables:
   DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
 
 stages:
+  - .pre
   - test
   - build
   - deploy
-  - documentation
+  - apply
+  - integration-test
+  - .post
 
-before_script:
-  - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
-
-code-quality-master:
-  image: golangci/golangci-lint:latest-alpine
-  stage: test
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-    - if: $CI_DEFAULT_BRANCH
-  script:
-    # writes golangci-lint output to gl-code-quality-report.json
-    - golangci-lint run --config .ci/.golangci-master.yml --out-format code-climate | tee gl-code-quality-report.json
-  artifacts:
-    reports:
-      codequality: gl-code-quality-report.json
-    paths:
-      - gl-code-quality-report.json
-
-
-code-quality:
-  image: golangci/golangci-lint:latest-alpine
-  stage: test
-  allow_failure: true
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
-  script:
-    # writes golangci-lint output to gl-code-quality-report.json
-    - golangci-lint run --config .ci/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
-  artifacts:
-    reports:
-      codequality: gl-code-quality-report.json
-    paths:
-      - gl-code-quality-report.json
-
-documentation:pdf:
+default:
   before_script:
-    - pwd
-  image:
-    name: pandoc/latex
-    entrypoint:
-    - ''
-  stage: documentation
-  rules:
-    - changes:
-      - documentation/design/*.md
-  script:
-  - cd documentation/design
-  - pandoc --filter pandoc-citeproc --bibliography=bibliography.bib --csl=acm-sig-proceedings.csl
-    --variable papersize=a4paper -s *.md -o documentation.pdf
-  artifacts:
-    paths:
-    - documentation/design/documentation.pdf
-
-.mdbook_common: &rust
-  image: 
-    name: $CI_REGISTRY/danet/internetworking/mdbook:latest
-    entrypoint:
-      - ''
-  stage: documentation
-  script:
-    - mdbook build documentation --dest-dir public
-  
-documentation:static:
-  rules:
-    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-  artifacts:
-    paths:
-      - public
-    expire_in: 1 week
-  <<: *rust
-
-documentation:test:
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-  <<: *rust
-
-build:docker:
-  stage: build
-  tags:
-    - baremetal
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-    - if: $CI_COMMIT_TAG
-  script:
-    - >
-      docker build \
-        --build-arg GITLAB_USER=$GO_MODULES_USER \
-        --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \
-        -t $DOCKER_IMAGE_SHA .
-
-.deploy: &deploy
-  stage: deploy
-  needs: ["build:docker"]
-  tags:
-    - baremetal
-  script:
-    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
-    - docker tag $DOCKER_IMAGE_SHA $TAG
-    - docker push $TAG
-    - curl --insecure -X POST $HOOK
-
-deploy:develop:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:develop
-    HOOK: $PORTAINER_HOOK_DEVELOP
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-  <<: *deploy
-
-deploy:tagged:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:CI_COMMIT_TAG
-  rules:
-    - if: $CI_COMMIT_TAG
-  <<: *deploy
-
-deploy:latest:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:latest
-    HOOK: $PORTAINER_HOOK_LATEST
-  rules:
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-  <<: *deploy
-
-sast:
-  variables:
-    SAST_ANALYZER_IMAGE_TAG: '2'
-    SAST_EXCLUDED_PATHS: spec, test, tests, tmp
-    SEARCH_MAX_DEPTH: '4'
+    - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
 
 include:
-  - template: Security/SAST.gitlab-ci.yml
-  - template: Dependency-Scanning.gitlab-ci.yml
-  - template: Security/License-Scanning.gitlab-ci.yml
+  - local: '/build/ci/.code-quality-ci.yml'
+  - local: '/build/ci/.documentation-ci.yml'
+  - local: '/build/ci/.security-and-compliance-ci.yml'
+  - local: '/build/ci/.build-container.yml'
+  - local: '/build/ci/.test.yml'
+  - local: '/build/ci/.terraform-ci.yml'
\ No newline at end of file
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
new file mode 100644
index 0000000000000000000000000000000000000000..dcd0d814bd56c70088e075aab00a801b32c1eab5
--- /dev/null
+++ b/ARCHITECTURE.md
@@ -0,0 +1,54 @@
+# goSDN Architecture
+
+This document describes the the high-level architecture of the goSDN project. All contributors should familiarize themselves with it. To avoid too much divergence from the changing code this document does focus on high-level concepts instead of implementation details.
+
+## Bird's Eye View
+
+[<img src="documentation/architecture.png"  style="height:50%; width:50%" > ](documentation/architecture.png)
+
+On the highest level goSDn provides a gRPC northbound-interface and two types of southbound-interfaces: RESTCONF and gRPC-based. The northbound interface allows the interaction with a running goSDN daemon and may allow the stacking of multiple controllers in the future. The southbound interface (SBI) capabilities are split in `nucleus` models and plugins. The supported `nucleus` models are OpenConfig yang [openconfig-yang](https://github.com/openconfig/yang)  and TAPI. Third party models and more SBI-transports can be attached using the go plugin architecture.
+
+The internal data representation uses [ygot](https://github.com/openconfig/ygot) generated go-structs. 
+It is important to note that these go-structs are generated from yang models and thus are not generic data structures. This means that the `nucleus` code is organized in silos, i.e., one particular southbound-interface is visible in the `nucleus`, as the internal data representation depend on the used yang modes in the southbound-interface.
+
+## Code Map
+
+This section briefly describes important directories and data structures. It also introduces important API calls to relevant libraries.
+
+
+It also mentions **architecture invariants** and **API boundaries**
+### `api`
+
+API specification for gRPC and protobuf definitions.
+
+**Architecture invariant:** To import gRPC related protobuf definitions use `pb` as an import prefix. For gNMI related protobuf definitions use `gpb`
+
+### `forks`
+
+Forks of `google/gnxi/gnmi` and `arista/goarista/gnmi` for gNMI server and client respectively. Subject of change once we converge to own clients and servers.
+
+### `nucleus/principalNetworkDomain`
+
+`nucleus` is the core package of goSDN. The main data structure is the `principalNetworkDomain` (PND). It reflects one administrative entity, i.e., as set of connected network devices,  and is the source of truth for network state and configuration. A PND is SBI agnostic and supports multiple SBI implementations simultaneously. 
+
+**API boundary:** The PND' is the only way to interact with an `orchestratedNetworkingDevice`
+
+### `nucleus/device`
+
+This is the representation of an `orchestratedNetworkingDevice` (OND). An `orchestratedNetworkingDevice` is the network device that is directly managed by goSDN. It holds a reference to the device's `transport` and `southboundInterface` implementation. It contains a fakeroot device based on its attached SBI.
+
+**Architecture invariant:** The device is does not provide any functionality to upper API layers.
+
+### `nucleus/southbound`
+
+Implementation of SBI specifics. Provides SBI models to other callers and SBI specific function deviations.
+
+**Architecture invariant:** Only SBIs defined by a YANG model will be supported by goSDN.
+
+### `nucleus/transport` `nucleus/gnmi_transport` `nucleus/restconf_transport`
+
+Transport between goSDN and ONDs. Current core implementations are gNMI and RESTCONF. Additionally to implementing the transports the packages also provide a mapping from general purpose goSDN API calls to diverging SBI API calls.
+
+For example `gNMI::Subscribe` and `RESTCONF::Push` are mapped to `gosdn::Subscribe`.
+
+The `gnmi_transport` implementation uses `ytypes.SetNode` to write to a device struct.
diff --git a/Dockerfile b/Dockerfile
index 3a98e0fc1fe5c0c6654db5a3ed0df53802a6253f..12f1a3dd3b97453624ea8d065810ba3a1fa6e4a3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,18 @@
-FROM golang:1.15-alpine AS builder
+FROM golang:1.15-buster AS builder
 ARG GITLAB_USER
 ARG GITLAB_TOKEN
+ARG BUILDARGS
 WORKDIR /src/gosdn
 COPY . .
-RUN apk add git
+RUN apt-get update && apt-get install -y git
 RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
-RUN go mod download
-RUN CGO_ENABLED=0 GOOS=linux go build
+RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn
 
-FROM alpine:latest
+FROM debian:latest
+EXPOSE 8080
 EXPOSE 55055
 COPY --from=builder /src/gosdn/gosdn .
-COPY --from=builder /src/gosdn/gosdn.toml .
-COPY --from=builder /src/gosdn/clients.toml .
+COPY --from=builder /src/gosdn/configs ./configs
 
 ENTRYPOINT [ "./gosdn" ]
 CMD [""]
diff --git a/LICENSE b/LICENSE
index c73f25619885d45b7f7443839b91af6c1596b7a1..fd4861958aee4dcc8a061639bb5c13544437766a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,19 @@
-BSD 3-Clause License
-
-Copyright (c) 2020, da/net
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
 
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
 
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
 
-* Neither the name of the copyright holder nor the names of its
-  contributors may be used to endorse or promote products derived from
-  this software without specific prior written permission.
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
diff --git a/README.md b/README.md
index e146373c4a27c01997b597c1782f315c07d82d24..aecc71b49a1faf1c2fffd9b6a76317c2f33c5e15 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,15 @@
 # GoSDN
 
+### CI Status Master
+
+[![coverage report](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/coverage.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master)
+[![pipeline status](https://code.fbi.h-da.de/cocsn/gosdn/badges/master/pipeline.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/master)
+
+### CI Status Develop
+
+[![coverage report](https://code.fbi.h-da.de/cocsn/gosdn/badges/develop/coverage.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/develop)
+[![pipeline status](https://code.fbi.h-da.de/cocsn/gosdn/badges/develop/pipeline.svg)](https://code.fbi.h-da.de/cocsn/gosdn/-/commits/develop)
+
 The GIT repo for the GoSDN design and implementation. GoSDN is intended to be controller for Software Defined Networks (SDN) that follows a modern software architecture design and a well-documented implementation in the go language. 
 
 ## Generate Code Stubs
@@ -15,4 +25,4 @@ gosdn
 
 ## Documentation
 
-The latest documentatiion generated on the master branch can be downloaded [here](https://code.fbi.h-da.de/cocsn/gosdn/-/jobs).
\ No newline at end of file
+The latest documentatiion generated on the master branch can be downloaded [here](https://code.fbi.h-da.de/cocsn/gosdn/-/jobs).
diff --git a/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/enums.pb.go b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/enums.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..2513966533fc00a4c1d7465c6e9a13d986eea507
--- /dev/null
+++ b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/enums.pb.go
@@ -0,0 +1,151 @@
+// openconfig.enums is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/enums/enums.proto
+
+package gosdn
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	_ "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// IETFInterfacesInterfaceType represents an enumerated type generated for the YANG identity interface-type.
+type IETFInterfacesInterfaceType int32
+
+const (
+	IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET IETFInterfacesInterfaceType = 0
+)
+
+// Enum value maps for IETFInterfacesInterfaceType.
+var (
+	IETFInterfacesInterfaceType_name = map[int32]string{
+		0: "IETFINTERFACESINTERFACETYPE_UNSET",
+	}
+	IETFInterfacesInterfaceType_value = map[string]int32{
+		"IETFINTERFACESINTERFACETYPE_UNSET": 0,
+	}
+)
+
+func (x IETFInterfacesInterfaceType) Enum() *IETFInterfacesInterfaceType {
+	p := new(IETFInterfacesInterfaceType)
+	*p = x
+	return p
+}
+
+func (x IETFInterfacesInterfaceType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (IETFInterfacesInterfaceType) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_enums_enums_proto_enumTypes[0].Descriptor()
+}
+
+func (IETFInterfacesInterfaceType) Type() protoreflect.EnumType {
+	return &file_openconfig_enums_enums_proto_enumTypes[0]
+}
+
+func (x IETFInterfacesInterfaceType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use IETFInterfacesInterfaceType.Descriptor instead.
+func (IETFInterfacesInterfaceType) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_enums_enums_proto_rawDescGZIP(), []int{0}
+}
+
+var File_openconfig_enums_enums_proto protoreflect.FileDescriptor
+
+var file_openconfig_enums_enums_proto_rawDesc = []byte{
+	0x0a, 0x1c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x75,
+	0x6d, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
+	0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78,
+	0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x44, 0x0a, 0x1b,
+	0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x21, 0x49,
+	0x45, 0x54, 0x46, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x53, 0x49, 0x4e, 0x54,
+	0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54,
+	0x10, 0x00, 0x42, 0x20, 0x5a, 0x1e, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x66, 0x62, 0x69,
+	0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 0x6e, 0x2f, 0x67,
+	0x6f, 0x73, 0x64, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_enums_enums_proto_rawDescOnce sync.Once
+	file_openconfig_enums_enums_proto_rawDescData = file_openconfig_enums_enums_proto_rawDesc
+)
+
+func file_openconfig_enums_enums_proto_rawDescGZIP() []byte {
+	file_openconfig_enums_enums_proto_rawDescOnce.Do(func() {
+		file_openconfig_enums_enums_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_enums_enums_proto_rawDescData)
+	})
+	return file_openconfig_enums_enums_proto_rawDescData
+}
+
+var file_openconfig_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_openconfig_enums_enums_proto_goTypes = []interface{}{
+	(IETFInterfacesInterfaceType)(0), // 0: openconfig.enums.IETFInterfacesInterfaceType
+}
+var file_openconfig_enums_enums_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_enums_enums_proto_init() }
+func file_openconfig_enums_enums_proto_init() {
+	if File_openconfig_enums_enums_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_enums_enums_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_enums_enums_proto_goTypes,
+		DependencyIndexes: file_openconfig_enums_enums_proto_depIdxs,
+		EnumInfos:         file_openconfig_enums_enums_proto_enumTypes,
+	}.Build()
+	File_openconfig_enums_enums_proto = out.File
+	file_openconfig_enums_enums_proto_rawDesc = nil
+	file_openconfig_enums_enums_proto_goTypes = nil
+	file_openconfig_enums_enums_proto_depIdxs = nil
+}
diff --git a/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig.pb.go b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..fda5833bb53a461835874bcff8b76a4140dc11c4
--- /dev/null
+++ b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig.pb.go
@@ -0,0 +1,177 @@
+// openconfig is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/openconfig.proto
+
+package gosdn
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	_ "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type Device struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Interfaces *Interfaces `protobuf:"bytes,85031486,opt,name=interfaces,proto3" json:"interfaces,omitempty"`
+}
+
+func (x *Device) Reset() {
+	*x = Device{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Device) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Device) ProtoMessage() {}
+
+func (x *Device) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_proto_msgTypes[0]
+	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 Device.ProtoReflect.Descriptor instead.
+func (*Device) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Device) GetInterfaces() *Interfaces {
+	if x != nil {
+		return x.Interfaces
+	}
+	return nil
+}
+
+var File_openconfig_openconfig_proto protoreflect.FileDescriptor
+
+var file_openconfig_openconfig_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0x69, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a,
+	0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0xbe, 0xf4, 0xc5, 0x28,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x42, 0x20,
+	0x5a, 0x1e, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64,
+	0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 0x6e, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_openconfig_proto_rawDescOnce sync.Once
+	file_openconfig_openconfig_proto_rawDescData = file_openconfig_openconfig_proto_rawDesc
+)
+
+func file_openconfig_openconfig_proto_rawDescGZIP() []byte {
+	file_openconfig_openconfig_proto_rawDescOnce.Do(func() {
+		file_openconfig_openconfig_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_openconfig_proto_rawDescData)
+	})
+	return file_openconfig_openconfig_proto_rawDescData
+}
+
+var file_openconfig_openconfig_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_openconfig_openconfig_proto_goTypes = []interface{}{
+	(*Device)(nil),     // 0: openconfig.Device
+	(*Interfaces)(nil), // 1: openconfig.openconfig_interfaces.Interfaces
+}
+var file_openconfig_openconfig_proto_depIdxs = []int32{
+	1, // 0: openconfig.Device.interfaces:type_name -> openconfig.openconfig_interfaces.Interfaces
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_openconfig_proto_init() }
+func file_openconfig_openconfig_proto_init() {
+	if File_openconfig_openconfig_proto != nil {
+		return
+	}
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_openconfig_openconfig_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Device); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_openconfig_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_openconfig_proto_goTypes,
+		DependencyIndexes: file_openconfig_openconfig_proto_depIdxs,
+		MessageInfos:      file_openconfig_openconfig_proto_msgTypes,
+	}.Build()
+	File_openconfig_openconfig_proto = out.File
+	file_openconfig_openconfig_proto_rawDesc = nil
+	file_openconfig_openconfig_proto_goTypes = nil
+	file_openconfig_openconfig_proto_depIdxs = nil
+}
diff --git a/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig_interfaces.pb.go b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig_interfaces.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..9802a14b71ad60f6bd5de8f298286a553d3a1c0e
--- /dev/null
+++ b/api/proto/gitlab.fbi.h-da.de/cocsn/gosdn/openconfig_interfaces.pb.go
@@ -0,0 +1,2622 @@
+// openconfig.openconfig_interfaces is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/openconfig_interfaces/openconfig_interfaces.proto
+
+package gosdn
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	ywrapper "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type Interfaces_Interface_State_AdminStatus int32
+
+const (
+	Interfaces_Interface_State_ADMINSTATUS_UNSET   Interfaces_Interface_State_AdminStatus = 0
+	Interfaces_Interface_State_ADMINSTATUS_UP      Interfaces_Interface_State_AdminStatus = 1
+	Interfaces_Interface_State_ADMINSTATUS_DOWN    Interfaces_Interface_State_AdminStatus = 2
+	Interfaces_Interface_State_ADMINSTATUS_TESTING Interfaces_Interface_State_AdminStatus = 3
+)
+
+// Enum value maps for Interfaces_Interface_State_AdminStatus.
+var (
+	Interfaces_Interface_State_AdminStatus_name = map[int32]string{
+		0: "ADMINSTATUS_UNSET",
+		1: "ADMINSTATUS_UP",
+		2: "ADMINSTATUS_DOWN",
+		3: "ADMINSTATUS_TESTING",
+	}
+	Interfaces_Interface_State_AdminStatus_value = map[string]int32{
+		"ADMINSTATUS_UNSET":   0,
+		"ADMINSTATUS_UP":      1,
+		"ADMINSTATUS_DOWN":    2,
+		"ADMINSTATUS_TESTING": 3,
+	}
+)
+
+func (x Interfaces_Interface_State_AdminStatus) Enum() *Interfaces_Interface_State_AdminStatus {
+	p := new(Interfaces_Interface_State_AdminStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_State_AdminStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_State_AdminStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[0].Descriptor()
+}
+
+func (Interfaces_Interface_State_AdminStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[0]
+}
+
+func (x Interfaces_Interface_State_AdminStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_State_AdminStatus.Descriptor instead.
+func (Interfaces_Interface_State_AdminStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 0}
+}
+
+type Interfaces_Interface_State_OperStatus int32
+
+const (
+	Interfaces_Interface_State_OPERSTATUS_UNSET            Interfaces_Interface_State_OperStatus = 0
+	Interfaces_Interface_State_OPERSTATUS_UP               Interfaces_Interface_State_OperStatus = 2
+	Interfaces_Interface_State_OPERSTATUS_DOWN             Interfaces_Interface_State_OperStatus = 3
+	Interfaces_Interface_State_OPERSTATUS_TESTING          Interfaces_Interface_State_OperStatus = 4
+	Interfaces_Interface_State_OPERSTATUS_UNKNOWN          Interfaces_Interface_State_OperStatus = 5
+	Interfaces_Interface_State_OPERSTATUS_DORMANT          Interfaces_Interface_State_OperStatus = 6
+	Interfaces_Interface_State_OPERSTATUS_NOT_PRESENT      Interfaces_Interface_State_OperStatus = 7
+	Interfaces_Interface_State_OPERSTATUS_LOWER_LAYER_DOWN Interfaces_Interface_State_OperStatus = 8
+)
+
+// Enum value maps for Interfaces_Interface_State_OperStatus.
+var (
+	Interfaces_Interface_State_OperStatus_name = map[int32]string{
+		0: "OPERSTATUS_UNSET",
+		2: "OPERSTATUS_UP",
+		3: "OPERSTATUS_DOWN",
+		4: "OPERSTATUS_TESTING",
+		5: "OPERSTATUS_UNKNOWN",
+		6: "OPERSTATUS_DORMANT",
+		7: "OPERSTATUS_NOT_PRESENT",
+		8: "OPERSTATUS_LOWER_LAYER_DOWN",
+	}
+	Interfaces_Interface_State_OperStatus_value = map[string]int32{
+		"OPERSTATUS_UNSET":            0,
+		"OPERSTATUS_UP":               2,
+		"OPERSTATUS_DOWN":             3,
+		"OPERSTATUS_TESTING":          4,
+		"OPERSTATUS_UNKNOWN":          5,
+		"OPERSTATUS_DORMANT":          6,
+		"OPERSTATUS_NOT_PRESENT":      7,
+		"OPERSTATUS_LOWER_LAYER_DOWN": 8,
+	}
+)
+
+func (x Interfaces_Interface_State_OperStatus) Enum() *Interfaces_Interface_State_OperStatus {
+	p := new(Interfaces_Interface_State_OperStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_State_OperStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_State_OperStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[1].Descriptor()
+}
+
+func (Interfaces_Interface_State_OperStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[1]
+}
+
+func (x Interfaces_Interface_State_OperStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_State_OperStatus.Descriptor instead.
+func (Interfaces_Interface_State_OperStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 1}
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus int32
+
+const (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UNSET   Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 0
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UP      Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 1
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_DOWN    Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 2
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_TESTING Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 3
+)
+
+// Enum value maps for Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus.
+var (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus_name = map[int32]string{
+		0: "ADMINSTATUS_UNSET",
+		1: "ADMINSTATUS_UP",
+		2: "ADMINSTATUS_DOWN",
+		3: "ADMINSTATUS_TESTING",
+	}
+	Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus_value = map[string]int32{
+		"ADMINSTATUS_UNSET":   0,
+		"ADMINSTATUS_UP":      1,
+		"ADMINSTATUS_DOWN":    2,
+		"ADMINSTATUS_TESTING": 3,
+	}
+)
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Enum() *Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus {
+	p := new(Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[2].Descriptor()
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[2]
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus.Descriptor instead.
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 0}
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus int32
+
+const (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNSET            Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 0
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UP               Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 2
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_DOWN             Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 3
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_TESTING          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 4
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNKNOWN          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 5
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_DORMANT          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 6
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_NOT_PRESENT      Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 7
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_LOWER_LAYER_DOWN Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 8
+)
+
+// Enum value maps for Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus.
+var (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus_name = map[int32]string{
+		0: "OPERSTATUS_UNSET",
+		2: "OPERSTATUS_UP",
+		3: "OPERSTATUS_DOWN",
+		4: "OPERSTATUS_TESTING",
+		5: "OPERSTATUS_UNKNOWN",
+		6: "OPERSTATUS_DORMANT",
+		7: "OPERSTATUS_NOT_PRESENT",
+		8: "OPERSTATUS_LOWER_LAYER_DOWN",
+	}
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus_value = map[string]int32{
+		"OPERSTATUS_UNSET":            0,
+		"OPERSTATUS_UP":               2,
+		"OPERSTATUS_DOWN":             3,
+		"OPERSTATUS_TESTING":          4,
+		"OPERSTATUS_UNKNOWN":          5,
+		"OPERSTATUS_DORMANT":          6,
+		"OPERSTATUS_NOT_PRESENT":      7,
+		"OPERSTATUS_LOWER_LAYER_DOWN": 8,
+	}
+)
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Enum() *Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus {
+	p := new(Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[3].Descriptor()
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[3]
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus.Descriptor instead.
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 1}
+}
+
+type Interfaces struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Interface []*Interfaces_InterfaceKey `protobuf:"bytes,422482938,rep,name=interface,proto3" json:"interface,omitempty"`
+}
+
+func (x *Interfaces) Reset() {
+	*x = Interfaces{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces) ProtoMessage() {}
+
+func (x *Interfaces) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0]
+	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 Interfaces.ProtoReflect.Descriptor instead.
+func (*Interfaces) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Interfaces) GetInterface() []*Interfaces_InterfaceKey {
+	if x != nil {
+		return x.Interface
+	}
+	return nil
+}
+
+type Interfaces_Interface struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config        *Interfaces_Interface_Config        `protobuf:"bytes,334174827,opt,name=config,proto3" json:"config,omitempty"`
+	HoldTime      *Interfaces_Interface_HoldTime      `protobuf:"bytes,175931092,opt,name=hold_time,json=holdTime,proto3" json:"hold_time,omitempty"`
+	State         *Interfaces_Interface_State         `protobuf:"bytes,387556140,opt,name=state,proto3" json:"state,omitempty"`
+	Subinterfaces *Interfaces_Interface_Subinterfaces `protobuf:"bytes,327798165,opt,name=subinterfaces,proto3" json:"subinterfaces,omitempty"`
+}
+
+func (x *Interfaces_Interface) Reset() {
+	*x = Interfaces_Interface{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface) ProtoMessage() {}
+
+func (x *Interfaces_Interface) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Interfaces_Interface) GetConfig() *Interfaces_Interface_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetHoldTime() *Interfaces_Interface_HoldTime {
+	if x != nil {
+		return x.HoldTime
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetState() *Interfaces_Interface_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetSubinterfaces() *Interfaces_Interface_Subinterfaces {
+	if x != nil {
+		return x.Subinterfaces
+	}
+	return nil
+}
+
+type Interfaces_InterfaceKey struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name      string                `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Interface *Interfaces_Interface `protobuf:"bytes,2,opt,name=interface,proto3" json:"interface,omitempty"`
+}
+
+func (x *Interfaces_InterfaceKey) Reset() {
+	*x = Interfaces_InterfaceKey{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_InterfaceKey) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_InterfaceKey) ProtoMessage() {}
+
+func (x *Interfaces_InterfaceKey) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2]
+	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 Interfaces_InterfaceKey.ProtoReflect.Descriptor instead.
+func (*Interfaces_InterfaceKey) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *Interfaces_InterfaceKey) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Interfaces_InterfaceKey) GetInterface() *Interfaces_Interface {
+	if x != nil {
+		return x.Interface
+	}
+	return nil
+}
+
+type Interfaces_Interface_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Description  *ywrapper.StringValue       `protobuf:"bytes,418535860,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled      *ywrapper.BoolValue         `protobuf:"bytes,37224301,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	LoopbackMode *ywrapper.BoolValue         `protobuf:"bytes,253516347,opt,name=loopback_mode,json=loopbackMode,proto3" json:"loopback_mode,omitempty"`
+	Mtu          *ywrapper.UintValue         `protobuf:"bytes,376210342,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	Name         *ywrapper.StringValue       `protobuf:"bytes,51804187,opt,name=name,proto3" json:"name,omitempty"`
+	Type         IETFInterfacesInterfaceType `protobuf:"varint,144596894,opt,name=type,proto3,enum=openconfig.enums.IETFInterfacesInterfaceType" json:"type,omitempty"`
+}
+
+func (x *Interfaces_Interface_Config) Reset() {
+	*x = Interfaces_Interface_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3]
+	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 Interfaces_Interface_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 0}
+}
+
+func (x *Interfaces_Interface_Config) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetLoopbackMode() *ywrapper.BoolValue {
+	if x != nil {
+		return x.LoopbackMode
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetMtu() *ywrapper.UintValue {
+	if x != nil {
+		return x.Mtu
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetType() IETFInterfacesInterfaceType {
+	if x != nil {
+		return x.Type
+	}
+	return IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET
+}
+
+type Interfaces_Interface_HoldTime struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config *Interfaces_Interface_HoldTime_Config `protobuf:"bytes,316512729,opt,name=config,proto3" json:"config,omitempty"`
+	State  *Interfaces_Interface_HoldTime_State  `protobuf:"bytes,483010990,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime) Reset() {
+	*x = Interfaces_Interface_HoldTime{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1}
+}
+
+func (x *Interfaces_Interface_HoldTime) GetConfig() *Interfaces_Interface_HoldTime_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime) GetState() *Interfaces_Interface_HoldTime_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+type Interfaces_Interface_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AdminStatus  Interfaces_Interface_State_AdminStatus `protobuf:"varint,474494763,opt,name=admin_status,json=adminStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_State_AdminStatus" json:"admin_status,omitempty"`
+	Counters     *Interfaces_Interface_State_Counters   `protobuf:"bytes,83645964,opt,name=counters,proto3" json:"counters,omitempty"`
+	Description  *ywrapper.StringValue                  `protobuf:"bytes,389435287,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled      *ywrapper.BoolValue                    `protobuf:"bytes,330927518,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Ifindex      *ywrapper.UintValue                    `protobuf:"bytes,116108202,opt,name=ifindex,proto3" json:"ifindex,omitempty"`
+	LastChange   *ywrapper.UintValue                    `protobuf:"bytes,127348880,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	Logical      *ywrapper.BoolValue                    `protobuf:"bytes,440460216,opt,name=logical,proto3" json:"logical,omitempty"`
+	LoopbackMode *ywrapper.BoolValue                    `protobuf:"bytes,372935512,opt,name=loopback_mode,json=loopbackMode,proto3" json:"loopback_mode,omitempty"`
+	Mtu          *ywrapper.UintValue                    `protobuf:"bytes,96390485,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	Name         *ywrapper.StringValue                  `protobuf:"bytes,503495278,opt,name=name,proto3" json:"name,omitempty"`
+	OperStatus   Interfaces_Interface_State_OperStatus  `protobuf:"varint,470394226,opt,name=oper_status,json=operStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_State_OperStatus" json:"oper_status,omitempty"`
+	Type         IETFInterfacesInterfaceType            `protobuf:"varint,358148579,opt,name=type,proto3,enum=openconfig.enums.IETFInterfacesInterfaceType" json:"type,omitempty"`
+}
+
+func (x *Interfaces_Interface_State) Reset() {
+	*x = Interfaces_Interface_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5]
+	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 Interfaces_Interface_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2}
+}
+
+func (x *Interfaces_Interface_State) GetAdminStatus() Interfaces_Interface_State_AdminStatus {
+	if x != nil {
+		return x.AdminStatus
+	}
+	return Interfaces_Interface_State_ADMINSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_State) GetCounters() *Interfaces_Interface_State_Counters {
+	if x != nil {
+		return x.Counters
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetIfindex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Ifindex
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLastChange() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastChange
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLogical() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Logical
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLoopbackMode() *ywrapper.BoolValue {
+	if x != nil {
+		return x.LoopbackMode
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetMtu() *ywrapper.UintValue {
+	if x != nil {
+		return x.Mtu
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetOperStatus() Interfaces_Interface_State_OperStatus {
+	if x != nil {
+		return x.OperStatus
+	}
+	return Interfaces_Interface_State_OPERSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_State) GetType() IETFInterfacesInterfaceType {
+	if x != nil {
+		return x.Type
+	}
+	return IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET
+}
+
+type Interfaces_Interface_Subinterfaces struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Subinterface []*Interfaces_Interface_Subinterfaces_SubinterfaceKey `protobuf:"bytes,464802819,rep,name=subinterface,proto3" json:"subinterface,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces) Reset() {
+	*x = Interfaces_Interface_Subinterfaces{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3}
+}
+
+func (x *Interfaces_Interface_Subinterfaces) GetSubinterface() []*Interfaces_Interface_Subinterfaces_SubinterfaceKey {
+	if x != nil {
+		return x.Subinterface
+	}
+	return nil
+}
+
+type Interfaces_Interface_HoldTime_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Down *ywrapper.UintValue `protobuf:"bytes,171181656,opt,name=down,proto3" json:"down,omitempty"`
+	Up   *ywrapper.UintValue `protobuf:"bytes,62026235,opt,name=up,proto3" json:"up,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) Reset() {
+	*x = Interfaces_Interface_HoldTime_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1, 0}
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) GetDown() *ywrapper.UintValue {
+	if x != nil {
+		return x.Down
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) GetUp() *ywrapper.UintValue {
+	if x != nil {
+		return x.Up
+	}
+	return nil
+}
+
+type Interfaces_Interface_HoldTime_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Down *ywrapper.UintValue `protobuf:"bytes,167887721,opt,name=down,proto3" json:"down,omitempty"`
+	Up   *ywrapper.UintValue `protobuf:"bytes,223847598,opt,name=up,proto3" json:"up,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime_State) Reset() {
+	*x = Interfaces_Interface_HoldTime_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1, 1}
+}
+
+func (x *Interfaces_Interface_HoldTime_State) GetDown() *ywrapper.UintValue {
+	if x != nil {
+		return x.Down
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime_State) GetUp() *ywrapper.UintValue {
+	if x != nil {
+		return x.Up
+	}
+	return nil
+}
+
+type Interfaces_Interface_State_Counters struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CarrierTransitions *ywrapper.UintValue `protobuf:"bytes,270803130,opt,name=carrier_transitions,json=carrierTransitions,proto3" json:"carrier_transitions,omitempty"`
+	InBroadcastPkts    *ywrapper.UintValue `protobuf:"bytes,280201989,opt,name=in_broadcast_pkts,json=inBroadcastPkts,proto3" json:"in_broadcast_pkts,omitempty"`
+	InDiscards         *ywrapper.UintValue `protobuf:"bytes,11979514,opt,name=in_discards,json=inDiscards,proto3" json:"in_discards,omitempty"`
+	InErrors           *ywrapper.UintValue `protobuf:"bytes,456697578,opt,name=in_errors,json=inErrors,proto3" json:"in_errors,omitempty"`
+	InFcsErrors        *ywrapper.UintValue `protobuf:"bytes,501559027,opt,name=in_fcs_errors,json=inFcsErrors,proto3" json:"in_fcs_errors,omitempty"`
+	InMulticastPkts    *ywrapper.UintValue `protobuf:"bytes,113269128,opt,name=in_multicast_pkts,json=inMulticastPkts,proto3" json:"in_multicast_pkts,omitempty"`
+	InOctets           *ywrapper.UintValue `protobuf:"bytes,333138891,opt,name=in_octets,json=inOctets,proto3" json:"in_octets,omitempty"`
+	InPkts             *ywrapper.UintValue `protobuf:"bytes,412843491,opt,name=in_pkts,json=inPkts,proto3" json:"in_pkts,omitempty"`
+	InUnicastPkts      *ywrapper.UintValue `protobuf:"bytes,272792307,opt,name=in_unicast_pkts,json=inUnicastPkts,proto3" json:"in_unicast_pkts,omitempty"`
+	InUnknownProtos    *ywrapper.UintValue `protobuf:"bytes,241475497,opt,name=in_unknown_protos,json=inUnknownProtos,proto3" json:"in_unknown_protos,omitempty"`
+	LastClear          *ywrapper.UintValue `protobuf:"bytes,186014919,opt,name=last_clear,json=lastClear,proto3" json:"last_clear,omitempty"`
+	OutBroadcastPkts   *ywrapper.UintValue `protobuf:"bytes,338589668,opt,name=out_broadcast_pkts,json=outBroadcastPkts,proto3" json:"out_broadcast_pkts,omitempty"`
+	OutDiscards        *ywrapper.UintValue `protobuf:"bytes,254055111,opt,name=out_discards,json=outDiscards,proto3" json:"out_discards,omitempty"`
+	OutErrors          *ywrapper.UintValue `protobuf:"bytes,471103047,opt,name=out_errors,json=outErrors,proto3" json:"out_errors,omitempty"`
+	OutMulticastPkts   *ywrapper.UintValue `protobuf:"bytes,457840757,opt,name=out_multicast_pkts,json=outMulticastPkts,proto3" json:"out_multicast_pkts,omitempty"`
+	OutOctets          *ywrapper.UintValue `protobuf:"bytes,201005514,opt,name=out_octets,json=outOctets,proto3" json:"out_octets,omitempty"`
+	OutPkts            *ywrapper.UintValue `protobuf:"bytes,437582090,opt,name=out_pkts,json=outPkts,proto3" json:"out_pkts,omitempty"`
+	OutUnicastPkts     *ywrapper.UintValue `protobuf:"bytes,36542246,opt,name=out_unicast_pkts,json=outUnicastPkts,proto3" json:"out_unicast_pkts,omitempty"`
+}
+
+func (x *Interfaces_Interface_State_Counters) Reset() {
+	*x = Interfaces_Interface_State_Counters{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_State_Counters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_State_Counters) ProtoMessage() {}
+
+func (x *Interfaces_Interface_State_Counters) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9]
+	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 Interfaces_Interface_State_Counters.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_State_Counters) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 0}
+}
+
+func (x *Interfaces_Interface_State_Counters) GetCarrierTransitions() *ywrapper.UintValue {
+	if x != nil {
+		return x.CarrierTransitions
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.InDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInFcsErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InFcsErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.InOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnicastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInUnknownProtos() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnknownProtos
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetLastClear() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastClear
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutUnicastPkts
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config *Interfaces_Interface_Subinterfaces_Subinterface_Config `protobuf:"bytes,175001476,opt,name=config,proto3" json:"config,omitempty"`
+	State  *Interfaces_Interface_Subinterfaces_Subinterface_State  `protobuf:"bytes,501974173,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) GetConfig() *Interfaces_Interface_Subinterfaces_Subinterface_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) GetState() *Interfaces_Interface_Subinterfaces_Subinterface_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_SubinterfaceKey struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Index        uint64                                           `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+	Subinterface *Interfaces_Interface_Subinterfaces_Subinterface `protobuf:"bytes,2,opt,name=subinterface,proto3" json:"subinterface,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_SubinterfaceKey{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_SubinterfaceKey) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_SubinterfaceKey.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_SubinterfaceKey) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 1}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) GetIndex() uint64 {
+	if x != nil {
+		return x.Index
+	}
+	return 0
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) GetSubinterface() *Interfaces_Interface_Subinterfaces_Subinterface {
+	if x != nil {
+		return x.Subinterface
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Description *ywrapper.StringValue `protobuf:"bytes,280671199,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled     *ywrapper.BoolValue   `protobuf:"bytes,297236390,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Index       *ywrapper.UintValue   `protobuf:"bytes,279269781,opt,name=index,proto3" json:"index,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetIndex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Index
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AdminStatus Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus `protobuf:"varint,250658952,opt,name=admin_status,json=adminStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus" json:"admin_status,omitempty"`
+	Counters    *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters   `protobuf:"bytes,483442783,opt,name=counters,proto3" json:"counters,omitempty"`
+	Description *ywrapper.StringValue                                             `protobuf:"bytes,49943526,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled     *ywrapper.BoolValue                                               `protobuf:"bytes,468513843,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Ifindex     *ywrapper.UintValue                                               `protobuf:"bytes,511987815,opt,name=ifindex,proto3" json:"ifindex,omitempty"`
+	Index       *ywrapper.UintValue                                               `protobuf:"bytes,80745756,opt,name=index,proto3" json:"index,omitempty"`
+	LastChange  *ywrapper.UintValue                                               `protobuf:"bytes,29904521,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	Logical     *ywrapper.BoolValue                                               `protobuf:"bytes,294124401,opt,name=logical,proto3" json:"logical,omitempty"`
+	Name        *ywrapper.StringValue                                             `protobuf:"bytes,279346681,opt,name=name,proto3" json:"name,omitempty"`
+	OperStatus  Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus  `protobuf:"varint,401969247,opt,name=oper_status,json=operStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus" json:"oper_status,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetAdminStatus() Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus {
+	if x != nil {
+		return x.AdminStatus
+	}
+	return Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetCounters() *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters {
+	if x != nil {
+		return x.Counters
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetIfindex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Ifindex
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetIndex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Index
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetLastChange() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastChange
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetLogical() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Logical
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetOperStatus() Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus {
+	if x != nil {
+		return x.OperStatus
+	}
+	return Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNSET
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_Counters struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CarrierTransitions *ywrapper.UintValue `protobuf:"bytes,141120277,opt,name=carrier_transitions,json=carrierTransitions,proto3" json:"carrier_transitions,omitempty"`
+	InBroadcastPkts    *ywrapper.UintValue `protobuf:"bytes,120244022,opt,name=in_broadcast_pkts,json=inBroadcastPkts,proto3" json:"in_broadcast_pkts,omitempty"`
+	InDiscards         *ywrapper.UintValue `protobuf:"bytes,307490461,opt,name=in_discards,json=inDiscards,proto3" json:"in_discards,omitempty"`
+	InErrors           *ywrapper.UintValue `protobuf:"bytes,319720873,opt,name=in_errors,json=inErrors,proto3" json:"in_errors,omitempty"`
+	InFcsErrors        *ywrapper.UintValue `protobuf:"bytes,169858424,opt,name=in_fcs_errors,json=inFcsErrors,proto3" json:"in_fcs_errors,omitempty"`
+	InMulticastPkts    *ywrapper.UintValue `protobuf:"bytes,320618859,opt,name=in_multicast_pkts,json=inMulticastPkts,proto3" json:"in_multicast_pkts,omitempty"`
+	InOctets           *ywrapper.UintValue `protobuf:"bytes,530205868,opt,name=in_octets,json=inOctets,proto3" json:"in_octets,omitempty"`
+	InPkts             *ywrapper.UintValue `protobuf:"bytes,441153352,opt,name=in_pkts,json=inPkts,proto3" json:"in_pkts,omitempty"`
+	InUnicastPkts      *ywrapper.UintValue `protobuf:"bytes,177838880,opt,name=in_unicast_pkts,json=inUnicastPkts,proto3" json:"in_unicast_pkts,omitempty"`
+	InUnknownProtos    *ywrapper.UintValue `protobuf:"bytes,146059814,opt,name=in_unknown_protos,json=inUnknownProtos,proto3" json:"in_unknown_protos,omitempty"`
+	LastClear          *ywrapper.UintValue `protobuf:"bytes,518046966,opt,name=last_clear,json=lastClear,proto3" json:"last_clear,omitempty"`
+	OutBroadcastPkts   *ywrapper.UintValue `protobuf:"bytes,501221245,opt,name=out_broadcast_pkts,json=outBroadcastPkts,proto3" json:"out_broadcast_pkts,omitempty"`
+	OutDiscards        *ywrapper.UintValue `protobuf:"bytes,159539762,opt,name=out_discards,json=outDiscards,proto3" json:"out_discards,omitempty"`
+	OutErrors          *ywrapper.UintValue `protobuf:"bytes,466636898,opt,name=out_errors,json=outErrors,proto3" json:"out_errors,omitempty"`
+	OutMulticastPkts   *ywrapper.UintValue `protobuf:"bytes,326155776,opt,name=out_multicast_pkts,json=outMulticastPkts,proto3" json:"out_multicast_pkts,omitempty"`
+	OutOctets          *ywrapper.UintValue `protobuf:"bytes,50579235,opt,name=out_octets,json=outOctets,proto3" json:"out_octets,omitempty"`
+	OutPkts            *ywrapper.UintValue `protobuf:"bytes,29497115,opt,name=out_pkts,json=outPkts,proto3" json:"out_pkts,omitempty"`
+	OutUnicastPkts     *ywrapper.UintValue `protobuf:"bytes,297910971,opt,name=out_unicast_pkts,json=outUnicastPkts,proto3" json:"out_unicast_pkts,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_State_Counters{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_State_Counters.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetCarrierTransitions() *ywrapper.UintValue {
+	if x != nil {
+		return x.CarrierTransitions
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.InDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInFcsErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InFcsErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.InOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnicastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInUnknownProtos() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnknownProtos
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetLastClear() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastClear
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutUnicastPkts
+	}
+	return nil
+}
+
+var File_openconfig_openconfig_interfaces_openconfig_interfaces_proto protoreflect.FileDescriptor
+
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc = []byte{
+	0x0a, 0x3c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78,
+	0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f, 0x65,
+	0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf3, 0x5a, 0x0a, 0x0a, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x12, 0x75, 0x0a, 0x09, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0xfa, 0xa7, 0xba, 0xc9, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x18, 0x82, 0x41, 0x15,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x1a, 0xd3, 0x58, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x7a,
+	0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xeb, 0xb4, 0xac, 0x9f, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x42, 0x1f, 0x82, 0x41, 0x1c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x83, 0x01, 0x0a, 0x09, 0x68,
+	0x6f, 0x6c, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xd4, 0xfd, 0xf1, 0x53, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x3f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69,
+	0x6d, 0x65, 0x42, 0x22, 0x82, 0x41, 0x1f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c,
+	0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x76, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0xac, 0xc6, 0xe6, 0xb8, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x42, 0x1e, 0x82, 0x41, 0x1b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x96, 0x01, 0x0a, 0x0d, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0x95, 0x9b, 0xa7, 0x9c, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x1a, 0xc9, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x68, 0x0a, 0x0b,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xb4, 0xb3, 0xc9, 0xc7,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x64, 0x65,
+	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x18, 0xed, 0xfe, 0xdf, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x27, 0x82, 0x41, 0x24, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x12, 0x6a, 0x0a, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6d, 0x6f,
+	0x64, 0x65, 0x18, 0xbb, 0xb4, 0xf1, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x52,
+	0x0c, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x4e, 0x0a,
+	0x03, 0x6d, 0x74, 0x75, 0x18, 0xa6, 0x87, 0xb2, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x23, 0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6d, 0x74, 0x75, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x52, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x9b, 0xf0, 0xd9, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x24, 0x82, 0x41, 0x21, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x6a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x9e, 0xbf, 0xf9, 0x44, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70,
+	0x65, 0x42, 0x24, 0x82, 0x41, 0x21, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x9d, 0x05,
+	0x0a, 0x08, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x06, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xd9, 0xb3, 0xf6, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x46, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x29, 0x82, 0x41, 0x26, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x89, 0x01, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0xae, 0xd3, 0xa8, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45,
+	0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x2e,
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x28, 0x82, 0x41, 0x25, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xba, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x5a, 0x0a, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0xd8, 0x8c, 0xd0, 0x51, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69,
+	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2e, 0x82, 0x41, 0x2b, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x54, 0x0a,
+	0x02, 0x75, 0x70, 0x18, 0xfb, 0xe3, 0xc9, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x2c, 0x82, 0x41, 0x29, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64,
+	0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x75, 0x70, 0x52,
+	0x02, 0x75, 0x70, 0x1a, 0xb7, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x59, 0x0a,
+	0x04, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0xe9, 0x86, 0x87, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f,
+	0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x6f,
+	0x77, 0x6e, 0x52, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x53, 0x0a, 0x02, 0x75, 0x70, 0x18, 0xae,
+	0xc9, 0xde, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x75, 0x70, 0x52, 0x02, 0x75, 0x70, 0x1a, 0x9b, 0x1e,
+	0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0c, 0x61, 0x64, 0x6d, 0x69,
+	0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xab, 0xee, 0xa0, 0xe2, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x48, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x61, 0x64, 0x6d,
+	0x69, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x61, 0x64, 0x6d, 0x69, 0x6e,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x18, 0x8c, 0xac, 0xf1, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x42, 0x27, 0x82, 0x41, 0x24, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x08, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x67, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x97, 0x9f, 0xd9, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x59, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x9e, 0x9b, 0xe6, 0x9d, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x07, 0x69, 0x66,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xaa, 0xd7, 0xae, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x66, 0x69,
+	0x6e, 0x64, 0x65, 0x78, 0x12, 0x63, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x18, 0x90, 0xe1, 0xdc, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x6c,
+	0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x59, 0x0a, 0x07, 0x6c, 0x6f, 0x67,
+	0x69, 0x63, 0x61, 0x6c, 0x18, 0xb8, 0xc7, 0x83, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x07, 0x6c, 0x6f, 0x67,
+	0x69, 0x63, 0x61, 0x6c, 0x12, 0x6a, 0x0a, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b,
+	0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd8, 0x96, 0xea, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x82, 0x41, 0x29, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x6d, 0x6f,
+	0x64, 0x65, 0x52, 0x0c, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65,
+	0x12, 0x4c, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0xd5, 0x9a, 0xfb, 0x2d, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x22, 0x82, 0x41, 0x1f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6d, 0x74, 0x75, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x52,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xee, 0xf4, 0x8a, 0xf0, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x23, 0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0xf2, 0xca, 0xa6, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x47, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x6a, 0x0a,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0xe3, 0xd3, 0xe3, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x2d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x65, 0x6e, 0x75,
+	0x6d, 0x73, 0x2e, 0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x23,
+	0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x74,
+	0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xbe, 0x10, 0x0a, 0x08, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x13, 0x63, 0x61, 0x72, 0x72, 0x69,
+	0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xba,
+	0xc1, 0x90, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3b, 0x82,
+	0x41, 0x38, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x2d, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x63, 0x61, 0x72, 0x72,
+	0x69, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7e,
+	0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70,
+	0x6b, 0x74, 0x73, 0x18, 0x85, 0x96, 0xce, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x62,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69,
+	0x6e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x6c,
+	0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xfa, 0x95,
+	0xdb, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x33, 0x82, 0x41, 0x30,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x52, 0x0a, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xea, 0xcd, 0xe2, 0xd9, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x31, 0x82, 0x41, 0x2e, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
+	0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x45,
+	0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x69, 0x6e, 0x5f, 0x66, 0x63, 0x73, 0x5f,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xf3, 0xdd, 0x94, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x35, 0x82, 0x41, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69,
+	0x6e, 0x2d, 0x66, 0x63, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x0b, 0x69, 0x6e,
+	0x46, 0x63, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x7d, 0x0a, 0x11, 0x69, 0x6e, 0x5f,
+	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0x88,
+	0xb3, 0x81, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x39, 0x82, 0x41,
+	0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69,
+	0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x09, 0x69, 0x6e, 0x5f, 0x6f,
+	0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xcb, 0x97, 0xed, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x31, 0x82, 0x41, 0x2e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e,
+	0x2d, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x4f, 0x63, 0x74, 0x65, 0x74,
+	0x73, 0x12, 0x61, 0x0a, 0x07, 0x69, 0x6e, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xe3, 0xfb, 0xed,
+	0xc4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x82, 0x41, 0x2c,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e,
+	0x50, 0x6b, 0x74, 0x73, 0x12, 0x78, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xf3, 0xf5, 0x89, 0x82, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x37, 0x82, 0x41, 0x34, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f,
+	0x69, 0x6e, 0x2d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52,
+	0x0d, 0x69, 0x6e, 0x55, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x7d,
+	0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x73, 0x18, 0xa9, 0xbf, 0x92, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75, 0x6e,
+	0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x0f, 0x69, 0x6e,
+	0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x69, 0x0a,
+	0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x18, 0xc7, 0xb9, 0xd9, 0x58,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+	0x72, 0x73, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x09, 0x6c,
+	0x61, 0x73, 0x74, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x6f, 0x75, 0x74,
+	0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18,
+	0xe4, 0xef, 0xb9, 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3a,
+	0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x62, 0x72, 0x6f, 0x61,
+	0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x42,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x6f, 0x0a, 0x0c,
+	0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xc7, 0xa5, 0x92,
+	0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x34, 0x82, 0x41, 0x31, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x52, 0x0b, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x6a, 0x0a,
+	0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xc7, 0xec, 0xd1, 0xe0,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x09,
+	0x6f, 0x75, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x6f, 0x75,
+	0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73,
+	0x18, 0xf5, 0xb0, 0xa8, 0xda, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x3a, 0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6d, 0x75, 0x6c,
+	0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74,
+	0x4d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x69, 0x0a,
+	0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xca, 0xb3, 0xec, 0x5f,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+	0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x09, 0x6f,
+	0x75, 0x74, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x12, 0x64, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x5f,
+	0x70, 0x6b, 0x74, 0x73, 0x18, 0x8a, 0xf2, 0xd3, 0xd0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x30, 0x82, 0x41, 0x2d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74,
+	0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x7a,
+	0x0a, 0x10, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b,
+	0x74, 0x73, 0x18, 0xa6, 0xae, 0xb6, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x38, 0x82, 0x41, 0x35, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x75, 0x6e,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x55,
+	0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x41,
+	0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44,
+	0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10,
+	0x00, 0x12, 0x19, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
+	0x5f, 0x55, 0x50, 0x10, 0x01, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1d, 0x0a, 0x10,
+	0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57, 0x4e,
+	0x10, 0x02, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x23, 0x0a, 0x13, 0x41,
+	0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x03, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47,
+	0x22, 0xa8, 0x02, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e,
+	0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12,
+	0x1c, 0x0a, 0x0f, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f,
+	0x57, 0x4e, 0x10, 0x03, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a,
+	0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54,
+	0x49, 0x4e, 0x47, 0x10, 0x04, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e,
+	0x47, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x55, 0x4e,
+	0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x10, 0x06, 0x1a, 0x0a, 0x82,
+	0x41, 0x07, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x12, 0x2a, 0x0a, 0x16, 0x4f, 0x50, 0x45,
+	0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x53,
+	0x45, 0x4e, 0x54, 0x10, 0x07, 0x1a, 0x0e, 0x82, 0x41, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52,
+	0x45, 0x53, 0x45, 0x4e, 0x54, 0x12, 0x34, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f,
+	0x44, 0x4f, 0x57, 0x4e, 0x10, 0x08, 0x1a, 0x13, 0x82, 0x41, 0x10, 0x4c, 0x4f, 0x57, 0x45, 0x52,
+	0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x1a, 0xa8, 0x2c, 0x0a, 0x0d,
+	0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x12, 0xb1, 0x01,
+	0x0a, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x83,
+	0xa8, 0xd1, 0xdd, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x54, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x33,
+	0x82, 0x41, 0x30, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x1a, 0x86, 0x29, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x84, 0x9f,
+	0xb9, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x42, 0x3a, 0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0xac, 0x01, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x9d,
+	0x89, 0xae, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x1a, 0xf6, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x83,
+	0x01, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xdf,
+	0xe7, 0xea, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x46, 0x82, 0x41, 0x43, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x64, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x75, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
+	0xa6, 0xef, 0xdd, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x42,
+	0x82, 0x41, 0x3f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x6f, 0x0a, 0x05, 0x69,
+	0x6e, 0x64, 0x65, 0x78, 0x18, 0x95, 0xa3, 0x95, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x40, 0x82, 0x41, 0x3d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x9b, 0x23, 0x0a,
+	0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0xd1, 0x01, 0x0a, 0x0c, 0x61, 0x64, 0x6d, 0x69, 0x6e,
+	0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x81, 0xc3, 0x77, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x63, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x46, 0x82, 0x41, 0x43, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x61,
+	0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xc4, 0x01, 0x0a, 0x08, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0xdf, 0x80, 0xc3, 0xe6, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x60, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x42, 0x42, 0x82, 0x41, 0x3f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
+	0x73, 0x12, 0x81, 0x01, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0xe6, 0xa7, 0xe8, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x45, 0x82, 0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
+	0x18, 0xb3, 0xe8, 0xb3, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x41, 0x82, 0x41, 0x3e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x74, 0x0a, 0x07, 0x69,
+	0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xe7, 0xa0, 0x91, 0xf4, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0x82, 0x41, 0x3e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x12, 0x6d, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x9c, 0xaa, 0xc0, 0x26, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3f, 0x82, 0x41, 0x3c, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78,
+	0x12, 0x7e, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18,
+	0x89, 0x9d, 0xa1, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x45, 0x82,
+	0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x12, 0x74, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x18, 0xf1, 0xf6, 0x9f, 0x8c,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0x82, 0x41, 0x3e, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x07, 0x6c,
+	0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x6d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xf9,
+	0xfb, 0x99, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x3e, 0x82, 0x41, 0x3b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xce, 0x01, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xdf, 0xa0, 0xd6, 0xbf, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x62, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x42, 0x45, 0x82, 0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6f,
+	0x70, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0xb0, 0x14, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x5f,
+	0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x95, 0xa6, 0xa5, 0x43,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x56, 0x82, 0x41, 0x53, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x61,
+	0x72, 0x72, 0x69, 0x65, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x12, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x62, 0x72, 0x6f,
+	0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xb6, 0x8e, 0xab, 0x39,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e,
+	0x2d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52,
+	0x0f, 0x69, 0x6e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73,
+	0x12, 0x88, 0x01, 0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x18, 0x9d, 0xdd, 0xcf, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x4e, 0x82, 0x41, 0x4b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x52,
+	0x0a, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xa9, 0x9b, 0xba, 0x98, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4c, 0x82, 0x41, 0x49, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x12, 0x8c, 0x01, 0x0a, 0x0d, 0x69, 0x6e, 0x5f, 0x66, 0x63, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x73, 0x18, 0xf8, 0xaa, 0xff, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x50, 0x82, 0x41, 0x4d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x66, 0x63, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x73, 0x52, 0x0b, 0x69, 0x6e, 0x46, 0x63, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12,
+	0x99, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74,
+	0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xeb, 0x82, 0xf1, 0x98, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69, 0x6e, 0x4d, 0x75,
+	0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xac, 0x99, 0xe9, 0xfc, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4c, 0x82, 0x41, 0x49, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d,
+	0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73,
+	0x12, 0x7c, 0x0a, 0x07, 0x69, 0x6e, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xc8, 0xee, 0xad, 0xd2,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4a, 0x82, 0x41, 0x47, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69,
+	0x6e, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x92,
+	0x01, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b,
+	0x74, 0x73, 0x18, 0xa0, 0xb6, 0xe6, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x52, 0x82, 0x41, 0x4f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d,
+	0x70, 0x6b, 0x74, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x55, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50,
+	0x6b, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f,
+	0x77, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x18, 0xa6, 0xe4, 0xd2, 0x45, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69,
+	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75,
+	0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x0f, 0x69,
+	0x6e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x85,
+	0x01, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x18, 0xf6, 0x89,
+	0x83, 0xf7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4d, 0x82, 0x41,
+	0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73,
+	0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x09, 0x6c, 0x61, 0x73,
+	0x74, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x12, 0x9c, 0x01, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x5f, 0x62,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xfd, 0x8e,
+	0x80, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x55, 0x82, 0x41,
+	0x52, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73,
+	0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70,
+	0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73,
+	0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69,
+	0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xb2, 0xc4, 0x89, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x4f, 0x82, 0x41, 0x4c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x64, 0x69, 0x73,
+	0x63, 0x61, 0x72, 0x64, 0x73, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72,
+	0x64, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x18, 0xe2, 0xa0, 0xc1, 0xde, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x4d, 0x82, 0x41, 0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52,
+	0x09, 0x6f, 0x75, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x12, 0x6f,
+	0x75, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74,
+	0x73, 0x18, 0x80, 0xfc, 0xc2, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x55, 0x82, 0x41, 0x52, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x4d, 0x75, 0x6c, 0x74,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x0a, 0x6f, 0x75,
+	0x74, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xa3, 0x8e, 0x8f, 0x18, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4d, 0x82, 0x41, 0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6f,
+	0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73,
+	0x12, 0x7e, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0x9b, 0xae, 0x88,
+	0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4b, 0x82, 0x41, 0x48, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f,
+	0x75, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x50, 0x6b, 0x74, 0x73,
+	0x12, 0x96, 0x01, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74,
+	0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xbb, 0x85, 0x87, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x53, 0x82, 0x41, 0x50, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x75, 0x6e, 0x69,
+	0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x55, 0x6e,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x41, 0x64,
+	0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x4d,
+	0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00,
+	0x12, 0x19, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x55, 0x50, 0x10, 0x01, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1d, 0x0a, 0x10, 0x41,
+	0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10,
+	0x02, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x23, 0x0a, 0x13, 0x41, 0x44,
+	0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e,
+	0x47, 0x10, 0x03, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x22,
+	0xa8, 0x02, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14,
+	0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53,
+	0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1c,
+	0x0a, 0x0f, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57,
+	0x4e, 0x10, 0x03, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12,
+	0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x04, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47,
+	0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55,
+	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x55, 0x4e, 0x4b,
+	0x4e, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x10, 0x06, 0x1a, 0x0a, 0x82, 0x41,
+	0x07, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x12, 0x2a, 0x0a, 0x16, 0x4f, 0x50, 0x45, 0x52,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45,
+	0x4e, 0x54, 0x10, 0x07, 0x1a, 0x0e, 0x82, 0x41, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45,
+	0x53, 0x45, 0x4e, 0x54, 0x12, 0x34, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44,
+	0x4f, 0x57, 0x4e, 0x10, 0x08, 0x1a, 0x13, 0x82, 0x41, 0x10, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f,
+	0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x1a, 0xd9, 0x01, 0x0a, 0x0f, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x4f,
+	0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x39, 0x82,
+	0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12,
+	0x75, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x51, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0x82, 0x41, 0x1a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x42, 0x20, 0x5a, 0x1e, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68,
+	0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 0x6e, 0x2f, 0x67, 0x6f, 0x73,
+	0x64, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescOnce sync.Once
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData = file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc
+)
+
+func file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP() []byte {
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescOnce.Do(func() {
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData)
+	})
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData
+}
+
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes = []interface{}{
+	(Interfaces_Interface_State_AdminStatus)(0),                            // 0: openconfig.openconfig_interfaces.Interfaces.Interface.State.AdminStatus
+	(Interfaces_Interface_State_OperStatus)(0),                             // 1: openconfig.openconfig_interfaces.Interfaces.Interface.State.OperStatus
+	(Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus)(0), // 2: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.AdminStatus
+	(Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus)(0),  // 3: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.OperStatus
+	(*Interfaces)(nil),                                                     // 4: openconfig.openconfig_interfaces.Interfaces
+	(*Interfaces_Interface)(nil),                                           // 5: openconfig.openconfig_interfaces.Interfaces.Interface
+	(*Interfaces_InterfaceKey)(nil),                                        // 6: openconfig.openconfig_interfaces.Interfaces.InterfaceKey
+	(*Interfaces_Interface_Config)(nil),                                    // 7: openconfig.openconfig_interfaces.Interfaces.Interface.Config
+	(*Interfaces_Interface_HoldTime)(nil),                                  // 8: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime
+	(*Interfaces_Interface_State)(nil),                                     // 9: openconfig.openconfig_interfaces.Interfaces.Interface.State
+	(*Interfaces_Interface_Subinterfaces)(nil),                             // 10: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces
+	(*Interfaces_Interface_HoldTime_Config)(nil),                           // 11: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config
+	(*Interfaces_Interface_HoldTime_State)(nil),                            // 12: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State
+	(*Interfaces_Interface_State_Counters)(nil),                            // 13: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters
+	(*Interfaces_Interface_Subinterfaces_Subinterface)(nil),                // 14: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface
+	(*Interfaces_Interface_Subinterfaces_SubinterfaceKey)(nil),             // 15: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey
+	(*Interfaces_Interface_Subinterfaces_Subinterface_Config)(nil),         // 16: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config
+	(*Interfaces_Interface_Subinterfaces_Subinterface_State)(nil),          // 17: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State
+	(*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters)(nil), // 18: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters
+	(*ywrapper.StringValue)(nil),                                           // 19: ywrapper.StringValue
+	(*ywrapper.BoolValue)(nil),                                             // 20: ywrapper.BoolValue
+	(*ywrapper.UintValue)(nil),                                             // 21: ywrapper.UintValue
+	(IETFInterfacesInterfaceType)(0),                                       // 22: openconfig.enums.IETFInterfacesInterfaceType
+}
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs = []int32{
+	6,  // 0: openconfig.openconfig_interfaces.Interfaces.interface:type_name -> openconfig.openconfig_interfaces.Interfaces.InterfaceKey
+	7,  // 1: openconfig.openconfig_interfaces.Interfaces.Interface.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Config
+	8,  // 2: openconfig.openconfig_interfaces.Interfaces.Interface.hold_time:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime
+	9,  // 3: openconfig.openconfig_interfaces.Interfaces.Interface.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State
+	10, // 4: openconfig.openconfig_interfaces.Interfaces.Interface.subinterfaces:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces
+	5,  // 5: openconfig.openconfig_interfaces.Interfaces.InterfaceKey.interface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface
+	19, // 6: openconfig.openconfig_interfaces.Interfaces.Interface.Config.description:type_name -> ywrapper.StringValue
+	20, // 7: openconfig.openconfig_interfaces.Interfaces.Interface.Config.enabled:type_name -> ywrapper.BoolValue
+	20, // 8: openconfig.openconfig_interfaces.Interfaces.Interface.Config.loopback_mode:type_name -> ywrapper.BoolValue
+	21, // 9: openconfig.openconfig_interfaces.Interfaces.Interface.Config.mtu:type_name -> ywrapper.UintValue
+	19, // 10: openconfig.openconfig_interfaces.Interfaces.Interface.Config.name:type_name -> ywrapper.StringValue
+	22, // 11: openconfig.openconfig_interfaces.Interfaces.Interface.Config.type:type_name -> openconfig.enums.IETFInterfacesInterfaceType
+	11, // 12: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config
+	12, // 13: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State
+	0,  // 14: openconfig.openconfig_interfaces.Interfaces.Interface.State.admin_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.AdminStatus
+	13, // 15: openconfig.openconfig_interfaces.Interfaces.Interface.State.counters:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters
+	19, // 16: openconfig.openconfig_interfaces.Interfaces.Interface.State.description:type_name -> ywrapper.StringValue
+	20, // 17: openconfig.openconfig_interfaces.Interfaces.Interface.State.enabled:type_name -> ywrapper.BoolValue
+	21, // 18: openconfig.openconfig_interfaces.Interfaces.Interface.State.ifindex:type_name -> ywrapper.UintValue
+	21, // 19: openconfig.openconfig_interfaces.Interfaces.Interface.State.last_change:type_name -> ywrapper.UintValue
+	20, // 20: openconfig.openconfig_interfaces.Interfaces.Interface.State.logical:type_name -> ywrapper.BoolValue
+	20, // 21: openconfig.openconfig_interfaces.Interfaces.Interface.State.loopback_mode:type_name -> ywrapper.BoolValue
+	21, // 22: openconfig.openconfig_interfaces.Interfaces.Interface.State.mtu:type_name -> ywrapper.UintValue
+	19, // 23: openconfig.openconfig_interfaces.Interfaces.Interface.State.name:type_name -> ywrapper.StringValue
+	1,  // 24: openconfig.openconfig_interfaces.Interfaces.Interface.State.oper_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.OperStatus
+	22, // 25: openconfig.openconfig_interfaces.Interfaces.Interface.State.type:type_name -> openconfig.enums.IETFInterfacesInterfaceType
+	15, // 26: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.subinterface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey
+	21, // 27: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config.down:type_name -> ywrapper.UintValue
+	21, // 28: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config.up:type_name -> ywrapper.UintValue
+	21, // 29: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State.down:type_name -> ywrapper.UintValue
+	21, // 30: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State.up:type_name -> ywrapper.UintValue
+	21, // 31: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.carrier_transitions:type_name -> ywrapper.UintValue
+	21, // 32: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 33: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_discards:type_name -> ywrapper.UintValue
+	21, // 34: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_errors:type_name -> ywrapper.UintValue
+	21, // 35: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_fcs_errors:type_name -> ywrapper.UintValue
+	21, // 36: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 37: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_octets:type_name -> ywrapper.UintValue
+	21, // 38: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_pkts:type_name -> ywrapper.UintValue
+	21, // 39: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_unicast_pkts:type_name -> ywrapper.UintValue
+	21, // 40: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_unknown_protos:type_name -> ywrapper.UintValue
+	21, // 41: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.last_clear:type_name -> ywrapper.UintValue
+	21, // 42: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 43: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_discards:type_name -> ywrapper.UintValue
+	21, // 44: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_errors:type_name -> ywrapper.UintValue
+	21, // 45: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 46: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_octets:type_name -> ywrapper.UintValue
+	21, // 47: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_pkts:type_name -> ywrapper.UintValue
+	21, // 48: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_unicast_pkts:type_name -> ywrapper.UintValue
+	16, // 49: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config
+	17, // 50: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State
+	14, // 51: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey.subinterface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface
+	19, // 52: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.description:type_name -> ywrapper.StringValue
+	20, // 53: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.enabled:type_name -> ywrapper.BoolValue
+	21, // 54: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.index:type_name -> ywrapper.UintValue
+	2,  // 55: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.admin_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.AdminStatus
+	18, // 56: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.counters:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters
+	19, // 57: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.description:type_name -> ywrapper.StringValue
+	20, // 58: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.enabled:type_name -> ywrapper.BoolValue
+	21, // 59: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.ifindex:type_name -> ywrapper.UintValue
+	21, // 60: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.index:type_name -> ywrapper.UintValue
+	21, // 61: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.last_change:type_name -> ywrapper.UintValue
+	20, // 62: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.logical:type_name -> ywrapper.BoolValue
+	19, // 63: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.name:type_name -> ywrapper.StringValue
+	3,  // 64: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.oper_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.OperStatus
+	21, // 65: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.carrier_transitions:type_name -> ywrapper.UintValue
+	21, // 66: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 67: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_discards:type_name -> ywrapper.UintValue
+	21, // 68: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_errors:type_name -> ywrapper.UintValue
+	21, // 69: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_fcs_errors:type_name -> ywrapper.UintValue
+	21, // 70: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 71: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_octets:type_name -> ywrapper.UintValue
+	21, // 72: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_pkts:type_name -> ywrapper.UintValue
+	21, // 73: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_unicast_pkts:type_name -> ywrapper.UintValue
+	21, // 74: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_unknown_protos:type_name -> ywrapper.UintValue
+	21, // 75: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.last_clear:type_name -> ywrapper.UintValue
+	21, // 76: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 77: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_discards:type_name -> ywrapper.UintValue
+	21, // 78: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_errors:type_name -> ywrapper.UintValue
+	21, // 79: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 80: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_octets:type_name -> ywrapper.UintValue
+	21, // 81: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_pkts:type_name -> ywrapper.UintValue
+	21, // 82: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_unicast_pkts:type_name -> ywrapper.UintValue
+	83, // [83:83] is the sub-list for method output_type
+	83, // [83:83] is the sub-list for method input_type
+	83, // [83:83] is the sub-list for extension type_name
+	83, // [83:83] is the sub-list for extension extendee
+	0,  // [0:83] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_init() }
+func file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_init() {
+	if File_openconfig_openconfig_interfaces_openconfig_interfaces_proto != nil {
+		return
+	}
+	file_openconfig_enums_enums_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_InterfaceKey); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_State_Counters); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_SubinterfaceKey); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc,
+			NumEnums:      4,
+			NumMessages:   15,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes,
+		DependencyIndexes: file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs,
+		EnumInfos:         file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes,
+		MessageInfos:      file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes,
+	}.Build()
+	File_openconfig_openconfig_interfaces_openconfig_interfaces_proto = out.File
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc = nil
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes = nil
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs = nil
+}
diff --git a/api/proto/openconfig/enums/enums.pb.go b/api/proto/openconfig/enums/enums.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..3ebe5d22cb235af6c9be0a89d56ccb33c9604f4c
--- /dev/null
+++ b/api/proto/openconfig/enums/enums.pb.go
@@ -0,0 +1,149 @@
+// openconfig.enums is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/enums/enums.proto
+
+package openconfig_enums
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	_ "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// IETFInterfacesInterfaceType represents an enumerated type generated for the YANG identity interface-type.
+type IETFInterfacesInterfaceType int32
+
+const (
+	IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET IETFInterfacesInterfaceType = 0
+)
+
+// Enum value maps for IETFInterfacesInterfaceType.
+var (
+	IETFInterfacesInterfaceType_name = map[int32]string{
+		0: "IETFINTERFACESINTERFACETYPE_UNSET",
+	}
+	IETFInterfacesInterfaceType_value = map[string]int32{
+		"IETFINTERFACESINTERFACETYPE_UNSET": 0,
+	}
+)
+
+func (x IETFInterfacesInterfaceType) Enum() *IETFInterfacesInterfaceType {
+	p := new(IETFInterfacesInterfaceType)
+	*p = x
+	return p
+}
+
+func (x IETFInterfacesInterfaceType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (IETFInterfacesInterfaceType) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_enums_enums_proto_enumTypes[0].Descriptor()
+}
+
+func (IETFInterfacesInterfaceType) Type() protoreflect.EnumType {
+	return &file_openconfig_enums_enums_proto_enumTypes[0]
+}
+
+func (x IETFInterfacesInterfaceType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use IETFInterfacesInterfaceType.Descriptor instead.
+func (IETFInterfacesInterfaceType) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_enums_enums_proto_rawDescGZIP(), []int{0}
+}
+
+var File_openconfig_enums_enums_proto protoreflect.FileDescriptor
+
+var file_openconfig_enums_enums_proto_rawDesc = []byte{
+	0x0a, 0x1c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x75,
+	0x6d, 0x73, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
+	0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78,
+	0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2a, 0x44, 0x0a, 0x1b,
+	0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x21, 0x49,
+	0x45, 0x54, 0x46, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x53, 0x49, 0x4e, 0x54,
+	0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54,
+	0x10, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_enums_enums_proto_rawDescOnce sync.Once
+	file_openconfig_enums_enums_proto_rawDescData = file_openconfig_enums_enums_proto_rawDesc
+)
+
+func file_openconfig_enums_enums_proto_rawDescGZIP() []byte {
+	file_openconfig_enums_enums_proto_rawDescOnce.Do(func() {
+		file_openconfig_enums_enums_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_enums_enums_proto_rawDescData)
+	})
+	return file_openconfig_enums_enums_proto_rawDescData
+}
+
+var file_openconfig_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_openconfig_enums_enums_proto_goTypes = []interface{}{
+	(IETFInterfacesInterfaceType)(0), // 0: openconfig.enums.IETFInterfacesInterfaceType
+}
+var file_openconfig_enums_enums_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_enums_enums_proto_init() }
+func file_openconfig_enums_enums_proto_init() {
+	if File_openconfig_enums_enums_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_enums_enums_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_enums_enums_proto_goTypes,
+		DependencyIndexes: file_openconfig_enums_enums_proto_depIdxs,
+		EnumInfos:         file_openconfig_enums_enums_proto_enumTypes,
+	}.Build()
+	File_openconfig_enums_enums_proto = out.File
+	file_openconfig_enums_enums_proto_rawDesc = nil
+	file_openconfig_enums_enums_proto_goTypes = nil
+	file_openconfig_enums_enums_proto_depIdxs = nil
+}
diff --git a/api/proto/openconfig/enums/enums.proto b/api/proto/openconfig/enums/enums.proto
new file mode 100644
index 0000000000000000000000000000000000000000..9e536252c00769cef506fdd5a9278d66403a00fd
--- /dev/null
+++ b/api/proto/openconfig/enums/enums.proto
@@ -0,0 +1,19 @@
+// openconfig.enums is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+syntax = "proto3";
+
+package openconfig.enums;
+option go_package = "code.fbi.h-da.de/cocsn/gosdn";
+
+import "github.com/openconfig/ygot/proto/ywrapper/ywrapper.proto";
+import "github.com/openconfig/ygot/proto/yext/yext.proto";
+
+// IETFInterfacesInterfaceType represents an enumerated type generated for the YANG identity interface-type.
+enum IETFInterfacesInterfaceType {
+  IETFINTERFACESINTERFACETYPE_UNSET = 0;
+}
diff --git a/api/proto/openconfig/openconfig.pb.go b/api/proto/openconfig/openconfig.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..e52dc21419f2a632f463b6d7af4dbc430d89235c
--- /dev/null
+++ b/api/proto/openconfig/openconfig.pb.go
@@ -0,0 +1,175 @@
+// openconfig is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/openconfig.proto
+
+package openconfig
+
+import (
+	openconfig_interfaces "code.fbi.h-da.de/cocsn/gosdn/api/proto/openconfig/openconfig_interfaces"
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	_ "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type Device struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Interfaces *openconfig_interfaces.Interfaces `protobuf:"bytes,85031486,opt,name=interfaces,proto3" json:"interfaces,omitempty"`
+}
+
+func (x *Device) Reset() {
+	*x = Device{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Device) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Device) ProtoMessage() {}
+
+func (x *Device) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_proto_msgTypes[0]
+	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 Device.ProtoReflect.Descriptor instead.
+func (*Device) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Device) GetInterfaces() *openconfig_interfaces.Interfaces {
+	if x != nil {
+		return x.Interfaces
+	}
+	return nil
+}
+
+var File_openconfig_openconfig_proto protoreflect.FileDescriptor
+
+var file_openconfig_openconfig_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0x69, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a,
+	0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0xbe, 0xf4, 0xc5, 0x28,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x42, 0x0e, 0x82, 0x41, 0x0b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_openconfig_proto_rawDescOnce sync.Once
+	file_openconfig_openconfig_proto_rawDescData = file_openconfig_openconfig_proto_rawDesc
+)
+
+func file_openconfig_openconfig_proto_rawDescGZIP() []byte {
+	file_openconfig_openconfig_proto_rawDescOnce.Do(func() {
+		file_openconfig_openconfig_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_openconfig_proto_rawDescData)
+	})
+	return file_openconfig_openconfig_proto_rawDescData
+}
+
+var file_openconfig_openconfig_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
+var file_openconfig_openconfig_proto_goTypes = []interface{}{
+	(*Device)(nil),                           // 0: openconfig.Device
+	(*openconfig_interfaces.Interfaces)(nil), // 1: openconfig.openconfig_interfaces.Interfaces
+}
+var file_openconfig_openconfig_proto_depIdxs = []int32{
+	1, // 0: openconfig.Device.interfaces:type_name -> openconfig.openconfig_interfaces.Interfaces
+	1, // [1:1] is the sub-list for method output_type
+	1, // [1:1] is the sub-list for method input_type
+	1, // [1:1] is the sub-list for extension type_name
+	1, // [1:1] is the sub-list for extension extendee
+	0, // [0:1] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_openconfig_proto_init() }
+func file_openconfig_openconfig_proto_init() {
+	if File_openconfig_openconfig_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_openconfig_openconfig_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Device); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_openconfig_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   1,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_openconfig_proto_goTypes,
+		DependencyIndexes: file_openconfig_openconfig_proto_depIdxs,
+		MessageInfos:      file_openconfig_openconfig_proto_msgTypes,
+	}.Build()
+	File_openconfig_openconfig_proto = out.File
+	file_openconfig_openconfig_proto_rawDesc = nil
+	file_openconfig_openconfig_proto_goTypes = nil
+	file_openconfig_openconfig_proto_depIdxs = nil
+}
diff --git a/api/proto/openconfig/openconfig.proto b/api/proto/openconfig/openconfig.proto
new file mode 100644
index 0000000000000000000000000000000000000000..c2b37bb0386d95ed45beea0ca8ee920049928253
--- /dev/null
+++ b/api/proto/openconfig/openconfig.proto
@@ -0,0 +1,20 @@
+// openconfig is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+syntax = "proto3";
+
+package openconfig;
+option go_package = "code.fbi.h-da.de/cocsn/gosdn";
+
+
+import "github.com/openconfig/ygot/proto/ywrapper/ywrapper.proto";
+import "github.com/openconfig/ygot/proto/yext/yext.proto";
+import "openconfig/openconfig_interfaces/openconfig_interfaces.proto";
+
+message Device {
+  openconfig_interfaces.Interfaces interfaces = 85031486 [(yext.schemapath) = "/interfaces"];
+}
diff --git a/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.pb.go b/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.pb.go
new file mode 100644
index 0000000000000000000000000000000000000000..26ca33432b263e485c6c7ca994bb76caf72992d6
--- /dev/null
+++ b/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.pb.go
@@ -0,0 +1,2620 @@
+// openconfig.openconfig_interfaces is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.13.0
+// source: openconfig/openconfig_interfaces/openconfig_interfaces.proto
+
+package openconfig_openconfig_interfaces
+
+import (
+	enums "code.fbi.h-da.de/cocsn/gosdn/api/proto/openconfig/enums"
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/openconfig/ygot/proto/yext"
+	ywrapper "github.com/openconfig/ygot/proto/ywrapper"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+type Interfaces_Interface_State_AdminStatus int32
+
+const (
+	Interfaces_Interface_State_ADMINSTATUS_UNSET   Interfaces_Interface_State_AdminStatus = 0
+	Interfaces_Interface_State_ADMINSTATUS_UP      Interfaces_Interface_State_AdminStatus = 1
+	Interfaces_Interface_State_ADMINSTATUS_DOWN    Interfaces_Interface_State_AdminStatus = 2
+	Interfaces_Interface_State_ADMINSTATUS_TESTING Interfaces_Interface_State_AdminStatus = 3
+)
+
+// Enum value maps for Interfaces_Interface_State_AdminStatus.
+var (
+	Interfaces_Interface_State_AdminStatus_name = map[int32]string{
+		0: "ADMINSTATUS_UNSET",
+		1: "ADMINSTATUS_UP",
+		2: "ADMINSTATUS_DOWN",
+		3: "ADMINSTATUS_TESTING",
+	}
+	Interfaces_Interface_State_AdminStatus_value = map[string]int32{
+		"ADMINSTATUS_UNSET":   0,
+		"ADMINSTATUS_UP":      1,
+		"ADMINSTATUS_DOWN":    2,
+		"ADMINSTATUS_TESTING": 3,
+	}
+)
+
+func (x Interfaces_Interface_State_AdminStatus) Enum() *Interfaces_Interface_State_AdminStatus {
+	p := new(Interfaces_Interface_State_AdminStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_State_AdminStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_State_AdminStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[0].Descriptor()
+}
+
+func (Interfaces_Interface_State_AdminStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[0]
+}
+
+func (x Interfaces_Interface_State_AdminStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_State_AdminStatus.Descriptor instead.
+func (Interfaces_Interface_State_AdminStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 0}
+}
+
+type Interfaces_Interface_State_OperStatus int32
+
+const (
+	Interfaces_Interface_State_OPERSTATUS_UNSET            Interfaces_Interface_State_OperStatus = 0
+	Interfaces_Interface_State_OPERSTATUS_UP               Interfaces_Interface_State_OperStatus = 2
+	Interfaces_Interface_State_OPERSTATUS_DOWN             Interfaces_Interface_State_OperStatus = 3
+	Interfaces_Interface_State_OPERSTATUS_TESTING          Interfaces_Interface_State_OperStatus = 4
+	Interfaces_Interface_State_OPERSTATUS_UNKNOWN          Interfaces_Interface_State_OperStatus = 5
+	Interfaces_Interface_State_OPERSTATUS_DORMANT          Interfaces_Interface_State_OperStatus = 6
+	Interfaces_Interface_State_OPERSTATUS_NOT_PRESENT      Interfaces_Interface_State_OperStatus = 7
+	Interfaces_Interface_State_OPERSTATUS_LOWER_LAYER_DOWN Interfaces_Interface_State_OperStatus = 8
+)
+
+// Enum value maps for Interfaces_Interface_State_OperStatus.
+var (
+	Interfaces_Interface_State_OperStatus_name = map[int32]string{
+		0: "OPERSTATUS_UNSET",
+		2: "OPERSTATUS_UP",
+		3: "OPERSTATUS_DOWN",
+		4: "OPERSTATUS_TESTING",
+		5: "OPERSTATUS_UNKNOWN",
+		6: "OPERSTATUS_DORMANT",
+		7: "OPERSTATUS_NOT_PRESENT",
+		8: "OPERSTATUS_LOWER_LAYER_DOWN",
+	}
+	Interfaces_Interface_State_OperStatus_value = map[string]int32{
+		"OPERSTATUS_UNSET":            0,
+		"OPERSTATUS_UP":               2,
+		"OPERSTATUS_DOWN":             3,
+		"OPERSTATUS_TESTING":          4,
+		"OPERSTATUS_UNKNOWN":          5,
+		"OPERSTATUS_DORMANT":          6,
+		"OPERSTATUS_NOT_PRESENT":      7,
+		"OPERSTATUS_LOWER_LAYER_DOWN": 8,
+	}
+)
+
+func (x Interfaces_Interface_State_OperStatus) Enum() *Interfaces_Interface_State_OperStatus {
+	p := new(Interfaces_Interface_State_OperStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_State_OperStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_State_OperStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[1].Descriptor()
+}
+
+func (Interfaces_Interface_State_OperStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[1]
+}
+
+func (x Interfaces_Interface_State_OperStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_State_OperStatus.Descriptor instead.
+func (Interfaces_Interface_State_OperStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 1}
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus int32
+
+const (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UNSET   Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 0
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UP      Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 1
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_DOWN    Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 2
+	Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_TESTING Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus = 3
+)
+
+// Enum value maps for Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus.
+var (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus_name = map[int32]string{
+		0: "ADMINSTATUS_UNSET",
+		1: "ADMINSTATUS_UP",
+		2: "ADMINSTATUS_DOWN",
+		3: "ADMINSTATUS_TESTING",
+	}
+	Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus_value = map[string]int32{
+		"ADMINSTATUS_UNSET":   0,
+		"ADMINSTATUS_UP":      1,
+		"ADMINSTATUS_DOWN":    2,
+		"ADMINSTATUS_TESTING": 3,
+	}
+)
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Enum() *Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus {
+	p := new(Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[2].Descriptor()
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[2]
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus.Descriptor instead.
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 0}
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus int32
+
+const (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNSET            Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 0
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UP               Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 2
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_DOWN             Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 3
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_TESTING          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 4
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNKNOWN          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 5
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_DORMANT          Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 6
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_NOT_PRESENT      Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 7
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_LOWER_LAYER_DOWN Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus = 8
+)
+
+// Enum value maps for Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus.
+var (
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus_name = map[int32]string{
+		0: "OPERSTATUS_UNSET",
+		2: "OPERSTATUS_UP",
+		3: "OPERSTATUS_DOWN",
+		4: "OPERSTATUS_TESTING",
+		5: "OPERSTATUS_UNKNOWN",
+		6: "OPERSTATUS_DORMANT",
+		7: "OPERSTATUS_NOT_PRESENT",
+		8: "OPERSTATUS_LOWER_LAYER_DOWN",
+	}
+	Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus_value = map[string]int32{
+		"OPERSTATUS_UNSET":            0,
+		"OPERSTATUS_UP":               2,
+		"OPERSTATUS_DOWN":             3,
+		"OPERSTATUS_TESTING":          4,
+		"OPERSTATUS_UNKNOWN":          5,
+		"OPERSTATUS_DORMANT":          6,
+		"OPERSTATUS_NOT_PRESENT":      7,
+		"OPERSTATUS_LOWER_LAYER_DOWN": 8,
+	}
+)
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Enum() *Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus {
+	p := new(Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus)
+	*p = x
+	return p
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[3].Descriptor()
+}
+
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Type() protoreflect.EnumType {
+	return &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes[3]
+}
+
+func (x Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus.Descriptor instead.
+func (Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus) EnumDescriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 1}
+}
+
+type Interfaces struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Interface []*Interfaces_InterfaceKey `protobuf:"bytes,422482938,rep,name=interface,proto3" json:"interface,omitempty"`
+}
+
+func (x *Interfaces) Reset() {
+	*x = Interfaces{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces) ProtoMessage() {}
+
+func (x *Interfaces) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0]
+	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 Interfaces.ProtoReflect.Descriptor instead.
+func (*Interfaces) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Interfaces) GetInterface() []*Interfaces_InterfaceKey {
+	if x != nil {
+		return x.Interface
+	}
+	return nil
+}
+
+type Interfaces_Interface struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config        *Interfaces_Interface_Config        `protobuf:"bytes,334174827,opt,name=config,proto3" json:"config,omitempty"`
+	HoldTime      *Interfaces_Interface_HoldTime      `protobuf:"bytes,175931092,opt,name=hold_time,json=holdTime,proto3" json:"hold_time,omitempty"`
+	State         *Interfaces_Interface_State         `protobuf:"bytes,387556140,opt,name=state,proto3" json:"state,omitempty"`
+	Subinterfaces *Interfaces_Interface_Subinterfaces `protobuf:"bytes,327798165,opt,name=subinterfaces,proto3" json:"subinterfaces,omitempty"`
+}
+
+func (x *Interfaces_Interface) Reset() {
+	*x = Interfaces_Interface{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface) ProtoMessage() {}
+
+func (x *Interfaces_Interface) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Interfaces_Interface) GetConfig() *Interfaces_Interface_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetHoldTime() *Interfaces_Interface_HoldTime {
+	if x != nil {
+		return x.HoldTime
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetState() *Interfaces_Interface_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface) GetSubinterfaces() *Interfaces_Interface_Subinterfaces {
+	if x != nil {
+		return x.Subinterfaces
+	}
+	return nil
+}
+
+type Interfaces_InterfaceKey struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name      string                `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Interface *Interfaces_Interface `protobuf:"bytes,2,opt,name=interface,proto3" json:"interface,omitempty"`
+}
+
+func (x *Interfaces_InterfaceKey) Reset() {
+	*x = Interfaces_InterfaceKey{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_InterfaceKey) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_InterfaceKey) ProtoMessage() {}
+
+func (x *Interfaces_InterfaceKey) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2]
+	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 Interfaces_InterfaceKey.ProtoReflect.Descriptor instead.
+func (*Interfaces_InterfaceKey) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *Interfaces_InterfaceKey) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Interfaces_InterfaceKey) GetInterface() *Interfaces_Interface {
+	if x != nil {
+		return x.Interface
+	}
+	return nil
+}
+
+type Interfaces_Interface_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Description  *ywrapper.StringValue             `protobuf:"bytes,418535860,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled      *ywrapper.BoolValue               `protobuf:"bytes,37224301,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	LoopbackMode *ywrapper.BoolValue               `protobuf:"bytes,253516347,opt,name=loopback_mode,json=loopbackMode,proto3" json:"loopback_mode,omitempty"`
+	Mtu          *ywrapper.UintValue               `protobuf:"bytes,376210342,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	Name         *ywrapper.StringValue             `protobuf:"bytes,51804187,opt,name=name,proto3" json:"name,omitempty"`
+	Type         enums.IETFInterfacesInterfaceType `protobuf:"varint,144596894,opt,name=type,proto3,enum=openconfig.enums.IETFInterfacesInterfaceType" json:"type,omitempty"`
+}
+
+func (x *Interfaces_Interface_Config) Reset() {
+	*x = Interfaces_Interface_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3]
+	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 Interfaces_Interface_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 0}
+}
+
+func (x *Interfaces_Interface_Config) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetLoopbackMode() *ywrapper.BoolValue {
+	if x != nil {
+		return x.LoopbackMode
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetMtu() *ywrapper.UintValue {
+	if x != nil {
+		return x.Mtu
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Config) GetType() enums.IETFInterfacesInterfaceType {
+	if x != nil {
+		return x.Type
+	}
+	return enums.IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET
+}
+
+type Interfaces_Interface_HoldTime struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config *Interfaces_Interface_HoldTime_Config `protobuf:"bytes,316512729,opt,name=config,proto3" json:"config,omitempty"`
+	State  *Interfaces_Interface_HoldTime_State  `protobuf:"bytes,483010990,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime) Reset() {
+	*x = Interfaces_Interface_HoldTime{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1}
+}
+
+func (x *Interfaces_Interface_HoldTime) GetConfig() *Interfaces_Interface_HoldTime_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime) GetState() *Interfaces_Interface_HoldTime_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+type Interfaces_Interface_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AdminStatus  Interfaces_Interface_State_AdminStatus `protobuf:"varint,474494763,opt,name=admin_status,json=adminStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_State_AdminStatus" json:"admin_status,omitempty"`
+	Counters     *Interfaces_Interface_State_Counters   `protobuf:"bytes,83645964,opt,name=counters,proto3" json:"counters,omitempty"`
+	Description  *ywrapper.StringValue                  `protobuf:"bytes,389435287,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled      *ywrapper.BoolValue                    `protobuf:"bytes,330927518,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Ifindex      *ywrapper.UintValue                    `protobuf:"bytes,116108202,opt,name=ifindex,proto3" json:"ifindex,omitempty"`
+	LastChange   *ywrapper.UintValue                    `protobuf:"bytes,127348880,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	Logical      *ywrapper.BoolValue                    `protobuf:"bytes,440460216,opt,name=logical,proto3" json:"logical,omitempty"`
+	LoopbackMode *ywrapper.BoolValue                    `protobuf:"bytes,372935512,opt,name=loopback_mode,json=loopbackMode,proto3" json:"loopback_mode,omitempty"`
+	Mtu          *ywrapper.UintValue                    `protobuf:"bytes,96390485,opt,name=mtu,proto3" json:"mtu,omitempty"`
+	Name         *ywrapper.StringValue                  `protobuf:"bytes,503495278,opt,name=name,proto3" json:"name,omitempty"`
+	OperStatus   Interfaces_Interface_State_OperStatus  `protobuf:"varint,470394226,opt,name=oper_status,json=operStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_State_OperStatus" json:"oper_status,omitempty"`
+	Type         enums.IETFInterfacesInterfaceType      `protobuf:"varint,358148579,opt,name=type,proto3,enum=openconfig.enums.IETFInterfacesInterfaceType" json:"type,omitempty"`
+}
+
+func (x *Interfaces_Interface_State) Reset() {
+	*x = Interfaces_Interface_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5]
+	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 Interfaces_Interface_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2}
+}
+
+func (x *Interfaces_Interface_State) GetAdminStatus() Interfaces_Interface_State_AdminStatus {
+	if x != nil {
+		return x.AdminStatus
+	}
+	return Interfaces_Interface_State_ADMINSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_State) GetCounters() *Interfaces_Interface_State_Counters {
+	if x != nil {
+		return x.Counters
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetIfindex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Ifindex
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLastChange() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastChange
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLogical() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Logical
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetLoopbackMode() *ywrapper.BoolValue {
+	if x != nil {
+		return x.LoopbackMode
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetMtu() *ywrapper.UintValue {
+	if x != nil {
+		return x.Mtu
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State) GetOperStatus() Interfaces_Interface_State_OperStatus {
+	if x != nil {
+		return x.OperStatus
+	}
+	return Interfaces_Interface_State_OPERSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_State) GetType() enums.IETFInterfacesInterfaceType {
+	if x != nil {
+		return x.Type
+	}
+	return enums.IETFInterfacesInterfaceType_IETFINTERFACESINTERFACETYPE_UNSET
+}
+
+type Interfaces_Interface_Subinterfaces struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Subinterface []*Interfaces_Interface_Subinterfaces_SubinterfaceKey `protobuf:"bytes,464802819,rep,name=subinterface,proto3" json:"subinterface,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces) Reset() {
+	*x = Interfaces_Interface_Subinterfaces{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3}
+}
+
+func (x *Interfaces_Interface_Subinterfaces) GetSubinterface() []*Interfaces_Interface_Subinterfaces_SubinterfaceKey {
+	if x != nil {
+		return x.Subinterface
+	}
+	return nil
+}
+
+type Interfaces_Interface_HoldTime_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Down *ywrapper.UintValue `protobuf:"bytes,171181656,opt,name=down,proto3" json:"down,omitempty"`
+	Up   *ywrapper.UintValue `protobuf:"bytes,62026235,opt,name=up,proto3" json:"up,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) Reset() {
+	*x = Interfaces_Interface_HoldTime_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1, 0}
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) GetDown() *ywrapper.UintValue {
+	if x != nil {
+		return x.Down
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime_Config) GetUp() *ywrapper.UintValue {
+	if x != nil {
+		return x.Up
+	}
+	return nil
+}
+
+type Interfaces_Interface_HoldTime_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Down *ywrapper.UintValue `protobuf:"bytes,167887721,opt,name=down,proto3" json:"down,omitempty"`
+	Up   *ywrapper.UintValue `protobuf:"bytes,223847598,opt,name=up,proto3" json:"up,omitempty"`
+}
+
+func (x *Interfaces_Interface_HoldTime_State) Reset() {
+	*x = Interfaces_Interface_HoldTime_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_HoldTime_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_HoldTime_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_HoldTime_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_HoldTime_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_HoldTime_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 1, 1}
+}
+
+func (x *Interfaces_Interface_HoldTime_State) GetDown() *ywrapper.UintValue {
+	if x != nil {
+		return x.Down
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_HoldTime_State) GetUp() *ywrapper.UintValue {
+	if x != nil {
+		return x.Up
+	}
+	return nil
+}
+
+type Interfaces_Interface_State_Counters struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CarrierTransitions *ywrapper.UintValue `protobuf:"bytes,270803130,opt,name=carrier_transitions,json=carrierTransitions,proto3" json:"carrier_transitions,omitempty"`
+	InBroadcastPkts    *ywrapper.UintValue `protobuf:"bytes,280201989,opt,name=in_broadcast_pkts,json=inBroadcastPkts,proto3" json:"in_broadcast_pkts,omitempty"`
+	InDiscards         *ywrapper.UintValue `protobuf:"bytes,11979514,opt,name=in_discards,json=inDiscards,proto3" json:"in_discards,omitempty"`
+	InErrors           *ywrapper.UintValue `protobuf:"bytes,456697578,opt,name=in_errors,json=inErrors,proto3" json:"in_errors,omitempty"`
+	InFcsErrors        *ywrapper.UintValue `protobuf:"bytes,501559027,opt,name=in_fcs_errors,json=inFcsErrors,proto3" json:"in_fcs_errors,omitempty"`
+	InMulticastPkts    *ywrapper.UintValue `protobuf:"bytes,113269128,opt,name=in_multicast_pkts,json=inMulticastPkts,proto3" json:"in_multicast_pkts,omitempty"`
+	InOctets           *ywrapper.UintValue `protobuf:"bytes,333138891,opt,name=in_octets,json=inOctets,proto3" json:"in_octets,omitempty"`
+	InPkts             *ywrapper.UintValue `protobuf:"bytes,412843491,opt,name=in_pkts,json=inPkts,proto3" json:"in_pkts,omitempty"`
+	InUnicastPkts      *ywrapper.UintValue `protobuf:"bytes,272792307,opt,name=in_unicast_pkts,json=inUnicastPkts,proto3" json:"in_unicast_pkts,omitempty"`
+	InUnknownProtos    *ywrapper.UintValue `protobuf:"bytes,241475497,opt,name=in_unknown_protos,json=inUnknownProtos,proto3" json:"in_unknown_protos,omitempty"`
+	LastClear          *ywrapper.UintValue `protobuf:"bytes,186014919,opt,name=last_clear,json=lastClear,proto3" json:"last_clear,omitempty"`
+	OutBroadcastPkts   *ywrapper.UintValue `protobuf:"bytes,338589668,opt,name=out_broadcast_pkts,json=outBroadcastPkts,proto3" json:"out_broadcast_pkts,omitempty"`
+	OutDiscards        *ywrapper.UintValue `protobuf:"bytes,254055111,opt,name=out_discards,json=outDiscards,proto3" json:"out_discards,omitempty"`
+	OutErrors          *ywrapper.UintValue `protobuf:"bytes,471103047,opt,name=out_errors,json=outErrors,proto3" json:"out_errors,omitempty"`
+	OutMulticastPkts   *ywrapper.UintValue `protobuf:"bytes,457840757,opt,name=out_multicast_pkts,json=outMulticastPkts,proto3" json:"out_multicast_pkts,omitempty"`
+	OutOctets          *ywrapper.UintValue `protobuf:"bytes,201005514,opt,name=out_octets,json=outOctets,proto3" json:"out_octets,omitempty"`
+	OutPkts            *ywrapper.UintValue `protobuf:"bytes,437582090,opt,name=out_pkts,json=outPkts,proto3" json:"out_pkts,omitempty"`
+	OutUnicastPkts     *ywrapper.UintValue `protobuf:"bytes,36542246,opt,name=out_unicast_pkts,json=outUnicastPkts,proto3" json:"out_unicast_pkts,omitempty"`
+}
+
+func (x *Interfaces_Interface_State_Counters) Reset() {
+	*x = Interfaces_Interface_State_Counters{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_State_Counters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_State_Counters) ProtoMessage() {}
+
+func (x *Interfaces_Interface_State_Counters) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9]
+	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 Interfaces_Interface_State_Counters.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_State_Counters) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 2, 0}
+}
+
+func (x *Interfaces_Interface_State_Counters) GetCarrierTransitions() *ywrapper.UintValue {
+	if x != nil {
+		return x.CarrierTransitions
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.InDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInFcsErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InFcsErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.InOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnicastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetInUnknownProtos() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnknownProtos
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetLastClear() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastClear
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_State_Counters) GetOutUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutUnicastPkts
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Config *Interfaces_Interface_Subinterfaces_Subinterface_Config `protobuf:"bytes,175001476,opt,name=config,proto3" json:"config,omitempty"`
+	State  *Interfaces_Interface_Subinterfaces_Subinterface_State  `protobuf:"bytes,501974173,opt,name=state,proto3" json:"state,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) GetConfig() *Interfaces_Interface_Subinterfaces_Subinterface_Config {
+	if x != nil {
+		return x.Config
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface) GetState() *Interfaces_Interface_Subinterfaces_Subinterface_State {
+	if x != nil {
+		return x.State
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_SubinterfaceKey struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Index        uint64                                           `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
+	Subinterface *Interfaces_Interface_Subinterfaces_Subinterface `protobuf:"bytes,2,opt,name=subinterface,proto3" json:"subinterface,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_SubinterfaceKey{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_SubinterfaceKey) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_SubinterfaceKey.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_SubinterfaceKey) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 1}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) GetIndex() uint64 {
+	if x != nil {
+		return x.Index
+	}
+	return 0
+}
+
+func (x *Interfaces_Interface_Subinterfaces_SubinterfaceKey) GetSubinterface() *Interfaces_Interface_Subinterfaces_Subinterface {
+	if x != nil {
+		return x.Subinterface
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_Config struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Description *ywrapper.StringValue `protobuf:"bytes,280671199,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled     *ywrapper.BoolValue   `protobuf:"bytes,297236390,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Index       *ywrapper.UintValue   `protobuf:"bytes,279269781,opt,name=index,proto3" json:"index,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_Config) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_Config.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_Config) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_Config) GetIndex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Index
+	}
+	return nil
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	AdminStatus Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus `protobuf:"varint,250658952,opt,name=admin_status,json=adminStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus" json:"admin_status,omitempty"`
+	Counters    *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters   `protobuf:"bytes,483442783,opt,name=counters,proto3" json:"counters,omitempty"`
+	Description *ywrapper.StringValue                                             `protobuf:"bytes,49943526,opt,name=description,proto3" json:"description,omitempty"`
+	Enabled     *ywrapper.BoolValue                                               `protobuf:"bytes,468513843,opt,name=enabled,proto3" json:"enabled,omitempty"`
+	Ifindex     *ywrapper.UintValue                                               `protobuf:"bytes,511987815,opt,name=ifindex,proto3" json:"ifindex,omitempty"`
+	Index       *ywrapper.UintValue                                               `protobuf:"bytes,80745756,opt,name=index,proto3" json:"index,omitempty"`
+	LastChange  *ywrapper.UintValue                                               `protobuf:"bytes,29904521,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	Logical     *ywrapper.BoolValue                                               `protobuf:"bytes,294124401,opt,name=logical,proto3" json:"logical,omitempty"`
+	Name        *ywrapper.StringValue                                             `protobuf:"bytes,279346681,opt,name=name,proto3" json:"name,omitempty"`
+	OperStatus  Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus  `protobuf:"varint,401969247,opt,name=oper_status,json=operStatus,proto3,enum=openconfig.openconfig_interfaces.Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus" json:"oper_status,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_State{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_State.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetAdminStatus() Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus {
+	if x != nil {
+		return x.AdminStatus
+	}
+	return Interfaces_Interface_Subinterfaces_Subinterface_State_ADMINSTATUS_UNSET
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetCounters() *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters {
+	if x != nil {
+		return x.Counters
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetDescription() *ywrapper.StringValue {
+	if x != nil {
+		return x.Description
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetEnabled() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Enabled
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetIfindex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Ifindex
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetIndex() *ywrapper.UintValue {
+	if x != nil {
+		return x.Index
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetLastChange() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastChange
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetLogical() *ywrapper.BoolValue {
+	if x != nil {
+		return x.Logical
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetName() *ywrapper.StringValue {
+	if x != nil {
+		return x.Name
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State) GetOperStatus() Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus {
+	if x != nil {
+		return x.OperStatus
+	}
+	return Interfaces_Interface_Subinterfaces_Subinterface_State_OPERSTATUS_UNSET
+}
+
+type Interfaces_Interface_Subinterfaces_Subinterface_State_Counters struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CarrierTransitions *ywrapper.UintValue `protobuf:"bytes,141120277,opt,name=carrier_transitions,json=carrierTransitions,proto3" json:"carrier_transitions,omitempty"`
+	InBroadcastPkts    *ywrapper.UintValue `protobuf:"bytes,120244022,opt,name=in_broadcast_pkts,json=inBroadcastPkts,proto3" json:"in_broadcast_pkts,omitempty"`
+	InDiscards         *ywrapper.UintValue `protobuf:"bytes,307490461,opt,name=in_discards,json=inDiscards,proto3" json:"in_discards,omitempty"`
+	InErrors           *ywrapper.UintValue `protobuf:"bytes,319720873,opt,name=in_errors,json=inErrors,proto3" json:"in_errors,omitempty"`
+	InFcsErrors        *ywrapper.UintValue `protobuf:"bytes,169858424,opt,name=in_fcs_errors,json=inFcsErrors,proto3" json:"in_fcs_errors,omitempty"`
+	InMulticastPkts    *ywrapper.UintValue `protobuf:"bytes,320618859,opt,name=in_multicast_pkts,json=inMulticastPkts,proto3" json:"in_multicast_pkts,omitempty"`
+	InOctets           *ywrapper.UintValue `protobuf:"bytes,530205868,opt,name=in_octets,json=inOctets,proto3" json:"in_octets,omitempty"`
+	InPkts             *ywrapper.UintValue `protobuf:"bytes,441153352,opt,name=in_pkts,json=inPkts,proto3" json:"in_pkts,omitempty"`
+	InUnicastPkts      *ywrapper.UintValue `protobuf:"bytes,177838880,opt,name=in_unicast_pkts,json=inUnicastPkts,proto3" json:"in_unicast_pkts,omitempty"`
+	InUnknownProtos    *ywrapper.UintValue `protobuf:"bytes,146059814,opt,name=in_unknown_protos,json=inUnknownProtos,proto3" json:"in_unknown_protos,omitempty"`
+	LastClear          *ywrapper.UintValue `protobuf:"bytes,518046966,opt,name=last_clear,json=lastClear,proto3" json:"last_clear,omitempty"`
+	OutBroadcastPkts   *ywrapper.UintValue `protobuf:"bytes,501221245,opt,name=out_broadcast_pkts,json=outBroadcastPkts,proto3" json:"out_broadcast_pkts,omitempty"`
+	OutDiscards        *ywrapper.UintValue `protobuf:"bytes,159539762,opt,name=out_discards,json=outDiscards,proto3" json:"out_discards,omitempty"`
+	OutErrors          *ywrapper.UintValue `protobuf:"bytes,466636898,opt,name=out_errors,json=outErrors,proto3" json:"out_errors,omitempty"`
+	OutMulticastPkts   *ywrapper.UintValue `protobuf:"bytes,326155776,opt,name=out_multicast_pkts,json=outMulticastPkts,proto3" json:"out_multicast_pkts,omitempty"`
+	OutOctets          *ywrapper.UintValue `protobuf:"bytes,50579235,opt,name=out_octets,json=outOctets,proto3" json:"out_octets,omitempty"`
+	OutPkts            *ywrapper.UintValue `protobuf:"bytes,29497115,opt,name=out_pkts,json=outPkts,proto3" json:"out_pkts,omitempty"`
+	OutUnicastPkts     *ywrapper.UintValue `protobuf:"bytes,297910971,opt,name=out_unicast_pkts,json=outUnicastPkts,proto3" json:"out_unicast_pkts,omitempty"`
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) Reset() {
+	*x = Interfaces_Interface_Subinterfaces_Subinterface_State_Counters{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) ProtoMessage() {}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) ProtoReflect() protoreflect.Message {
+	mi := &file_openconfig_openconfig_interfaces_openconfig_interfaces_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 Interfaces_Interface_Subinterfaces_Subinterface_State_Counters.ProtoReflect.Descriptor instead.
+func (*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) Descriptor() ([]byte, []int) {
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP(), []int{0, 0, 3, 0, 1, 0}
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetCarrierTransitions() *ywrapper.UintValue {
+	if x != nil {
+		return x.CarrierTransitions
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.InDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInFcsErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.InFcsErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.InOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnicastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetInUnknownProtos() *ywrapper.UintValue {
+	if x != nil {
+		return x.InUnknownProtos
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetLastClear() *ywrapper.UintValue {
+	if x != nil {
+		return x.LastClear
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutBroadcastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutBroadcastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutDiscards() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutDiscards
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutErrors() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutErrors
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutMulticastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutMulticastPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutOctets() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutOctets
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutPkts
+	}
+	return nil
+}
+
+func (x *Interfaces_Interface_Subinterfaces_Subinterface_State_Counters) GetOutUnicastPkts() *ywrapper.UintValue {
+	if x != nil {
+		return x.OutUnicastPkts
+	}
+	return nil
+}
+
+var File_openconfig_openconfig_interfaces_openconfig_interfaces_proto protoreflect.FileDescriptor
+
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc = []byte{
+	0x0a, 0x3c, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x1a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x2f, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 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, 0x79, 0x67, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x79, 0x65, 0x78,
+	0x74, 0x2f, 0x79, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f, 0x65,
+	0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf3, 0x5a, 0x0a, 0x0a, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x12, 0x75, 0x0a, 0x09, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0xfa, 0xa7, 0xba, 0xc9, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x18, 0x82, 0x41, 0x15,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x1a, 0xd3, 0x58, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x7a,
+	0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xeb, 0xb4, 0xac, 0x9f, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x42, 0x1f, 0x82, 0x41, 0x1c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x83, 0x01, 0x0a, 0x09, 0x68,
+	0x6f, 0x6c, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xd4, 0xfd, 0xf1, 0x53, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x3f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69,
+	0x6d, 0x65, 0x42, 0x22, 0x82, 0x41, 0x1f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c,
+	0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x76, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0xac, 0xc6, 0xe6, 0xb8, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x42, 0x1e, 0x82, 0x41, 0x1b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x96, 0x01, 0x0a, 0x0d, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0x95, 0x9b, 0xa7, 0x9c, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x1a, 0xc9, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x68, 0x0a, 0x0b,
+	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xb4, 0xb3, 0xc9, 0xc7,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x64, 0x65,
+	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x18, 0xed, 0xfe, 0xdf, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x27, 0x82, 0x41, 0x24, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x12, 0x6a, 0x0a, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6d, 0x6f,
+	0x64, 0x65, 0x18, 0xbb, 0xb4, 0xf1, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x52,
+	0x0c, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x4e, 0x0a,
+	0x03, 0x6d, 0x74, 0x75, 0x18, 0xa6, 0x87, 0xb2, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x23, 0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6d, 0x74, 0x75, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x52, 0x0a,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x9b, 0xf0, 0xd9, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x24, 0x82, 0x41, 0x21, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x6a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x9e, 0xbf, 0xf9, 0x44, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70,
+	0x65, 0x42, 0x24, 0x82, 0x41, 0x21, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x9d, 0x05,
+	0x0a, 0x08, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x06, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xd9, 0xb3, 0xf6, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x46, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x29, 0x82, 0x41, 0x26, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x89, 0x01, 0x0a, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x18, 0xae, 0xd3, 0xa8, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45,
+	0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x2e,
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x28, 0x82, 0x41, 0x25, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xba, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x5a, 0x0a, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0xd8, 0x8c, 0xd0, 0x51, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69,
+	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2e, 0x82, 0x41, 0x2b, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x54, 0x0a,
+	0x02, 0x75, 0x70, 0x18, 0xfb, 0xe3, 0xc9, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x2c, 0x82, 0x41, 0x29, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64,
+	0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x75, 0x70, 0x52,
+	0x02, 0x75, 0x70, 0x1a, 0xb7, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x59, 0x0a,
+	0x04, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0xe9, 0x86, 0x87, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x2d, 0x82, 0x41, 0x2a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f,
+	0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x6f,
+	0x77, 0x6e, 0x52, 0x04, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x53, 0x0a, 0x02, 0x75, 0x70, 0x18, 0xae,
+	0xc9, 0xde, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x68, 0x6f, 0x6c, 0x64, 0x2d, 0x74, 0x69, 0x6d, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x75, 0x70, 0x52, 0x02, 0x75, 0x70, 0x1a, 0x9b, 0x1e,
+	0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0c, 0x61, 0x64, 0x6d, 0x69,
+	0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xab, 0xee, 0xa0, 0xe2, 0x01, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x48, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x2b, 0x82, 0x41,
+	0x28, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x61, 0x64, 0x6d,
+	0x69, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x61, 0x64, 0x6d, 0x69, 0x6e,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x18, 0x8c, 0xac, 0xf1, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x42, 0x27, 0x82, 0x41, 0x24, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x08, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x67, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x97, 0x9f, 0xd9, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x59, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x9e, 0x9b, 0xe6, 0x9d, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+	0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x07, 0x69, 0x66,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xaa, 0xd7, 0xae, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x66, 0x69,
+	0x6e, 0x64, 0x65, 0x78, 0x12, 0x63, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61,
+	0x6e, 0x67, 0x65, 0x18, 0x90, 0xe1, 0xdc, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x6c,
+	0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x59, 0x0a, 0x07, 0x6c, 0x6f, 0x67,
+	0x69, 0x63, 0x61, 0x6c, 0x18, 0xb8, 0xc7, 0x83, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x26, 0x82, 0x41, 0x23, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x07, 0x6c, 0x6f, 0x67,
+	0x69, 0x63, 0x61, 0x6c, 0x12, 0x6a, 0x0a, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b,
+	0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd8, 0x96, 0xea, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x82, 0x41, 0x29, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x2d, 0x6d, 0x6f,
+	0x64, 0x65, 0x52, 0x0c, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65,
+	0x12, 0x4c, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0xd5, 0x9a, 0xfb, 0x2d, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x22, 0x82, 0x41, 0x1f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6d, 0x74, 0x75, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x52,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xee, 0xf4, 0x8a, 0xf0, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x23, 0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0xf2, 0xca, 0xa6, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x47, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x2a, 0x82, 0x41, 0x27, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x6a, 0x0a,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0xe3, 0xd3, 0xe3, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x2d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x65, 0x6e, 0x75,
+	0x6d, 0x73, 0x2e, 0x49, 0x45, 0x54, 0x46, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x23,
+	0x82, 0x41, 0x20, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x74,
+	0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xbe, 0x10, 0x0a, 0x08, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x13, 0x63, 0x61, 0x72, 0x72, 0x69,
+	0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xba,
+	0xc1, 0x90, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3b, 0x82,
+	0x41, 0x38, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x2d, 0x74,
+	0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x63, 0x61, 0x72, 0x72,
+	0x69, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7e,
+	0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70,
+	0x6b, 0x74, 0x73, 0x18, 0x85, 0x96, 0xce, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x62,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69,
+	0x6e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x6c,
+	0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xfa, 0x95,
+	0xdb, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x33, 0x82, 0x41, 0x30,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x52, 0x0a, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x67, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xea, 0xcd, 0xe2, 0xd9, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x31, 0x82, 0x41, 0x2e, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
+	0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x45,
+	0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x69, 0x6e, 0x5f, 0x66, 0x63, 0x73, 0x5f,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xf3, 0xdd, 0x94, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x35, 0x82, 0x41, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69,
+	0x6e, 0x2d, 0x66, 0x63, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x0b, 0x69, 0x6e,
+	0x46, 0x63, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x7d, 0x0a, 0x11, 0x69, 0x6e, 0x5f,
+	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0x88,
+	0xb3, 0x81, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x39, 0x82, 0x41,
+	0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69,
+	0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x09, 0x69, 0x6e, 0x5f, 0x6f,
+	0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xcb, 0x97, 0xed, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x31, 0x82, 0x41, 0x2e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e,
+	0x2d, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x4f, 0x63, 0x74, 0x65, 0x74,
+	0x73, 0x12, 0x61, 0x0a, 0x07, 0x69, 0x6e, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xe3, 0xfb, 0xed,
+	0xc4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+	0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x82, 0x41, 0x2c,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e,
+	0x50, 0x6b, 0x74, 0x73, 0x12, 0x78, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xf3, 0xf5, 0x89, 0x82, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x37, 0x82, 0x41, 0x34, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f,
+	0x69, 0x6e, 0x2d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52,
+	0x0d, 0x69, 0x6e, 0x55, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x7d,
+	0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x73, 0x18, 0xa9, 0xbf, 0x92, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79,
+	0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75, 0x6e,
+	0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x0f, 0x69, 0x6e,
+	0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x69, 0x0a,
+	0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x18, 0xc7, 0xb9, 0xd9, 0x58,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+	0x72, 0x73, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x09, 0x6c,
+	0x61, 0x73, 0x74, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x6f, 0x75, 0x74,
+	0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18,
+	0xe4, 0xef, 0xb9, 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3a,
+	0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x62, 0x72, 0x6f, 0x61,
+	0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x42,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x6f, 0x0a, 0x0c,
+	0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xc7, 0xa5, 0x92,
+	0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x34, 0x82, 0x41, 0x31, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x52, 0x0b, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x6a, 0x0a,
+	0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xc7, 0xec, 0xd1, 0xe0,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x09,
+	0x6f, 0x75, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x6f, 0x75,
+	0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73,
+	0x18, 0xf5, 0xb0, 0xa8, 0xda, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x3a, 0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6d, 0x75, 0x6c,
+	0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74,
+	0x4d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x69, 0x0a,
+	0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xca, 0xb3, 0xec, 0x5f,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x32, 0x82, 0x41, 0x2f, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+	0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x09, 0x6f,
+	0x75, 0x74, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x12, 0x64, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x5f,
+	0x70, 0x6b, 0x74, 0x73, 0x18, 0x8a, 0xf2, 0xd3, 0xd0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x30, 0x82, 0x41, 0x2d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74,
+	0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x7a,
+	0x0a, 0x10, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b,
+	0x74, 0x73, 0x18, 0xa6, 0xae, 0xb6, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x38, 0x82, 0x41, 0x35, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x75, 0x6e,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x55,
+	0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x41,
+	0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44,
+	0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10,
+	0x00, 0x12, 0x19, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
+	0x5f, 0x55, 0x50, 0x10, 0x01, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1d, 0x0a, 0x10,
+	0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57, 0x4e,
+	0x10, 0x02, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x23, 0x0a, 0x13, 0x41,
+	0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x03, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47,
+	0x22, 0xa8, 0x02, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e,
+	0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12,
+	0x1c, 0x0a, 0x0f, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f,
+	0x57, 0x4e, 0x10, 0x03, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a,
+	0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54,
+	0x49, 0x4e, 0x47, 0x10, 0x04, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e,
+	0x47, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x55, 0x4e,
+	0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x10, 0x06, 0x1a, 0x0a, 0x82,
+	0x41, 0x07, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x12, 0x2a, 0x0a, 0x16, 0x4f, 0x50, 0x45,
+	0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x53,
+	0x45, 0x4e, 0x54, 0x10, 0x07, 0x1a, 0x0e, 0x82, 0x41, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52,
+	0x45, 0x53, 0x45, 0x4e, 0x54, 0x12, 0x34, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41,
+	0x54, 0x55, 0x53, 0x5f, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f,
+	0x44, 0x4f, 0x57, 0x4e, 0x10, 0x08, 0x1a, 0x13, 0x82, 0x41, 0x10, 0x4c, 0x4f, 0x57, 0x45, 0x52,
+	0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x1a, 0xa8, 0x2c, 0x0a, 0x0d,
+	0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x12, 0xb1, 0x01,
+	0x0a, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x83,
+	0xa8, 0xd1, 0xdd, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x54, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x33,
+	0x82, 0x41, 0x30, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x1a, 0x86, 0x29, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x84, 0x9f,
+	0xb9, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x42, 0x3a, 0x82, 0x41, 0x37, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0xac, 0x01, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x9d,
+	0x89, 0xae, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74,
+	0x65, 0x42, 0x39, 0x82, 0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x1a, 0xf6, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x83,
+	0x01, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xdf,
+	0xe7, 0xea, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x46, 0x82, 0x41, 0x43, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x64, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x75, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
+	0xa6, 0xef, 0xdd, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61,
+	0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x42,
+	0x82, 0x41, 0x3f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x6f, 0x0a, 0x05, 0x69,
+	0x6e, 0x64, 0x65, 0x78, 0x18, 0x95, 0xa3, 0x95, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x42, 0x40, 0x82, 0x41, 0x3d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x9b, 0x23, 0x0a,
+	0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0xd1, 0x01, 0x0a, 0x0c, 0x61, 0x64, 0x6d, 0x69, 0x6e,
+	0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x81, 0xc3, 0x77, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x63, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70,
+	0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x46, 0x82, 0x41, 0x43, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x61,
+	0x64, 0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xc4, 0x01, 0x0a, 0x08, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0xdf, 0x80, 0xc3, 0xe6, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x60, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e,
+	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x42, 0x42, 0x82, 0x41, 0x3f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x08, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72,
+	0x73, 0x12, 0x81, 0x01, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0xe6, 0xa7, 0xe8, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x42, 0x45, 0x82, 0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x65, 0x73,
+	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
+	0x18, 0xb3, 0xe8, 0xb3, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x41, 0x82, 0x41, 0x3e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+	0x65, 0x64, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x74, 0x0a, 0x07, 0x69,
+	0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0xe7, 0xa0, 0x91, 0xf4, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0x82, 0x41, 0x3e, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x2f, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x66, 0x69, 0x6e, 0x64, 0x65,
+	0x78, 0x12, 0x6d, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x9c, 0xaa, 0xc0, 0x26, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x3f, 0x82, 0x41, 0x3c, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78,
+	0x12, 0x7e, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18,
+	0x89, 0x9d, 0xa1, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x45, 0x82,
+	0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x12, 0x74, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x18, 0xf1, 0xf6, 0x9f, 0x8c,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0x82, 0x41, 0x3e, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x07, 0x6c,
+	0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x6d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xf9,
+	0xfb, 0x99, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70,
+	0x70, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x3e, 0x82, 0x41, 0x3b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xce, 0x01, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xdf, 0xa0, 0xd6, 0xbf, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x62, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65,
+	0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x42, 0x45, 0x82, 0x41, 0x42, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6f,
+	0x70, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0xb0, 0x14, 0x0a, 0x08, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x5f,
+	0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x95, 0xa6, 0xa5, 0x43,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x56, 0x82, 0x41, 0x53, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x61,
+	0x72, 0x72, 0x69, 0x65, 0x72, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x12, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x62, 0x72, 0x6f,
+	0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xb6, 0x8e, 0xab, 0x39,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e,
+	0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e,
+	0x2d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52,
+	0x0f, 0x69, 0x6e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73,
+	0x12, 0x88, 0x01, 0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73,
+	0x18, 0x9d, 0xdd, 0xcf, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72,
+	0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42,
+	0x4e, 0x82, 0x41, 0x4b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x52,
+	0x0a, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0xa9, 0x9b, 0xba, 0x98, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4c, 0x82, 0x41, 0x49, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+	0x12, 0x8c, 0x01, 0x0a, 0x0d, 0x69, 0x6e, 0x5f, 0x66, 0x63, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x73, 0x18, 0xf8, 0xaa, 0xff, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x50, 0x82, 0x41, 0x4d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x66, 0x63, 0x73, 0x2d, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x73, 0x52, 0x0b, 0x69, 0x6e, 0x46, 0x63, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12,
+	0x99, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74,
+	0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xeb, 0x82, 0xf1, 0x98, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0f, 0x69, 0x6e, 0x4d, 0x75,
+	0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x09,
+	0x69, 0x6e, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xac, 0x99, 0xe9, 0xfc, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55,
+	0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4c, 0x82, 0x41, 0x49, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d,
+	0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x08, 0x69, 0x6e, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73,
+	0x12, 0x7c, 0x0a, 0x07, 0x69, 0x6e, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xc8, 0xee, 0xad, 0xd2,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4a, 0x82, 0x41, 0x47, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69,
+	0x6e, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x06, 0x69, 0x6e, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x92,
+	0x01, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b,
+	0x74, 0x73, 0x18, 0xa0, 0xb6, 0xe6, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x52, 0x82, 0x41, 0x4f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x2d,
+	0x70, 0x6b, 0x74, 0x73, 0x52, 0x0d, 0x69, 0x6e, 0x55, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74, 0x50,
+	0x6b, 0x74, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x11, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f,
+	0x77, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x18, 0xa6, 0xe4, 0xd2, 0x45, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69,
+	0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x54, 0x82, 0x41, 0x51, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f,
+	0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61,
+	0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6e, 0x2d, 0x75,
+	0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x52, 0x0f, 0x69,
+	0x6e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x12, 0x85,
+	0x01, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x18, 0xf6, 0x89,
+	0x83, 0xf7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4d, 0x82, 0x41,
+	0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73,
+	0x2f, 0x6c, 0x61, 0x73, 0x74, 0x2d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x09, 0x6c, 0x61, 0x73,
+	0x74, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x12, 0x9c, 0x01, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x5f, 0x62,
+	0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xfd, 0x8e,
+	0x80, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70,
+	0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x55, 0x82, 0x41,
+	0x52, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73,
+	0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2d, 0x70,
+	0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73,
+	0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69,
+	0x73, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0xb2, 0xc4, 0x89, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x4f, 0x82, 0x41, 0x4c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x64, 0x69, 0x73,
+	0x63, 0x61, 0x72, 0x64, 0x73, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72,
+	0x64, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x73, 0x18, 0xe2, 0xa0, 0xc1, 0xde, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x4d, 0x82, 0x41, 0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52,
+	0x09, 0x6f, 0x75, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x12, 0x6f,
+	0x75, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x74,
+	0x73, 0x18, 0x80, 0xfc, 0xc2, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77,
+	0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x42, 0x55, 0x82, 0x41, 0x52, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61,
+	0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x4d, 0x75, 0x6c, 0x74,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x0a, 0x6f, 0x75,
+	0x74, 0x5f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x18, 0xa3, 0x8e, 0x8f, 0x18, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4d, 0x82, 0x41, 0x4a, 0x2f, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x6f,
+	0x63, 0x74, 0x65, 0x74, 0x73, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x4f, 0x63, 0x74, 0x65, 0x74, 0x73,
+	0x12, 0x7e, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0x9b, 0xae, 0x88,
+	0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+	0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x4b, 0x82, 0x41, 0x48, 0x2f,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+	0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f,
+	0x75, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x50, 0x6b, 0x74, 0x73,
+	0x12, 0x96, 0x01, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x74,
+	0x5f, 0x70, 0x6b, 0x74, 0x73, 0x18, 0xbb, 0x85, 0x87, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x79, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x42, 0x53, 0x82, 0x41, 0x50, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+	0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62,
+	0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x2d, 0x75, 0x6e, 0x69,
+	0x63, 0x61, 0x73, 0x74, 0x2d, 0x70, 0x6b, 0x74, 0x73, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x55, 0x6e,
+	0x69, 0x63, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x74, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x41, 0x64,
+	0x6d, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x44, 0x4d,
+	0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00,
+	0x12, 0x19, 0x0a, 0x0e, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
+	0x55, 0x50, 0x10, 0x01, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1d, 0x0a, 0x10, 0x41,
+	0x44, 0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10,
+	0x02, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x23, 0x0a, 0x13, 0x41, 0x44,
+	0x4d, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e,
+	0x47, 0x10, 0x03, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x22,
+	0xa8, 0x02, 0x0a, 0x0a, 0x4f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14,
+	0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53,
+	0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x0d, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x1a, 0x05, 0x82, 0x41, 0x02, 0x55, 0x50, 0x12, 0x1c,
+	0x0a, 0x0f, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x57,
+	0x4e, 0x10, 0x03, 0x1a, 0x07, 0x82, 0x41, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12,
+	0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x49,
+	0x4e, 0x47, 0x10, 0x04, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x54, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47,
+	0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55,
+	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x05, 0x1a, 0x0a, 0x82, 0x41, 0x07, 0x55, 0x4e, 0x4b,
+	0x4e, 0x4f, 0x57, 0x4e, 0x12, 0x22, 0x0a, 0x12, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x10, 0x06, 0x1a, 0x0a, 0x82, 0x41,
+	0x07, 0x44, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x54, 0x12, 0x2a, 0x0a, 0x16, 0x4f, 0x50, 0x45, 0x52,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45,
+	0x4e, 0x54, 0x10, 0x07, 0x1a, 0x0e, 0x82, 0x41, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45,
+	0x53, 0x45, 0x4e, 0x54, 0x12, 0x34, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54,
+	0x55, 0x53, 0x5f, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44,
+	0x4f, 0x57, 0x4e, 0x10, 0x08, 0x1a, 0x13, 0x82, 0x41, 0x10, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f,
+	0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x1a, 0xd9, 0x01, 0x0a, 0x0f, 0x53,
+	0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x4f,
+	0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x39, 0x82,
+	0x41, 0x36, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12,
+	0x75, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x51, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x75,
+	0x62, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1d, 0x82, 0x41, 0x1a, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
+	0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f,
+	0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65,
+	0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescOnce sync.Once
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData = file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc
+)
+
+func file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescGZIP() []byte {
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescOnce.Do(func() {
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData = protoimpl.X.CompressGZIP(file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData)
+	})
+	return file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDescData
+}
+
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes = []interface{}{
+	(Interfaces_Interface_State_AdminStatus)(0),                            // 0: openconfig.openconfig_interfaces.Interfaces.Interface.State.AdminStatus
+	(Interfaces_Interface_State_OperStatus)(0),                             // 1: openconfig.openconfig_interfaces.Interfaces.Interface.State.OperStatus
+	(Interfaces_Interface_Subinterfaces_Subinterface_State_AdminStatus)(0), // 2: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.AdminStatus
+	(Interfaces_Interface_Subinterfaces_Subinterface_State_OperStatus)(0),  // 3: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.OperStatus
+	(*Interfaces)(nil),                                                     // 4: openconfig.openconfig_interfaces.Interfaces
+	(*Interfaces_Interface)(nil),                                           // 5: openconfig.openconfig_interfaces.Interfaces.Interface
+	(*Interfaces_InterfaceKey)(nil),                                        // 6: openconfig.openconfig_interfaces.Interfaces.InterfaceKey
+	(*Interfaces_Interface_Config)(nil),                                    // 7: openconfig.openconfig_interfaces.Interfaces.Interface.Config
+	(*Interfaces_Interface_HoldTime)(nil),                                  // 8: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime
+	(*Interfaces_Interface_State)(nil),                                     // 9: openconfig.openconfig_interfaces.Interfaces.Interface.State
+	(*Interfaces_Interface_Subinterfaces)(nil),                             // 10: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces
+	(*Interfaces_Interface_HoldTime_Config)(nil),                           // 11: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config
+	(*Interfaces_Interface_HoldTime_State)(nil),                            // 12: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State
+	(*Interfaces_Interface_State_Counters)(nil),                            // 13: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters
+	(*Interfaces_Interface_Subinterfaces_Subinterface)(nil),                // 14: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface
+	(*Interfaces_Interface_Subinterfaces_SubinterfaceKey)(nil),             // 15: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey
+	(*Interfaces_Interface_Subinterfaces_Subinterface_Config)(nil),         // 16: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config
+	(*Interfaces_Interface_Subinterfaces_Subinterface_State)(nil),          // 17: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State
+	(*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters)(nil), // 18: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters
+	(*ywrapper.StringValue)(nil),                                           // 19: ywrapper.StringValue
+	(*ywrapper.BoolValue)(nil),                                             // 20: ywrapper.BoolValue
+	(*ywrapper.UintValue)(nil),                                             // 21: ywrapper.UintValue
+	(enums.IETFInterfacesInterfaceType)(0),                                 // 22: openconfig.enums.IETFInterfacesInterfaceType
+}
+var file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs = []int32{
+	6,  // 0: openconfig.openconfig_interfaces.Interfaces.interface:type_name -> openconfig.openconfig_interfaces.Interfaces.InterfaceKey
+	7,  // 1: openconfig.openconfig_interfaces.Interfaces.Interface.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Config
+	8,  // 2: openconfig.openconfig_interfaces.Interfaces.Interface.hold_time:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime
+	9,  // 3: openconfig.openconfig_interfaces.Interfaces.Interface.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State
+	10, // 4: openconfig.openconfig_interfaces.Interfaces.Interface.subinterfaces:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces
+	5,  // 5: openconfig.openconfig_interfaces.Interfaces.InterfaceKey.interface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface
+	19, // 6: openconfig.openconfig_interfaces.Interfaces.Interface.Config.description:type_name -> ywrapper.StringValue
+	20, // 7: openconfig.openconfig_interfaces.Interfaces.Interface.Config.enabled:type_name -> ywrapper.BoolValue
+	20, // 8: openconfig.openconfig_interfaces.Interfaces.Interface.Config.loopback_mode:type_name -> ywrapper.BoolValue
+	21, // 9: openconfig.openconfig_interfaces.Interfaces.Interface.Config.mtu:type_name -> ywrapper.UintValue
+	19, // 10: openconfig.openconfig_interfaces.Interfaces.Interface.Config.name:type_name -> ywrapper.StringValue
+	22, // 11: openconfig.openconfig_interfaces.Interfaces.Interface.Config.type:type_name -> openconfig.enums.IETFInterfacesInterfaceType
+	11, // 12: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config
+	12, // 13: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State
+	0,  // 14: openconfig.openconfig_interfaces.Interfaces.Interface.State.admin_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.AdminStatus
+	13, // 15: openconfig.openconfig_interfaces.Interfaces.Interface.State.counters:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters
+	19, // 16: openconfig.openconfig_interfaces.Interfaces.Interface.State.description:type_name -> ywrapper.StringValue
+	20, // 17: openconfig.openconfig_interfaces.Interfaces.Interface.State.enabled:type_name -> ywrapper.BoolValue
+	21, // 18: openconfig.openconfig_interfaces.Interfaces.Interface.State.ifindex:type_name -> ywrapper.UintValue
+	21, // 19: openconfig.openconfig_interfaces.Interfaces.Interface.State.last_change:type_name -> ywrapper.UintValue
+	20, // 20: openconfig.openconfig_interfaces.Interfaces.Interface.State.logical:type_name -> ywrapper.BoolValue
+	20, // 21: openconfig.openconfig_interfaces.Interfaces.Interface.State.loopback_mode:type_name -> ywrapper.BoolValue
+	21, // 22: openconfig.openconfig_interfaces.Interfaces.Interface.State.mtu:type_name -> ywrapper.UintValue
+	19, // 23: openconfig.openconfig_interfaces.Interfaces.Interface.State.name:type_name -> ywrapper.StringValue
+	1,  // 24: openconfig.openconfig_interfaces.Interfaces.Interface.State.oper_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.State.OperStatus
+	22, // 25: openconfig.openconfig_interfaces.Interfaces.Interface.State.type:type_name -> openconfig.enums.IETFInterfacesInterfaceType
+	15, // 26: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.subinterface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey
+	21, // 27: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config.down:type_name -> ywrapper.UintValue
+	21, // 28: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.Config.up:type_name -> ywrapper.UintValue
+	21, // 29: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State.down:type_name -> ywrapper.UintValue
+	21, // 30: openconfig.openconfig_interfaces.Interfaces.Interface.HoldTime.State.up:type_name -> ywrapper.UintValue
+	21, // 31: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.carrier_transitions:type_name -> ywrapper.UintValue
+	21, // 32: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 33: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_discards:type_name -> ywrapper.UintValue
+	21, // 34: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_errors:type_name -> ywrapper.UintValue
+	21, // 35: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_fcs_errors:type_name -> ywrapper.UintValue
+	21, // 36: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 37: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_octets:type_name -> ywrapper.UintValue
+	21, // 38: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_pkts:type_name -> ywrapper.UintValue
+	21, // 39: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_unicast_pkts:type_name -> ywrapper.UintValue
+	21, // 40: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.in_unknown_protos:type_name -> ywrapper.UintValue
+	21, // 41: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.last_clear:type_name -> ywrapper.UintValue
+	21, // 42: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 43: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_discards:type_name -> ywrapper.UintValue
+	21, // 44: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_errors:type_name -> ywrapper.UintValue
+	21, // 45: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 46: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_octets:type_name -> ywrapper.UintValue
+	21, // 47: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_pkts:type_name -> ywrapper.UintValue
+	21, // 48: openconfig.openconfig_interfaces.Interfaces.Interface.State.Counters.out_unicast_pkts:type_name -> ywrapper.UintValue
+	16, // 49: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.config:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config
+	17, // 50: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.state:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State
+	14, // 51: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.SubinterfaceKey.subinterface:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface
+	19, // 52: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.description:type_name -> ywrapper.StringValue
+	20, // 53: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.enabled:type_name -> ywrapper.BoolValue
+	21, // 54: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.Config.index:type_name -> ywrapper.UintValue
+	2,  // 55: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.admin_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.AdminStatus
+	18, // 56: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.counters:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters
+	19, // 57: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.description:type_name -> ywrapper.StringValue
+	20, // 58: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.enabled:type_name -> ywrapper.BoolValue
+	21, // 59: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.ifindex:type_name -> ywrapper.UintValue
+	21, // 60: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.index:type_name -> ywrapper.UintValue
+	21, // 61: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.last_change:type_name -> ywrapper.UintValue
+	20, // 62: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.logical:type_name -> ywrapper.BoolValue
+	19, // 63: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.name:type_name -> ywrapper.StringValue
+	3,  // 64: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.oper_status:type_name -> openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.OperStatus
+	21, // 65: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.carrier_transitions:type_name -> ywrapper.UintValue
+	21, // 66: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 67: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_discards:type_name -> ywrapper.UintValue
+	21, // 68: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_errors:type_name -> ywrapper.UintValue
+	21, // 69: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_fcs_errors:type_name -> ywrapper.UintValue
+	21, // 70: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 71: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_octets:type_name -> ywrapper.UintValue
+	21, // 72: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_pkts:type_name -> ywrapper.UintValue
+	21, // 73: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_unicast_pkts:type_name -> ywrapper.UintValue
+	21, // 74: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.in_unknown_protos:type_name -> ywrapper.UintValue
+	21, // 75: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.last_clear:type_name -> ywrapper.UintValue
+	21, // 76: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_broadcast_pkts:type_name -> ywrapper.UintValue
+	21, // 77: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_discards:type_name -> ywrapper.UintValue
+	21, // 78: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_errors:type_name -> ywrapper.UintValue
+	21, // 79: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_multicast_pkts:type_name -> ywrapper.UintValue
+	21, // 80: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_octets:type_name -> ywrapper.UintValue
+	21, // 81: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_pkts:type_name -> ywrapper.UintValue
+	21, // 82: openconfig.openconfig_interfaces.Interfaces.Interface.Subinterfaces.Subinterface.State.Counters.out_unicast_pkts:type_name -> ywrapper.UintValue
+	83, // [83:83] is the sub-list for method output_type
+	83, // [83:83] is the sub-list for method input_type
+	83, // [83:83] is the sub-list for extension type_name
+	83, // [83:83] is the sub-list for extension extendee
+	0,  // [0:83] is the sub-list for field type_name
+}
+
+func init() { file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_init() }
+func file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_init() {
+	if File_openconfig_openconfig_interfaces_openconfig_interfaces_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_InterfaceKey); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_HoldTime_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_State_Counters); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_SubinterfaceKey); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_State); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Interfaces_Interface_Subinterfaces_Subinterface_State_Counters); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc,
+			NumEnums:      4,
+			NumMessages:   15,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes,
+		DependencyIndexes: file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs,
+		EnumInfos:         file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_enumTypes,
+		MessageInfos:      file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_msgTypes,
+	}.Build()
+	File_openconfig_openconfig_interfaces_openconfig_interfaces_proto = out.File
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_rawDesc = nil
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_goTypes = nil
+	file_openconfig_openconfig_interfaces_openconfig_interfaces_proto_depIdxs = nil
+}
diff --git a/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.proto b/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.proto
new file mode 100644
index 0000000000000000000000000000000000000000..82e99cf6a44d260a1b0b115802b4f55a214c9561
--- /dev/null
+++ b/api/proto/openconfig/openconfig_interfaces/openconfig_interfaces.proto
@@ -0,0 +1,163 @@
+// openconfig.openconfig_interfaces is generated by proto_generator as a protobuf
+// representation of a YANG schema.
+//
+// Input schema modules:
+//  - ../yang-models/models/openconfig/release/models/interfaces/openconfig-interfaces.yang
+// Include paths:
+//   - ../yang-models/models/...
+syntax = "proto3";
+
+package openconfig.openconfig_interfaces;
+option go_package = "code.fbi.h-da.de/cocsn/gosdn";
+
+import "github.com/openconfig/ygot/proto/ywrapper/ywrapper.proto";
+import "github.com/openconfig/ygot/proto/yext/yext.proto";
+import "openconfig/enums/enums.proto";
+
+message Interfaces {
+  message Interface {
+    message Config {
+      ywrapper.StringValue description = 418535860 [(yext.schemapath) = "/interfaces/interface/config/description"];
+      ywrapper.BoolValue enabled = 37224301 [(yext.schemapath) = "/interfaces/interface/config/enabled"];
+      ywrapper.BoolValue loopback_mode = 253516347 [(yext.schemapath) = "/interfaces/interface/config/loopback-mode"];
+      ywrapper.UintValue mtu = 376210342 [(yext.schemapath) = "/interfaces/interface/config/mtu"];
+      ywrapper.StringValue name = 51804187 [(yext.schemapath) = "/interfaces/interface/config/name"];
+      openconfig.enums.IETFInterfacesInterfaceType type = 144596894 [(yext.schemapath) = "/interfaces/interface/config/type"];
+    }
+    message HoldTime {
+      message Config {
+        ywrapper.UintValue down = 171181656 [(yext.schemapath) = "/interfaces/interface/hold-time/config/down"];
+        ywrapper.UintValue up = 62026235 [(yext.schemapath) = "/interfaces/interface/hold-time/config/up"];
+      }
+      message State {
+        ywrapper.UintValue down = 167887721 [(yext.schemapath) = "/interfaces/interface/hold-time/state/down"];
+        ywrapper.UintValue up = 223847598 [(yext.schemapath) = "/interfaces/interface/hold-time/state/up"];
+      }
+      Config config = 316512729 [(yext.schemapath) = "/interfaces/interface/hold-time/config"];
+      State state = 483010990 [(yext.schemapath) = "/interfaces/interface/hold-time/state"];
+    }
+    message State {
+      message Counters {
+        ywrapper.UintValue carrier_transitions = 270803130 [(yext.schemapath) = "/interfaces/interface/state/counters/carrier-transitions"];
+        ywrapper.UintValue in_broadcast_pkts = 280201989 [(yext.schemapath) = "/interfaces/interface/state/counters/in-broadcast-pkts"];
+        ywrapper.UintValue in_discards = 11979514 [(yext.schemapath) = "/interfaces/interface/state/counters/in-discards"];
+        ywrapper.UintValue in_errors = 456697578 [(yext.schemapath) = "/interfaces/interface/state/counters/in-errors"];
+        ywrapper.UintValue in_fcs_errors = 501559027 [(yext.schemapath) = "/interfaces/interface/state/counters/in-fcs-errors"];
+        ywrapper.UintValue in_multicast_pkts = 113269128 [(yext.schemapath) = "/interfaces/interface/state/counters/in-multicast-pkts"];
+        ywrapper.UintValue in_octets = 333138891 [(yext.schemapath) = "/interfaces/interface/state/counters/in-octets"];
+        ywrapper.UintValue in_pkts = 412843491 [(yext.schemapath) = "/interfaces/interface/state/counters/in-pkts"];
+        ywrapper.UintValue in_unicast_pkts = 272792307 [(yext.schemapath) = "/interfaces/interface/state/counters/in-unicast-pkts"];
+        ywrapper.UintValue in_unknown_protos = 241475497 [(yext.schemapath) = "/interfaces/interface/state/counters/in-unknown-protos"];
+        ywrapper.UintValue last_clear = 186014919 [(yext.schemapath) = "/interfaces/interface/state/counters/last-clear"];
+        ywrapper.UintValue out_broadcast_pkts = 338589668 [(yext.schemapath) = "/interfaces/interface/state/counters/out-broadcast-pkts"];
+        ywrapper.UintValue out_discards = 254055111 [(yext.schemapath) = "/interfaces/interface/state/counters/out-discards"];
+        ywrapper.UintValue out_errors = 471103047 [(yext.schemapath) = "/interfaces/interface/state/counters/out-errors"];
+        ywrapper.UintValue out_multicast_pkts = 457840757 [(yext.schemapath) = "/interfaces/interface/state/counters/out-multicast-pkts"];
+        ywrapper.UintValue out_octets = 201005514 [(yext.schemapath) = "/interfaces/interface/state/counters/out-octets"];
+        ywrapper.UintValue out_pkts = 437582090 [(yext.schemapath) = "/interfaces/interface/state/counters/out-pkts"];
+        ywrapper.UintValue out_unicast_pkts = 36542246 [(yext.schemapath) = "/interfaces/interface/state/counters/out-unicast-pkts"];
+      }
+      enum AdminStatus {
+        ADMINSTATUS_UNSET = 0;
+        ADMINSTATUS_UP = 1 [(yext.yang_name) = "UP"];
+        ADMINSTATUS_DOWN = 2 [(yext.yang_name) = "DOWN"];
+        ADMINSTATUS_TESTING = 3 [(yext.yang_name) = "TESTING"];
+      }
+      enum OperStatus {
+        OPERSTATUS_UNSET = 0;
+        OPERSTATUS_UP = 2 [(yext.yang_name) = "UP"];
+        OPERSTATUS_DOWN = 3 [(yext.yang_name) = "DOWN"];
+        OPERSTATUS_TESTING = 4 [(yext.yang_name) = "TESTING"];
+        OPERSTATUS_UNKNOWN = 5 [(yext.yang_name) = "UNKNOWN"];
+        OPERSTATUS_DORMANT = 6 [(yext.yang_name) = "DORMANT"];
+        OPERSTATUS_NOT_PRESENT = 7 [(yext.yang_name) = "NOT_PRESENT"];
+        OPERSTATUS_LOWER_LAYER_DOWN = 8 [(yext.yang_name) = "LOWER_LAYER_DOWN"];
+      }
+      AdminStatus admin_status = 474494763 [(yext.schemapath) = "/interfaces/interface/state/admin-status"];
+      Counters counters = 83645964 [(yext.schemapath) = "/interfaces/interface/state/counters"];
+      ywrapper.StringValue description = 389435287 [(yext.schemapath) = "/interfaces/interface/state/description"];
+      ywrapper.BoolValue enabled = 330927518 [(yext.schemapath) = "/interfaces/interface/state/enabled"];
+      ywrapper.UintValue ifindex = 116108202 [(yext.schemapath) = "/interfaces/interface/state/ifindex"];
+      ywrapper.UintValue last_change = 127348880 [(yext.schemapath) = "/interfaces/interface/state/last-change"];
+      ywrapper.BoolValue logical = 440460216 [(yext.schemapath) = "/interfaces/interface/state/logical"];
+      ywrapper.BoolValue loopback_mode = 372935512 [(yext.schemapath) = "/interfaces/interface/state/loopback-mode"];
+      ywrapper.UintValue mtu = 96390485 [(yext.schemapath) = "/interfaces/interface/state/mtu"];
+      ywrapper.StringValue name = 503495278 [(yext.schemapath) = "/interfaces/interface/state/name"];
+      OperStatus oper_status = 470394226 [(yext.schemapath) = "/interfaces/interface/state/oper-status"];
+      openconfig.enums.IETFInterfacesInterfaceType type = 358148579 [(yext.schemapath) = "/interfaces/interface/state/type"];
+    }
+    message Subinterfaces {
+      message Subinterface {
+        message Config {
+          ywrapper.StringValue description = 280671199 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/config/description"];
+          ywrapper.BoolValue enabled = 297236390 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/config/enabled"];
+          ywrapper.UintValue index = 279269781 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/config/index"];
+        }
+        message State {
+          message Counters {
+            ywrapper.UintValue carrier_transitions = 141120277 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/carrier-transitions"];
+            ywrapper.UintValue in_broadcast_pkts = 120244022 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-broadcast-pkts"];
+            ywrapper.UintValue in_discards = 307490461 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-discards"];
+            ywrapper.UintValue in_errors = 319720873 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-errors"];
+            ywrapper.UintValue in_fcs_errors = 169858424 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-fcs-errors"];
+            ywrapper.UintValue in_multicast_pkts = 320618859 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-multicast-pkts"];
+            ywrapper.UintValue in_octets = 530205868 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-octets"];
+            ywrapper.UintValue in_pkts = 441153352 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-pkts"];
+            ywrapper.UintValue in_unicast_pkts = 177838880 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-unicast-pkts"];
+            ywrapper.UintValue in_unknown_protos = 146059814 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/in-unknown-protos"];
+            ywrapper.UintValue last_clear = 518046966 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/last-clear"];
+            ywrapper.UintValue out_broadcast_pkts = 501221245 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-broadcast-pkts"];
+            ywrapper.UintValue out_discards = 159539762 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-discards"];
+            ywrapper.UintValue out_errors = 466636898 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-errors"];
+            ywrapper.UintValue out_multicast_pkts = 326155776 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-multicast-pkts"];
+            ywrapper.UintValue out_octets = 50579235 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-octets"];
+            ywrapper.UintValue out_pkts = 29497115 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-pkts"];
+            ywrapper.UintValue out_unicast_pkts = 297910971 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters/out-unicast-pkts"];
+          }
+          enum AdminStatus {
+            ADMINSTATUS_UNSET = 0;
+            ADMINSTATUS_UP = 1 [(yext.yang_name) = "UP"];
+            ADMINSTATUS_DOWN = 2 [(yext.yang_name) = "DOWN"];
+            ADMINSTATUS_TESTING = 3 [(yext.yang_name) = "TESTING"];
+          }
+          enum OperStatus {
+            OPERSTATUS_UNSET = 0;
+            OPERSTATUS_UP = 2 [(yext.yang_name) = "UP"];
+            OPERSTATUS_DOWN = 3 [(yext.yang_name) = "DOWN"];
+            OPERSTATUS_TESTING = 4 [(yext.yang_name) = "TESTING"];
+            OPERSTATUS_UNKNOWN = 5 [(yext.yang_name) = "UNKNOWN"];
+            OPERSTATUS_DORMANT = 6 [(yext.yang_name) = "DORMANT"];
+            OPERSTATUS_NOT_PRESENT = 7 [(yext.yang_name) = "NOT_PRESENT"];
+            OPERSTATUS_LOWER_LAYER_DOWN = 8 [(yext.yang_name) = "LOWER_LAYER_DOWN"];
+          }
+          AdminStatus admin_status = 250658952 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/admin-status"];
+          Counters counters = 483442783 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/counters"];
+          ywrapper.StringValue description = 49943526 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/description"];
+          ywrapper.BoolValue enabled = 468513843 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/enabled"];
+          ywrapper.UintValue ifindex = 511987815 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/ifindex"];
+          ywrapper.UintValue index = 80745756 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/index"];
+          ywrapper.UintValue last_change = 29904521 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/last-change"];
+          ywrapper.BoolValue logical = 294124401 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/logical"];
+          ywrapper.StringValue name = 279346681 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/name"];
+          OperStatus oper_status = 401969247 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state/oper-status"];
+        }
+        Config config = 175001476 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/config"];
+        State state = 501974173 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/state"];
+      }
+      message SubinterfaceKey {
+        uint64 index = 1 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface/index"];
+        Subinterface subinterface = 2;
+      }
+      repeated SubinterfaceKey subinterface = 464802819 [(yext.schemapath) = "/interfaces/interface/subinterfaces/subinterface"];
+    }
+    Config config = 334174827 [(yext.schemapath) = "/interfaces/interface/config"];
+    HoldTime hold_time = 175931092 [(yext.schemapath) = "/interfaces/interface/hold-time"];
+    State state = 387556140 [(yext.schemapath) = "/interfaces/interface/state"];
+    Subinterfaces subinterfaces = 327798165 [(yext.schemapath) = "/interfaces/interface/subinterfaces"];
+  }
+  message InterfaceKey {
+    string name = 1 [(yext.schemapath) = "/interfaces/interface/name"];
+    Interface interface = 2;
+  }
+  repeated InterfaceKey interface = 422482938 [(yext.schemapath) = "/interfaces/interface"];
+}
diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9e57337f04c717eac5d96fca47b64d707739a23a
--- /dev/null
+++ b/build/ci/.build-container.yml
@@ -0,0 +1,48 @@
+
+services:
+  - docker:19.03.12-dind
+
+variables:
+  DOCKER_TLS_CERTDIR: "/certs"
+  DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+
+.build: &build
+  before_script:
+    - echo "override global before script"
+  image: docker:19.03.12
+  stage: build
+  tags:
+    - dind
+  script:
+    - >
+      docker build \
+        --build-arg GITLAB_USER=$GO_MODULES_USER \
+        --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \
+        --build-arg BUILDARGS=$BUILDARGS \
+        -t $DOCKER_IMAGE_SHA .
+    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+    - docker tag $DOCKER_IMAGE_SHA $TAG
+    - docker push $TAG
+
+build:develop:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:develop
+    BUILDARGS: -race
+  rules:
+    - if: $CI_COMMIT_BRANCH == "develop"
+  <<: *build
+
+build:merge-request:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:merge-request
+    BUILDARGS: -race
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+  <<: *build
+
+build:latest:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:latest
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  <<: *build
\ No newline at end of file
diff --git a/build/ci/.code-quality-ci.yml b/build/ci/.code-quality-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ab2aa8d7b3f5a988e5827b08c82c5a32459bdd94
--- /dev/null
+++ b/build/ci/.code-quality-ci.yml
@@ -0,0 +1,30 @@
+code-quality-master:
+  image: golangci/golangci-lint:latest-alpine
+  stage: test
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  script:
+    # writes golangci-lint output to gl-code-quality-report.json
+    - golangci-lint run --config build/ci/.golangci-config/.golangci-master.yml --out-format code-climate | tee gl-code-quality-report.json
+  artifacts:
+    reports:
+      codequality: gl-code-quality-report.json
+    paths:
+      - gl-code-quality-report.json
+
+
+code-quality:
+  image: golangci/golangci-lint:latest-alpine
+  stage: test
+  allow_failure: true
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
+  script:
+    # writes golangci-lint output to gl-code-quality-report.json
+    - golangci-lint run --config build/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
+  artifacts:
+    reports:
+      codequality: gl-code-quality-report.json
+    paths:
+      - gl-code-quality-report.json
diff --git a/build/ci/.documentation-ci.yml b/build/ci/.documentation-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2ce234e722e683de2ec652adb6eee858e790f6cd
--- /dev/null
+++ b/build/ci/.documentation-ci.yml
@@ -0,0 +1,39 @@
+documentation:pdf:
+  before_script:
+    - pwd
+  image:
+    name: pandoc/latex
+    entrypoint:
+    - ''
+  stage: deploy
+  rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      changes:
+        - documentation/design/*.md
+  script:
+  - cd documentation/design
+  - pandoc --citeproc --bibliography=bibliography.bib --csl=acm-sig-proceedings.csl
+    --variable papersize=a4paper -s *.md -o documentation.pdf
+  artifacts:
+    paths:
+    - documentation.pdf
+
+.mdbook_common: &rust
+  image: 
+    name: $CI_REGISTRY/danet/internetworking/mdbook:latest
+    entrypoint:
+      - ''
+  stage: deploy
+  script:
+  - mdbook build documentation --dest-dir public
+
+documentation:website:
+  rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      changes:
+        - documentation/design/*.md
+  artifacts:
+    paths:
+      - public
+    expire_in: 1 week
+  <<: *rust
\ No newline at end of file
diff --git a/.ci/.golangci-master.yml b/build/ci/.golangci-config/.golangci-master.yml
similarity index 59%
rename from .ci/.golangci-master.yml
rename to build/ci/.golangci-config/.golangci-master.yml
index 1a21937d63f0d30e5daf6bf57d4f35763bf42da4..1ca12a130fcef6a4ff882340c5c1f981c0804521 100644
--- a/.ci/.golangci-master.yml
+++ b/build/ci/.golangci-config/.golangci-master.yml
@@ -1,17 +1,27 @@
 run:
   timeout: 5m
   issues-exit-code: 1
+  # directories to be ignored by linters
+  skip-dirs:
+    - forks
+    - test
+  skip-dirs-default: true
+  skip-files:
+      - nucleus/http.go
+# output settings -> code-climate for GitLab
 output:
   format: code-climate
   print-issued-lines: true
   print-linter-name: true
   uniq-by-line: true
   path-prefix: ""
+# custom settings for linters
 linters-settings:
   gocyclo:
     min-complexity: 15
   golint:
     min-confidence: 0.8
+# enable the specific needed linters
 linters:
   disable-all: true
   enable:
diff --git a/.ci/.golangci.yml b/build/ci/.golangci-config/.golangci.yml
similarity index 57%
rename from .ci/.golangci.yml
rename to build/ci/.golangci-config/.golangci.yml
index 5c4c88e8338b257ad41a8b594d2aae8a27f82f2a..85a89bf0ecf6493e88b723971d9e043fe2d268ff 100644
--- a/.ci/.golangci.yml
+++ b/build/ci/.golangci-config/.golangci.yml
@@ -1,17 +1,27 @@
 run:
   timeout: 5m
   issues-exit-code: 1
+  # directories to be ignored by linters
+  skip-dirs:
+    - forks
+    - test
+  skip-dirs-default: true
+  skip-files:
+      - nucleus/http.go
+# output settings -> code-climate for GitLab
 output:
   format: code-climate
   print-issued-lines: true
   print-linter-name: true
   uniq-by-line: true
   path-prefix: ""
+# custom settings for linters
 linters-settings:
   gocyclo:
     min-complexity: 15
   golint:
     min-confidence: 0.8
+# enable the specific needed linters
 linters:
   disable-all: true
   enable:
diff --git a/.ci/.runlint.sh b/build/ci/.golangci-config/.runlint.sh
similarity index 92%
rename from .ci/.runlint.sh
rename to build/ci/.golangci-config/.runlint.sh
index 224a4061c57de8f914c3fce374ce49f68b3b9062..7b0012a32e7d08ffa9de118104d51f8d129c6aee 100755
--- a/.ci/.runlint.sh
+++ b/build/ci/.golangci-config/.runlint.sh
@@ -1,4 +1,4 @@
 golangci-lint run\
   --config .ci/.golangci-master.yml\
   --out-format code-climate |\
-  jq -r '.[] | "\(.location.path):\(.location.lines.begin) \(.description)"'
\ No newline at end of file
+  jq -r '.[] | "\(.location.path):\(.location.lines.begin) \(.description)"'
diff --git a/build/ci/.security-and-compliance-ci.yml b/build/ci/.security-and-compliance-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3e98b739e62763538a6e6fe0d5bcf9259b91fbbd
--- /dev/null
+++ b/build/ci/.security-and-compliance-ci.yml
@@ -0,0 +1,10 @@
+sast:
+  variables:
+    SAST_ANALYZER_IMAGE_TAG: '2'
+    SAST_EXCLUDED_PATHS: spec, test, tests, tmp
+    SEARCH_MAX_DEPTH: '4'
+
+include:
+  - template: Security/SAST.gitlab-ci.yml
+  - template: Dependency-Scanning.gitlab-ci.yml
+  - template: Security/License-Scanning.gitlab-ci.yml
diff --git a/build/ci/.terraform-ci.yml b/build/ci/.terraform-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..014c4502bcfe6126d5b6476f916d2eefc23953dc
--- /dev/null
+++ b/build/ci/.terraform-ci.yml
@@ -0,0 +1,71 @@
+
+variables:
+  TF_ROOT: ${CI_PROJECT_DIR}/test/terraform
+  TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/integration
+
+cache:
+  key: integration
+  paths:
+    - ${TF_ROOT}/.terraform
+
+.terraform_prefab: &tf
+  image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
+  variables:
+    CI_DEBUG_TRACE: "false"
+  before_script:
+    - cd ${TF_ROOT}
+    - export TF_VAR_integration_username=terraform
+    - export TF_VAR_integration_access_token=${TERRAFORM_API_TOKEN}
+    - export TF_VAR_integration_registry=${CI_REGISTRY}
+    - export TF_VAR_tls_key=${DOCKER_TLS_KEY}
+    - export TF_VAR_tls_cert=${DOCKER_TLS_CERT}
+    - export TF_VAR_tls_ca_cert=${DOCKER_TLS_CA}
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
+      variables:
+        TF_VAR_container_tag: $CI_REGISTRY_IMAGE:merge-request
+    - if: $CI_COMMIT_BRANCH == "integration-test"
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+init:
+  stage: .pre
+  script:
+    - gitlab-terraform init
+  <<: *tf
+
+validate:
+  stage: test
+  script:
+    - gitlab-terraform validate
+  needs: ["init"]
+  <<: *tf
+
+plan:
+  before_script:
+    - cd ${TF_ROOT}
+  stage: build
+  script:
+    - gitlab-terraform plan
+    - gitlab-terraform plan-json
+  artifacts:
+    name: plan
+    paths:
+      - ${TF_ROOT}/plan.cache
+    reports:
+      terraform: ${TF_ROOT}/plan.json
+  needs: ["validate"]
+  <<: *tf
+
+apply:
+  stage: apply
+  script:
+    - gitlab-terraform apply
+  dependencies:
+    - plan
+  <<: *tf
+
+destroy:
+  stage: .post
+  script:
+    - gitlab-terraform destroy
+  <<: *tf
\ No newline at end of file
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2793f91ec4b968ac4da1001d8d082ca7bc4c699c
--- /dev/null
+++ b/build/ci/.test.yml
@@ -0,0 +1,41 @@
+integration-test:
+  image: golang:1.14
+  stage: integration-test
+  needs: [ "apply" ]
+  variables:
+    GOSDN_LOG: "nolog"
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
+      allow_failure: true
+    - if: $CI_COMMIT_BRANCH == "integration-test"
+      allow_failure: true
+  script:
+    - sleep 1m
+    - go test -race ./test/integration -v -coverprofile=coverage.out
+
+.test: &test
+  image: golang:1.14
+  stage: test
+  allow_failure: true
+  variables:
+    GOSDN_LOG: "nolog"
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
+      allow_failure: true
+  after_script:
+    - go tool cover -func=coverage.out
+
+unit-test:
+  script:
+    - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /api/ | grep -v /mocks ) -v -coverprofile=coverage.out
+  <<: *test
+
+http-api-test:
+  script:
+    - cd ./nucleus
+    - go test -race -v -run Test_httpApi -coverprofile=coverage.out
+  <<: *test
\ No newline at end of file
diff --git a/cli/capabilities.go b/cli/capabilities.go
new file mode 100644
index 0000000000000000000000000000000000000000..a80540d873fd52dc582ee6ec124649f64e9ad6b5
--- /dev/null
+++ b/cli/capabilities.go
@@ -0,0 +1,44 @@
+package cli
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"context"
+	"fmt"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	"strings"
+)
+
+// Capabilities sends a gNMI Capabilities request to the specified target
+// and prints the supported models to stdout
+func Capabilities(a, u, p string) error {
+	cfg := gnmi.Config{
+		Addr:     a,
+		Username: u,
+		Password: p,
+		Encoding: gpb.Encoding_JSON_IETF,
+	}
+	opts := &nucleus.GnmiTransportOptions{Config: cfg}
+	transport, err := nucleus.NewGnmiTransport(opts)
+	if err != nil {
+		return err
+	}
+	resp, err := transport.Capabilities(context.Background())
+	if err != nil {
+		return err
+	}
+	modelData := resp.(*gpb.CapabilityResponse).SupportedModels
+	b := strings.Builder{}
+	for _, elem := range modelData {
+		_, err := b.WriteString(elem.Name)
+		if err != nil {
+			return err
+		}
+		_, err = b.WriteString("\n")
+		if err != nil {
+			return err
+		}
+	}
+	fmt.Println(b.String())
+	return nil
+}
diff --git a/cli/get.go b/cli/get.go
new file mode 100644
index 0000000000000000000000000000000000000000..ccd8b25a464dab88bb3e9b57ce921524de2f16b7
--- /dev/null
+++ b/cli/get.go
@@ -0,0 +1,37 @@
+package cli
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"context"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	log "github.com/sirupsen/logrus"
+)
+
+// Get sends a gNMI Get request to the specified target and prints the response to stdout
+func Get(a, u, p string, args ...string) (*gpb.GetResponse, error) {
+	sbi := &nucleus.OpenConfig{}
+	opts := &nucleus.GnmiTransportOptions{
+		Config: gnmi.Config{
+			Addr:     a,
+			Username: u,
+			Password: p,
+			Encoding: gpb.Encoding_JSON_IETF,
+		},
+		SetNode: sbi.SetNode(),
+	}
+	t, err := nucleus.NewGnmiTransport(opts)
+	if err != nil {
+		return nil, err
+	}
+	resp, err := t.Get(context.Background(), args...)
+	if err != nil {
+		return nil, err
+	}
+	log.Debug(resp)
+	r, ok := resp.(*gpb.GetResponse)
+	if !ok {
+		return nil, &nucleus.ErrInvalidTypeAssertion{}
+	}
+	return r, nil
+}
diff --git a/cli/http.go b/cli/http.go
new file mode 100644
index 0000000000000000000000000000000000000000..57ffb70adfa999d1663ce1611a2404196807f4c8
--- /dev/null
+++ b/cli/http.go
@@ -0,0 +1,66 @@
+package cli
+
+import (
+	"errors"
+	"fmt"
+	log "github.com/sirupsen/logrus"
+	"github.com/spf13/viper"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+const apiRoot = "/api?"
+
+var builder *strings.Builder
+
+func init() {
+	builder = &strings.Builder{}
+}
+
+// HTTPGet sends sends requests from the CLI to the gosdn HTTP API and processes any response data
+func HTTPGet(apiEndpoint, f string, args ...string) error {
+	for _, p := range args {
+		builder.WriteString("&")
+		builder.WriteString(p)
+	}
+	resp, err := http.Get(apiEndpoint + apiRoot + "q=" + f + builder.String())
+	if err != nil {
+		return err
+	}
+	builder.Reset()
+	switch resp.StatusCode {
+	case http.StatusOK:
+		defer resp.Body.Close()
+		bytes, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			return err
+		}
+		switch f {
+		case "init":
+			pnd := string(bytes[:36])
+			sbi := string(bytes[36:])
+			viper.Set("CLI_PND", pnd)
+			viper.Set("CLI_SBI", sbi)
+			err := viper.WriteConfig()
+			log.Error(err)
+		default:
+			fmt.Println(string(bytes))
+		}
+	case http.StatusCreated:
+		defer resp.Body.Close()
+		bytes, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			return err
+		}
+		uuid := string(bytes[19:55])
+		viper.Set("LAST_DEVICE_UUID", uuid)
+		fmt.Println(string(bytes))
+	default:
+		log.WithFields(log.Fields{
+			"status code": resp.StatusCode,
+		}).Error("operation unsuccessful")
+		return errors.New(resp.Status)
+	}
+	return nil
+}
diff --git a/cli/init.go b/cli/init.go
new file mode 100644
index 0000000000000000000000000000000000000000..d85e6bd00885a1c4aefea4b6766da349ccd5b8cd
--- /dev/null
+++ b/cli/init.go
@@ -0,0 +1,17 @@
+package cli
+
+import (
+	model "code.fbi.h-da.de/cocsn/yang-models/generated/arista"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+)
+
+var testSchema *ytypes.Schema
+
+func init() {
+	var err error
+	testSchema, err = model.Schema()
+	if err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/cli/set.go b/cli/set.go
new file mode 100644
index 0000000000000000000000000000000000000000..4d01d1477fd281446c3666faaf69e9a9899f7347
--- /dev/null
+++ b/cli/set.go
@@ -0,0 +1,50 @@
+package cli
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
+	"context"
+	pb "google.golang.org/protobuf/proto"
+	"os"
+)
+
+// Set sends a gNMI Set request to the specified target. Only one
+// request per invocation supported.
+func Set(a, u, p, typ string, args ...string) error {
+	opts := &nucleus.GnmiTransportOptions{
+		Config: gnmi.Config{
+			Addr:     a,
+			Username: u,
+			Password: p,
+		},
+	}
+	t, err := nucleus.NewGnmiTransport(opts)
+	if err != nil {
+		return err
+	}
+
+	path := gnmi.SplitPath(args[0])
+	req := []interface{}{
+		&gnmi.Operation{
+			Type:   typ,
+			Origin: "",
+			Target: "",
+			Path:   path,
+			Val:    args[1],
+		},
+	}
+
+	resp, err := t.Set(context.Background(), req...)
+	if err != nil {
+		return err
+	}
+
+	_, tap := os.LookupEnv("GOSDN_TAP")
+	if tap {
+		if err := proto.Write(resp.(pb.Message), "resp-set-system-config-hostname"); err != nil {
+			return err
+		}
+	}
+	return nil
+}
diff --git a/cli/subscribe.go b/cli/subscribe.go
new file mode 100644
index 0000000000000000000000000000000000000000..88379e45f8d90f892c347c2aff18861658c18bfc
--- /dev/null
+++ b/cli/subscribe.go
@@ -0,0 +1,60 @@
+package cli
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"context"
+	"fmt"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	log "github.com/sirupsen/logrus"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+)
+
+// Subscribe starts a gNMI subscriber requersting the specified paths on the target and
+// logs the response to stdout. Only 'stream' mode with 'sample' operation supported.
+func Subscribe(a, u, p string, sample, heartbeat int64, args ...string) error {
+	sbi := &nucleus.OpenConfig{}
+	tOpts := &nucleus.GnmiTransportOptions{
+		Config: gnmi.Config{
+			Addr:     a,
+			Username: u,
+			Password: p,
+			Encoding: gpb.Encoding_JSON_IETF,
+		},
+		SetNode:  sbi.SetNode(),
+		RespChan: make(chan *gpb.SubscribeResponse),
+	}
+
+	device, err := nucleus.NewDevice(sbi, tOpts)
+	if err != nil {
+		return err
+	}
+
+	opts := &gnmi.SubscribeOptions{
+		UpdatesOnly:       false,
+		Prefix:            "",
+		Mode:              "stream",
+		StreamMode:        "sample",
+		SampleInterval:    uint64(sample * time.Second.Nanoseconds()),
+		SuppressRedundant: false,
+		HeartbeatInterval: uint64(heartbeat * time.Second.Nanoseconds()),
+		Paths:             gnmi.SplitPaths(args),
+		Origin:            "",
+		Target:            a,
+	}
+	done := make(chan os.Signal, 1)
+	signal.Notify(done, syscall.SIGILL, syscall.SIGTERM)
+	ctx := context.WithValue(context.Background(), nucleus.CtxKeyOpts, opts) //nolint
+	go func() {
+		if err := device.Transport.Subscribe(ctx); err != nil {
+			log.Fatal(err)
+		}
+	}()
+	fmt.Println("awaiting signal")
+	<-done
+	fmt.Println("exiting")
+	return nil
+}
diff --git a/cli/target.go b/cli/target.go
new file mode 100644
index 0000000000000000000000000000000000000000..cd35e87a352590ed8f26bdfc94583113d189cbc0
--- /dev/null
+++ b/cli/target.go
@@ -0,0 +1,95 @@
+package cli
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/google/gnmi"
+	oc "code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"context"
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/util"
+	"github.com/openconfig/ygot/ygot"
+	log "github.com/sirupsen/logrus"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+	"net"
+	"reflect"
+)
+
+type server struct {
+	*gnmi.Server
+}
+
+func callback(newConfig ygot.ValidatedGoStruct) error {
+	// Apply the config to your device and return nil if success. return error if fails.
+	//
+	// Do something ...
+	return nil
+}
+
+func newServer(model *gnmi.Model, config []byte) (*server, error) {
+	s, err := gnmi.NewServer(model, config, callback)
+	if err != nil {
+		return nil, err
+	}
+	return &server{Server: s}, nil
+}
+
+// Get overrides the Get func of gnmi.Target to provide user auth.
+func (s *server) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
+	return s.Server.Get(ctx, req)
+}
+
+// Set overrides the Set func of gnmi.Target to provide user auth.
+/*
+func (s *server) Set(ctx context.Context, req *pb.SetRequest) (*pb.SetResponse, error) {
+	msg, ok := credentials.AuthorizeUser(ctx)
+	if !ok {
+		log.Infof("denied a Set request: %v", msg)
+		return nil, status.Error(codes.PermissionDenied, msg)
+	}
+	log.Infof("allowed a Set request: %v", msg)
+	return s.Server.Set(ctx, req)
+}
+*/
+
+// Target starts a gNMI target listening on the specified port.
+func Target(bindAddr string) error {
+	entries := make([]*yang.Entry, 0)
+	for _, e := range oc.SchemaTree {
+		entries = append(entries, e)
+	}
+
+	modelData, err := util.FindModelData(entries)
+	if err != nil {
+		return err
+	}
+	// Google stuff from here
+	model := gnmi.NewModel(
+		modelData,
+		reflect.TypeOf((*oc.Device)(nil)),
+		oc.SchemaTree["Device"],
+		oc.Unmarshal,
+		oc.ΛEnum)
+
+	g := grpc.NewServer()
+
+	var configData []byte
+	s, err := newServer(model, configData)
+	if err != nil {
+		return err
+	}
+	pb.RegisterGNMIServer(g, s)
+	reflection.Register(g)
+
+	log.Infof("starting to listen on %s", bindAddr)
+	listen, err := net.Listen("tcp", bindAddr)
+	if err != nil {
+		return err
+	}
+
+	log.Info("starting to serve")
+	if err := g.Serve(listen); err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/cliInterface/gosdnCLI.pb.go b/cliInterface/gosdnCLI.pb.go
deleted file mode 100644
index 2095a2771e811732b7ef6b56b75930e7e21d27e7..0000000000000000000000000000000000000000
--- a/cliInterface/gosdnCLI.pb.go
+++ /dev/null
@@ -1,513 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.23.0
-// 	protoc        v3.13.0
-// source: cliInterface/gosdnCLI.proto
-
-package gosdn
-
-import (
-	proto "github.com/golang/protobuf/proto"
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	reflect "reflect"
-	sync "sync"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-// This is a compile-time assertion that a sufficiently up-to-date version
-// of the legacy proto package is being used.
-const _ = proto.ProtoPackageIsVersion4
-
-// The request message containing the user's name.
-type HelloRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *HelloRequest) Reset() {
-	*x = HelloRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *HelloRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HelloRequest) ProtoMessage() {}
-
-func (x *HelloRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_proto_msgTypes[0]
-	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 HelloRequest.ProtoReflect.Descriptor instead.
-func (*HelloRequest) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{0}
-}
-
-func (x *HelloRequest) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-// The response message containing the greetings
-type HelloReply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Message   string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-	GoSDNInfo string `protobuf:"bytes,2,opt,name=goSDNInfo,proto3" json:"goSDNInfo,omitempty"`
-}
-
-func (x *HelloReply) Reset() {
-	*x = HelloReply{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *HelloReply) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*HelloReply) ProtoMessage() {}
-
-func (x *HelloReply) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_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 HelloReply.ProtoReflect.Descriptor instead.
-func (*HelloReply) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *HelloReply) GetMessage() string {
-	if x != nil {
-		return x.Message
-	}
-	return ""
-}
-
-func (x *HelloReply) GetGoSDNInfo() string {
-	if x != nil {
-		return x.GoSDNInfo
-	}
-	return ""
-}
-
-// Request to shutdown goSDN
-type ShutdownRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *ShutdownRequest) Reset() {
-	*x = ShutdownRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ShutdownRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ShutdownRequest) ProtoMessage() {}
-
-func (x *ShutdownRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_proto_msgTypes[2]
-	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 ShutdownRequest.ProtoReflect.Descriptor instead.
-func (*ShutdownRequest) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{2}
-}
-
-func (x *ShutdownRequest) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-// The response message containing some shutdown notes of goSDN
-type ShutdownReply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-}
-
-func (x *ShutdownReply) Reset() {
-	*x = ShutdownReply{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[3]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *ShutdownReply) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*ShutdownReply) ProtoMessage() {}
-
-func (x *ShutdownReply) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_proto_msgTypes[3]
-	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 ShutdownReply.ProtoReflect.Descriptor instead.
-func (*ShutdownReply) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{3}
-}
-
-func (x *ShutdownReply) GetMessage() string {
-	if x != nil {
-		return x.Message
-	}
-	return ""
-}
-
-// Request with no meaning by now
-type TAPIRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *TAPIRequest) Reset() {
-	*x = TAPIRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[4]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TAPIRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TAPIRequest) ProtoMessage() {}
-
-func (x *TAPIRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_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 TAPIRequest.ProtoReflect.Descriptor instead.
-func (*TAPIRequest) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{4}
-}
-
-func (x *TAPIRequest) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-// The response message containing a string with no meaning by now
-type TAPIReply struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
-}
-
-func (x *TAPIReply) Reset() {
-	*x = TAPIReply{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_cliInterface_gosdnCLI_proto_msgTypes[5]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *TAPIReply) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*TAPIReply) ProtoMessage() {}
-
-func (x *TAPIReply) ProtoReflect() protoreflect.Message {
-	mi := &file_cliInterface_gosdnCLI_proto_msgTypes[5]
-	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 TAPIReply.ProtoReflect.Descriptor instead.
-func (*TAPIReply) Descriptor() ([]byte, []int) {
-	return file_cliInterface_gosdnCLI_proto_rawDescGZIP(), []int{5}
-}
-
-func (x *TAPIReply) GetMessage() string {
-	if x != nil {
-		return x.Message
-	}
-	return ""
-}
-
-var File_cliInterface_gosdnCLI_proto protoreflect.FileDescriptor
-
-var file_cliInterface_gosdnCLI_proto_rawDesc = []byte{
-	0x0a, 0x1b, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x67,
-	0x6f, 0x73, 0x64, 0x6e, 0x43, 0x4c, 0x49, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63,
-	0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x48,
-	0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
-	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
-	0x44, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x6f, 0x53, 0x44, 0x4e,
-	0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x53, 0x44,
-	0x4e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x25, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77,
-	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0d,
-	0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a,
-	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x21, 0x0a, 0x0b, 0x54, 0x41, 0x50, 0x49, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x09, 0x54, 0x41,
-	0x50, 0x49, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x32, 0xea, 0x02, 0x0a, 0x07, 0x47, 0x72, 0x70, 0x63, 0x43, 0x6c, 0x69, 0x12, 0x42, 0x0a,
-	0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x49,
-	0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72,
-	0x66, 0x61, 0x63, 0x65, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22,
-	0x00, 0x12, 0x48, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1d, 0x2e,
-	0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x68, 0x75,
-	0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63,
-	0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74,
-	0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x54,
-	0x41, 0x50, 0x49, 0x47, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69,
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x41, 0x50, 0x49, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72,
-	0x66, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x41, 0x50, 0x49, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00,
-	0x12, 0x47, 0x0a, 0x0f, 0x54, 0x41, 0x50, 0x49, 0x47, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x4e,
-	0x6f, 0x64, 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
-	0x63, 0x65, 0x2e, 0x54, 0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17,
-	0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x41,
-	0x50, 0x49, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x41, 0x50,
-	0x49, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e,
-	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x54, 0x41, 0x50, 0x49, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
-	0x63, 0x65, 0x2e, 0x54, 0x41, 0x50, 0x49, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x50,
-	0x0a, 0x1e, 0x64, 0x65, 0x2e, 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x67, 0x6f,
-	0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
-	0x42, 0x0c, 0x63, 0x6c, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x50, 0x01,
-	0x5a, 0x1e, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64,
-	0x61, 0x2e, 0x64, 0x65, 0x2f, 0x63, 0x6f, 0x63, 0x73, 0x6e, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_cliInterface_gosdnCLI_proto_rawDescOnce sync.Once
-	file_cliInterface_gosdnCLI_proto_rawDescData = file_cliInterface_gosdnCLI_proto_rawDesc
-)
-
-func file_cliInterface_gosdnCLI_proto_rawDescGZIP() []byte {
-	file_cliInterface_gosdnCLI_proto_rawDescOnce.Do(func() {
-		file_cliInterface_gosdnCLI_proto_rawDescData = protoimpl.X.CompressGZIP(file_cliInterface_gosdnCLI_proto_rawDescData)
-	})
-	return file_cliInterface_gosdnCLI_proto_rawDescData
-}
-
-var file_cliInterface_gosdnCLI_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
-var file_cliInterface_gosdnCLI_proto_goTypes = []interface{}{
-	(*HelloRequest)(nil),    // 0: cliInterface.HelloRequest
-	(*HelloReply)(nil),      // 1: cliInterface.HelloReply
-	(*ShutdownRequest)(nil), // 2: cliInterface.ShutdownRequest
-	(*ShutdownReply)(nil),   // 3: cliInterface.ShutdownReply
-	(*TAPIRequest)(nil),     // 4: cliInterface.TAPIRequest
-	(*TAPIReply)(nil),       // 5: cliInterface.TAPIReply
-}
-var file_cliInterface_gosdnCLI_proto_depIdxs = []int32{
-	0, // 0: cliInterface.GrpcCli.SayHello:input_type -> cliInterface.HelloRequest
-	2, // 1: cliInterface.GrpcCli.Shutdown:input_type -> cliInterface.ShutdownRequest
-	4, // 2: cliInterface.GrpcCli.TAPIGetEdge:input_type -> cliInterface.TAPIRequest
-	4, // 3: cliInterface.GrpcCli.TAPIGetEdgeNode:input_type -> cliInterface.TAPIRequest
-	4, // 4: cliInterface.GrpcCli.TAPIGetLink:input_type -> cliInterface.TAPIRequest
-	1, // 5: cliInterface.GrpcCli.SayHello:output_type -> cliInterface.HelloReply
-	3, // 6: cliInterface.GrpcCli.Shutdown:output_type -> cliInterface.ShutdownReply
-	5, // 7: cliInterface.GrpcCli.TAPIGetEdge:output_type -> cliInterface.TAPIReply
-	5, // 8: cliInterface.GrpcCli.TAPIGetEdgeNode:output_type -> cliInterface.TAPIReply
-	5, // 9: cliInterface.GrpcCli.TAPIGetLink:output_type -> cliInterface.TAPIReply
-	5, // [5:10] is the sub-list for method output_type
-	0, // [0:5] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_cliInterface_gosdnCLI_proto_init() }
-func file_cliInterface_gosdnCLI_proto_init() {
-	if File_cliInterface_gosdnCLI_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_cliInterface_gosdnCLI_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*HelloRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_cliInterface_gosdnCLI_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*HelloReply); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_cliInterface_gosdnCLI_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ShutdownRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_cliInterface_gosdnCLI_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ShutdownReply); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_cliInterface_gosdnCLI_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TAPIRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_cliInterface_gosdnCLI_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TAPIReply); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_cliInterface_gosdnCLI_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   6,
-			NumExtensions: 0,
-			NumServices:   1,
-		},
-		GoTypes:           file_cliInterface_gosdnCLI_proto_goTypes,
-		DependencyIndexes: file_cliInterface_gosdnCLI_proto_depIdxs,
-		MessageInfos:      file_cliInterface_gosdnCLI_proto_msgTypes,
-	}.Build()
-	File_cliInterface_gosdnCLI_proto = out.File
-	file_cliInterface_gosdnCLI_proto_rawDesc = nil
-	file_cliInterface_gosdnCLI_proto_goTypes = nil
-	file_cliInterface_gosdnCLI_proto_depIdxs = nil
-}
diff --git a/cliInterface/gosdnCLI.proto b/cliInterface/gosdnCLI.proto
deleted file mode 100644
index fa76e03959152bed3829ff5f8e70b5379e3becca..0000000000000000000000000000000000000000
--- a/cliInterface/gosdnCLI.proto
+++ /dev/null
@@ -1,58 +0,0 @@
-syntax = "proto3";
-
-option go_package = "gitlab.fbi.h-da.de/cocsn/gosdn";
-option java_multiple_files = true;
-option java_package = "de.h-da.fbi.gosdn.cliInterface";
-option java_outer_classname = "cliInterface";
-
-
-package cliInterface;
-
-// The greeting service definition.
-service GrpcCli {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (HelloReply) {}
-  // Shutdown goSDN
-  rpc Shutdown (ShutdownRequest) returns (ShutdownReply) {}
-
-  // By now solely TAPI specific calls can be issued from the grpc-cli
-  // TAPIGetEdge
-  rpc TAPIGetEdge (TAPIRequest) returns (TAPIReply) {}
-  //TAPIGetEdgeNode
-  rpc TAPIGetEdgeNode (TAPIRequest) returns (TAPIReply) {}
-  // TAPIGetLink
-  rpc TAPIGetLink (TAPIRequest) returns (TAPIReply) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
-
-// The response message containing the greetings
-message HelloReply {
-  string message = 1;
-  string goSDNInfo = 2;
-}
-
-// Request to shutdown goSDN
-message ShutdownRequest {
-  string name = 1;
-}
-
-// The response message containing some shutdown notes of goSDN
-message ShutdownReply {
-  string message = 1;
-}
-
-// Request with no meaning by now
-message TAPIRequest {
-  string name = 1;
-}
-
-// The response message containing a string with no meaning by now
-message TAPIReply {
-  string message = 1;
-}
-
-
diff --git a/cliInterface/gosdnCLI_grpc.pb.go b/cliInterface/gosdnCLI_grpc.pb.go
deleted file mode 100644
index 600414a6a07222330fb9ebabee938dad31b82666..0000000000000000000000000000000000000000
--- a/cliInterface/gosdnCLI_grpc.pb.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-
-package gosdn
-
-import (
-	context "context"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-)
-
-// 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
-
-// GrpcCliClient is the client API for GrpcCli 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 GrpcCliClient interface {
-	// Sends a greeting
-	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
-	// Shutdown goSDN
-	Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*ShutdownReply, error)
-	// By now solely TAPI specific calls can be issued from the grpc-cli
-	// TAPIGetEdge
-	TAPIGetEdge(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error)
-	//TAPIGetEdgeNode
-	TAPIGetEdgeNode(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error)
-	// TAPIGetLink
-	TAPIGetLink(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error)
-}
-
-type grpcCliClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewGrpcCliClient(cc grpc.ClientConnInterface) GrpcCliClient {
-	return &grpcCliClient{cc}
-}
-
-func (c *grpcCliClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) {
-	out := new(HelloReply)
-	err := c.cc.Invoke(ctx, "/cliInterface.GrpcCli/SayHello", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *grpcCliClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*ShutdownReply, error) {
-	out := new(ShutdownReply)
-	err := c.cc.Invoke(ctx, "/cliInterface.GrpcCli/Shutdown", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *grpcCliClient) TAPIGetEdge(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error) {
-	out := new(TAPIReply)
-	err := c.cc.Invoke(ctx, "/cliInterface.GrpcCli/TAPIGetEdge", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *grpcCliClient) TAPIGetEdgeNode(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error) {
-	out := new(TAPIReply)
-	err := c.cc.Invoke(ctx, "/cliInterface.GrpcCli/TAPIGetEdgeNode", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *grpcCliClient) TAPIGetLink(ctx context.Context, in *TAPIRequest, opts ...grpc.CallOption) (*TAPIReply, error) {
-	out := new(TAPIReply)
-	err := c.cc.Invoke(ctx, "/cliInterface.GrpcCli/TAPIGetLink", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// GrpcCliServer is the server API for GrpcCli service.
-// All implementations must embed UnimplementedGrpcCliServer
-// for forward compatibility
-type GrpcCliServer interface {
-	// Sends a greeting
-	SayHello(context.Context, *HelloRequest) (*HelloReply, error)
-	// Shutdown goSDN
-	Shutdown(context.Context, *ShutdownRequest) (*ShutdownReply, error)
-	// By now solely TAPI specific calls can be issued from the grpc-cli
-	// TAPIGetEdge
-	TAPIGetEdge(context.Context, *TAPIRequest) (*TAPIReply, error)
-	//TAPIGetEdgeNode
-	TAPIGetEdgeNode(context.Context, *TAPIRequest) (*TAPIReply, error)
-	// TAPIGetLink
-	TAPIGetLink(context.Context, *TAPIRequest) (*TAPIReply, error)
-	mustEmbedUnimplementedGrpcCliServer()
-}
-
-// UnimplementedGrpcCliServer must be embedded to have forward compatible implementations.
-type UnimplementedGrpcCliServer struct {
-}
-
-func (*UnimplementedGrpcCliServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
-}
-func (*UnimplementedGrpcCliServer) Shutdown(context.Context, *ShutdownRequest) (*ShutdownReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented")
-}
-func (*UnimplementedGrpcCliServer) TAPIGetEdge(context.Context, *TAPIRequest) (*TAPIReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TAPIGetEdge not implemented")
-}
-func (*UnimplementedGrpcCliServer) TAPIGetEdgeNode(context.Context, *TAPIRequest) (*TAPIReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TAPIGetEdgeNode not implemented")
-}
-func (*UnimplementedGrpcCliServer) TAPIGetLink(context.Context, *TAPIRequest) (*TAPIReply, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method TAPIGetLink not implemented")
-}
-func (*UnimplementedGrpcCliServer) mustEmbedUnimplementedGrpcCliServer() {}
-
-func RegisterGrpcCliServer(s *grpc.Server, srv GrpcCliServer) {
-	s.RegisterService(&_GrpcCli_serviceDesc, srv)
-}
-
-func _GrpcCli_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GrpcCliServer).SayHello(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/cliInterface.GrpcCli/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GrpcCliServer).SayHello(ctx, req.(*HelloRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _GrpcCli_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(ShutdownRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GrpcCliServer).Shutdown(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/cliInterface.GrpcCli/Shutdown",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GrpcCliServer).Shutdown(ctx, req.(*ShutdownRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _GrpcCli_TAPIGetEdge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(TAPIRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GrpcCliServer).TAPIGetEdge(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/cliInterface.GrpcCli/TAPIGetEdge",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GrpcCliServer).TAPIGetEdge(ctx, req.(*TAPIRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _GrpcCli_TAPIGetEdgeNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(TAPIRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GrpcCliServer).TAPIGetEdgeNode(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/cliInterface.GrpcCli/TAPIGetEdgeNode",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GrpcCliServer).TAPIGetEdgeNode(ctx, req.(*TAPIRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _GrpcCli_TAPIGetLink_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(TAPIRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GrpcCliServer).TAPIGetLink(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/cliInterface.GrpcCli/TAPIGetLink",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GrpcCliServer).TAPIGetLink(ctx, req.(*TAPIRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _GrpcCli_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "cliInterface.GrpcCli",
-	HandlerType: (*GrpcCliServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "SayHello",
-			Handler:    _GrpcCli_SayHello_Handler,
-		},
-		{
-			MethodName: "Shutdown",
-			Handler:    _GrpcCli_Shutdown_Handler,
-		},
-		{
-			MethodName: "TAPIGetEdge",
-			Handler:    _GrpcCli_TAPIGetEdge_Handler,
-		},
-		{
-			MethodName: "TAPIGetEdgeNode",
-			Handler:    _GrpcCli_TAPIGetEdgeNode_Handler,
-		},
-		{
-			MethodName: "TAPIGetLink",
-			Handler:    _GrpcCli_TAPIGetLink_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "cliInterface/gosdnCLI.proto",
-}
diff --git a/clients.toml b/clients.toml
deleted file mode 100644
index 7a37fdcaac8aaa9d9563d2c591cf2a480943072b..0000000000000000000000000000000000000000
--- a/clients.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[[client]]
-identifier = "ciena-mcp"
-endpoint = "141.100.70.170:8080"
\ No newline at end of file
diff --git a/cmd/addDevice.go b/cmd/addDevice.go
new file mode 100644
index 0000000000000000000000000000000000000000..3b98c03b9ba3af1a506672c5d5f3227e83535823
--- /dev/null
+++ b/cmd/addDevice.go
@@ -0,0 +1,59 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// addDeviceCmd represents the addDevice command
+var addDeviceCmd = &cobra.Command{
+	Use:   "add-device",
+	Short: "adds a device to the controller",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(
+			apiEndpoint,
+			"addDevice",
+			"address="+address,
+			"password="+password,
+			"username="+username,
+			"sbi="+cliSbi,
+			"pnd="+cliPnd,
+		)
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(addDeviceCmd)
+}
diff --git a/cmd/capabilities.go b/cmd/capabilities.go
new file mode 100644
index 0000000000000000000000000000000000000000..fe687884a67b8e7360cac82a7720ae7de3d1cec4
--- /dev/null
+++ b/cmd/capabilities.go
@@ -0,0 +1,52 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// capabilitiesCmd represents the capabilities command
+var capabilitiesCmd = &cobra.Command{
+	Use:   "capabilities",
+	Short: "capabilities request",
+	Long: `Sends a gNMI Capabilities request to the specified target
+// and prints the supported models to stdout.`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.Capabilities(username, password, address)
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(capabilitiesCmd)
+}
diff --git a/cmd/cli.go b/cmd/cli.go
new file mode 100644
index 0000000000000000000000000000000000000000..1719e46debc53835d9337f6d47a88edf92ca311b
--- /dev/null
+++ b/cmd/cli.go
@@ -0,0 +1,58 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+var uuid string
+var apiEndpoint string
+
+// cliCmd represents the cli command
+var cliCmd = &cobra.Command{
+	Use:   "cli",
+	Short: "",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(apiEndpoint, "init")
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(cliCmd)
+
+	cliCmd.PersistentFlags().StringVar(&uuid, "uuid", "", "uuid of the requested device")
+	cliCmd.PersistentFlags().StringVar(&apiEndpoint, "api-endpoint", "http://localhost:8080", "address of the target")
+
+}
diff --git a/cmd/cliSet.go b/cmd/cliSet.go
new file mode 100644
index 0000000000000000000000000000000000000000..525125472c77281ca56d7e2b773c6a98831017e4
--- /dev/null
+++ b/cmd/cliSet.go
@@ -0,0 +1,60 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// cliSetCmd represents the cliSet command
+var cliSetCmd = &cobra.Command{
+	Use:   "set",
+	Short: "set a value on a device",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(
+			apiEndpoint,
+			"set",
+			"uuid="+uuid,
+			"cliSbi="+cliSbi,
+			"cliPnd="+cliPnd,
+			"path="+args[0],
+			"address="+address,
+			"value="+args[1],
+		)
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(cliSetCmd)
+}
diff --git a/cmd/get.go b/cmd/get.go
new file mode 100644
index 0000000000000000000000000000000000000000..e2d42d80cd7697fef0d59c24615cc696d8e9f266
--- /dev/null
+++ b/cmd/get.go
@@ -0,0 +1,52 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// getCmd represents the get command
+var getCmd = &cobra.Command{
+	Use:   "gosdn get",
+	Short: "get request",
+	Long:  `Sends a gNMI Get request to the specified target and prints the response to stdout`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		_, err := cli.Get(address, username, password, args...)
+		return err
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(getCmd)
+}
diff --git a/cmd/getDevice.go b/cmd/getDevice.go
new file mode 100644
index 0000000000000000000000000000000000000000..b9d3408c15d9681c78ac447c152b563119211ed2
--- /dev/null
+++ b/cmd/getDevice.go
@@ -0,0 +1,57 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// getDeviceCmd represents the getDevice command
+var getDeviceCmd = &cobra.Command{
+	Use:   "get-device",
+	Short: "gets device information from the controller",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(
+			apiEndpoint,
+			"getDevice",
+			"uuid="+uuid,
+			"sbi="+cliSbi,
+			"pnd="+cliPnd,
+		)
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(getDeviceCmd)
+}
diff --git a/cmd/getIds.go b/cmd/getIds.go
new file mode 100644
index 0000000000000000000000000000000000000000..b4f0685be494c085b98226cb5c64f9877e4d1781
--- /dev/null
+++ b/cmd/getIds.go
@@ -0,0 +1,51 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// getIdsCmd represents the getIds command
+var getIdsCmd = &cobra.Command{
+	Use:   "get-ids",
+	Short: "gets device IDs from the controller",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(apiEndpoint, "getIDs")
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(getIdsCmd)
+}
diff --git a/cmd/gosdn/main.go b/cmd/gosdn/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..a87c9ff0e98464b7a0c8b1ede5808946d954ca4a
--- /dev/null
+++ b/cmd/gosdn/main.go
@@ -0,0 +1,37 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+package main
+
+import "code.fbi.h-da.de/cocsn/gosdn/cmd"
+
+func main() {
+	cmd.Execute()
+}
diff --git a/cmd/init.go b/cmd/init.go
new file mode 100644
index 0000000000000000000000000000000000000000..9a140f3c26fa1cd8c35a67987db1bf48326ca324
--- /dev/null
+++ b/cmd/init.go
@@ -0,0 +1,61 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// initCmd represents the init command
+var initCmd = &cobra.Command{
+	Use:   "init",
+	Short: "initialise SBI and PND",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(apiEndpoint, "init")
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(initCmd)
+
+	// Here you will define your flags and configuration settings.
+
+	// Cobra supports Persistent Flags which will work for this command
+	// and all subcommands, e.g.:
+	// initCmd.PersistentFlags().String("foo", "", "A help for foo")
+
+	// Cobra supports local flags which will only run when this command
+	// is called directly, e.g.:
+	// initCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
+}
diff --git a/cmd/legacy.go b/cmd/legacy.go
new file mode 100644
index 0000000000000000000000000000000000000000..2d90ae0936190e5522171eb91be8b244b1b8224f
--- /dev/null
+++ b/cmd/legacy.go
@@ -0,0 +1,51 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"errors"
+	"github.com/spf13/cobra"
+)
+
+// legacyCmd represents the legacy command
+var legacyCmd = &cobra.Command{
+	Use:   "legacy",
+	Short: "multiple ygot utils - not yet implemented",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return errors.New("not implemented")
+	},
+}
+
+func init() {
+	pathCmd.AddCommand(legacyCmd)
+}
diff --git a/cmd/path.go b/cmd/path.go
new file mode 100644
index 0000000000000000000000000000000000000000..abb49047ea79da513743c1cda48b774003725aea
--- /dev/null
+++ b/cmd/path.go
@@ -0,0 +1,51 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"errors"
+	"github.com/spf13/cobra"
+)
+
+// pathCmd represents the path command
+var pathCmd = &cobra.Command{
+	Use:   "path",
+	Short: "multiple ygot utils - not yet implemented",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return errors.New("not implemented")
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(pathCmd)
+}
diff --git a/cmd/request.go b/cmd/request.go
new file mode 100644
index 0000000000000000000000000000000000000000..7e887b79097f805e76d6bd8d78cdefd97c879b41
--- /dev/null
+++ b/cmd/request.go
@@ -0,0 +1,58 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// requestCmd represents the request command
+var requestCmd = &cobra.Command{
+	Use:   "request",
+	Short: "requests a path from a specified device on the controller",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(
+			apiEndpoint,
+			"request",
+			"uuid="+uuid,
+			"sbi="+cliSbi,
+			"pnd="+cliPnd,
+			"path="+args[0],
+		)
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(requestCmd)
+}
diff --git a/cmd/requestAll.go b/cmd/requestAll.go
new file mode 100644
index 0000000000000000000000000000000000000000..183d89d4a2b72a0e3b1acd02c7e31bf7d8cb4985
--- /dev/null
+++ b/cmd/requestAll.go
@@ -0,0 +1,57 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+// requestAllCmd represents the requestAll command
+var requestAllCmd = &cobra.Command{
+	Use:   "request-all",
+	Short: "requests specified path from all devices on the controller",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.HTTPGet(
+			apiEndpoint,
+			"requestAll",
+			"sbi="+cliSbi,
+			"pnd="+cliPnd,
+			"path="+args[0],
+		)
+	},
+}
+
+func init() {
+	cliCmd.AddCommand(requestAllCmd)
+}
diff --git a/cmd/root.go b/cmd/root.go
new file mode 100644
index 0000000000000000000000000000000000000000..ca92d95ce6b98af7d52ac3e7520b7f144ca1459f
--- /dev/null
+++ b/cmd/root.go
@@ -0,0 +1,125 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"context"
+	log "github.com/sirupsen/logrus"
+	"github.com/spf13/cobra"
+	"os"
+
+	"github.com/spf13/viper"
+)
+
+var cfgFile string
+var username string
+var password string
+var address string
+var loglevel string
+var grpcPort string
+var cliPnd string
+var cliSbi string
+
+// rootCmd represents the base command when called without any subcommands
+var rootCmd = &cobra.Command{
+	Use:   "gosdn",
+	Short: "starts the gosdn controller",
+	Long:  `Set GOSDN_DEBUG environment variable to enable debug logging.`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		ctx, cancel := context.WithCancel(context.Background())
+		defer cancel()
+		return nucleus.Run(ctx)
+	},
+}
+
+// Execute adds all child commands to the root command and sets flags appropriately.
+// This is called by main.main(). It only needs to happen once to the rootCmd.
+func Execute() {
+	if err := rootCmd.Execute(); err != nil {
+		log.WithFields(log.Fields{}).Error(err)
+		os.Exit(1)
+	}
+}
+
+func init() {
+	cobra.OnInitialize(initConfig)
+
+	// Here you will define your flags and configuration settings.
+	// Cobra supports persistent flags, which, if defined here,
+	// will be global for your application.
+
+	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is ./configs/gosdn.toml)")
+	rootCmd.PersistentFlags().StringVarP(&username, "username", "u", "admin", "username for a gnmi resource")
+	rootCmd.PersistentFlags().StringVarP(&password, "password", "p", "arista", "password for a gnmi resource")
+	rootCmd.PersistentFlags().StringVarP(&address, "address", "a", "ceos-cocsn.apps.ocp.fbi.h-da.de:6030", "address to a gnmi resource")
+	rootCmd.PersistentFlags().StringVarP(&loglevel, "log-level", "l", "", "log level 'debug' or 'trace'")
+
+	rootCmd.Flags().StringVar(&grpcPort, "grpc-port", "55055", "port for gRPC NBI")
+}
+
+// initConfig reads in config file and ENV variables if set.
+func initConfig() {
+	if cfgFile != "" {
+		// Use config file from the flag.
+		viper.SetConfigFile(cfgFile)
+	} else {
+		viper.AddConfigPath("./configs")
+		viper.AddConfigPath("/usr/local/etc/gosdn/")
+		viper.SetConfigType("toml")
+		viper.SetConfigName("gosdn")
+	}
+
+	viper.AutomaticEnv() // read in environment variables that match
+
+	// If a config file is found, read it in.
+	if err := viper.ReadInConfig(); err == nil {
+		log.Debug("Using config file:", viper.ConfigFileUsed())
+	}
+
+	viper.SetDefault("socket", ":"+grpcPort)
+	cliPnd = viper.GetString("CLI_PND")
+	cliSbi = viper.GetString("CLI_SBI")
+
+	loglevel = viper.GetString("GOSDN_LOG")
+	log.SetReportCaller(true)
+	switch loglevel {
+	case "trace":
+		log.SetLevel(log.TraceLevel)
+	case "debug":
+		log.SetLevel(log.DebugLevel)
+	default:
+		log.SetLevel(log.InfoLevel)
+		log.SetFormatter(&log.JSONFormatter{})
+		log.SetReportCaller(false)
+	}
+}
diff --git a/cmd/set.go b/cmd/set.go
new file mode 100644
index 0000000000000000000000000000000000000000..0f2b758cd13d23c428a83b6c24cccbe33b56b244
--- /dev/null
+++ b/cmd/set.go
@@ -0,0 +1,57 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+var typ string
+
+// setCmd represents the set command
+var setCmd = &cobra.Command{
+	Use:   "set",
+	Short: "set request",
+	Long: `Sends a gNMI Set request to the specified target. Only one
+		request per invocation supported.`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.Set(address, username, password, typ, args...)
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(setCmd)
+
+	setCmd.Flags().StringVarP(&typ, "type", "t", "update", "Type of the set request. "+
+		"Possible values: 'update', 'replace', and 'delete'")
+}
diff --git a/cmd/subscribe.go b/cmd/subscribe.go
new file mode 100644
index 0000000000000000000000000000000000000000..eac7b4518f6e4409759a4f01a037a7b78b893025
--- /dev/null
+++ b/cmd/subscribe.go
@@ -0,0 +1,59 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"github.com/spf13/cobra"
+)
+
+var sampleInterval int64
+var heartbeatInterval int64
+
+// subscribeCmd represents the subscribe command
+var subscribeCmd = &cobra.Command{
+	Use:   "subscribe",
+	Short: "subscribe to target",
+	Long: `Starts a gNMI subscriber requesting the specified paths on the target and logs the response to stdout.
+
+	Only 'stream' mode with 'sample' operation supported.`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.Subscribe(address, username, password, sampleInterval, heartbeatInterval, args...)
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(subscribeCmd)
+
+	subscribeCmd.Flags().Int64Var(&sampleInterval, "sample-rate", 5, "Sample rate per second.")
+	subscribeCmd.Flags().Int64Var(&heartbeatInterval, "heartbeat-rate", 1, "Heartbeat rate per second.")
+}
diff --git a/cmd/target.go b/cmd/target.go
new file mode 100644
index 0000000000000000000000000000000000000000..97224d87268e43bf3edadfa9368e141efe3148d0
--- /dev/null
+++ b/cmd/target.go
@@ -0,0 +1,56 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+
+	"github.com/spf13/cobra"
+)
+
+var bindAddr string
+
+// targetCmd represents the target command
+var targetCmd = &cobra.Command{
+	Use:   "target",
+	Short: "start gnmi target",
+	Long:  `Starts a gNMI target listening on the specified port.`,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return cli.Target(bindAddr)
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(targetCmd)
+
+	targetCmd.Flags().StringVar(&bindAddr, "bind-address", ":9339", "listen address of the target: [address]:port")
+}
diff --git a/cmd/util.go b/cmd/util.go
new file mode 100644
index 0000000000000000000000000000000000000000..cb2eeb19d92a95250edac97b53b84f9e3431c899
--- /dev/null
+++ b/cmd/util.go
@@ -0,0 +1,51 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"errors"
+	"github.com/spf13/cobra"
+)
+
+// utilCmd represents the util command
+var utilCmd = &cobra.Command{
+	Use:   "util",
+	Short: "multiple ygot utils - not yet implemented",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return errors.New("not implemented")
+	},
+}
+
+func init() {
+	ygotCmd.AddCommand(utilCmd)
+}
diff --git a/cmd/ygot.go b/cmd/ygot.go
new file mode 100644
index 0000000000000000000000000000000000000000..81ee206ba74db83bbc6e2550b6cde8fe928a9965
--- /dev/null
+++ b/cmd/ygot.go
@@ -0,0 +1,52 @@
+/*
+Copyright © 2021 da/net research group <danet.fbi.h-da.de>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package cmd
+
+import (
+	"errors"
+
+	"github.com/spf13/cobra"
+)
+
+// ygotCmd represents the ygot command
+var ygotCmd = &cobra.Command{
+	Use:   "ygot",
+	Short: "multiple ygot utils - not yet implemented",
+	Long:  ``,
+	RunE: func(cmd *cobra.Command, args []string) error {
+		return errors.New("not implemented")
+	},
+}
+
+func init() {
+	rootCmd.AddCommand(ygotCmd)
+}
diff --git a/configs/clients.toml b/configs/clients.toml
new file mode 100644
index 0000000000000000000000000000000000000000..ef551bf2ed1f85fb42a152bea10da5586c48726a
--- /dev/null
+++ b/configs/clients.toml
@@ -0,0 +1,5 @@
+[[client]]
+identifier = "ciena-mcp"
+endpoint = "172.17.0.3:8080"
+gjsonDefaultPath = "data.#.object_data.tapi-object-data"
+gjsonConnectionsPath = "data.#.object_data"
diff --git a/configs/gosdn.toml b/configs/gosdn.toml
new file mode 100644
index 0000000000000000000000000000000000000000..afbf780236c9462c00718754062a595d26731418
--- /dev/null
+++ b/configs/gosdn.toml
@@ -0,0 +1 @@
+CliSocket = ":55055"
diff --git a/database/database.go b/database/client.go
similarity index 81%
rename from database/database.go
rename to database/client.go
index 69efde8c303e1092eda2b8390fa70e6599d84c35..10e5414835fb523e273eecb87bf011535617f955 100644
--- a/database/database.go
+++ b/database/client.go
@@ -1,25 +1,31 @@
 package database
 
 import (
-	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"errors"
 	"github.com/neo4j/neo4j-go-driver/neo4j"
+	log "github.com/sirupsen/logrus"
+	"github.com/spf13/viper"
 )
 
-//Database is a database
+// Database is a database
+// deprecated
 type Database struct {
 	driver neo4j.Driver
 }
 
-//PND is a principle network domain
+// PND is a principle network domain
 type PND struct {
 	name        string
 	description string
 	interfaces  []string
 }
 
-//NewDatabaseClient creates a database client
-func NewDatabaseClient(uri, username, password string, encrypted bool) Database {
+// NewDatabaseClient creates a database ciena
+func NewDatabaseClient() Database {
+	uri := viper.GetString("db.socket")
+	username := viper.GetString("db.user")
+	password := viper.GetString("db.password")
+	encrypted := viper.GetBool("db.crypto")
 	driver := createDriver(uri, username, password, encrypted)
 
 	return Database{
@@ -27,7 +33,7 @@ func NewDatabaseClient(uri, username, password string, encrypted bool) Database
 	}
 }
 
-//createDriver creates a neo4j.Driver instance
+// createDriver creates a neo4j.Driver instance
 func createDriver(uri, username, password string, encrypted bool) neo4j.Driver {
 	driver, err := neo4j.NewDriver(
 		uri,
@@ -44,7 +50,7 @@ func createDriver(uri, username, password string, encrypted bool) neo4j.Driver {
 	return driver
 }
 
-//createSession creates a neo4j.Session
+// createSession creates a neo4j.Session
 func createSession(driver neo4j.Driver, write bool) neo4j.Session {
 	var sessionConfig neo4j.SessionConfig
 
@@ -63,7 +69,7 @@ func createSession(driver neo4j.Driver, write bool) neo4j.Session {
 	return session
 }
 
-//storePndTxFunc transaction to store a pnd in the database
+// storePndTxFunc transaction to store a pnd in the database
 func storePndTxFunc(name, description string, interfaces []string) neo4j.TransactionWork {
 	return func(tx neo4j.Transaction) (interface{}, error) {
 		query :=
@@ -93,7 +99,7 @@ func storePndTxFunc(name, description string, interfaces []string) neo4j.Transac
 	}
 }
 
-//StorePND stores the given principle network domain
+// StorePND stores the given principle network domain
 func (d Database) StorePND(pnd *PND) neo4j.Node {
 	session := createSession(d.driver, true)
 	defer session.Close()
@@ -165,8 +171,8 @@ func storeNodesTxFunc(json string, id int64) neo4j.TransactionWork {
 	}
 }
 
-//StoreNodes stores the given nodes to the database and adds them to a
-//principle networt domain (PND). It is required for a node to belong to a PND.
+// StoreNodes stores the given nodes to the database and adds them to a
+// principle networt domain (PND). It is required for a node to belong to a PND.
 func (d Database) StoreNodes(json string) []neo4j.Node {
 	//TODO: remove this after testing and add own gRPC call for it
 	testPND := PND{name: "test_PND", description: "very interesting", interfaces: []string{"TAPI", "RESTCONF"}}
@@ -184,15 +190,15 @@ func (d Database) StoreNodes(json string) []neo4j.Node {
 	return result.([]neo4j.Node)
 }
 
-//RemoveNodes removes the given nodes and their relationships
+// RemoveNodes removes the given nodes and their relationships
 func (d Database) RemoveNodes(json string) {}
 
-//RemoveSingleNode removes the given node and their relationship by id.
+// RemoveSingleNode removes the given node and their relationship by id.
 func (d Database) RemoveSingleNode(id string) {}
 
-//storeLinksTxFunc transaction to store links from a json.
-//creates relation between different devices.
-//returns a slice of those created relations.
+// storeLinksTxFunc transaction to store links from a json.
+// creates relation between different devices.
+// returns a slice of those created relations.
 func storeLinksTxFunc(json string) neo4j.TransactionWork {
 	return func(tx neo4j.Transaction) (interface{}, error) {
 		var relationsList []neo4j.Relationship
@@ -230,7 +236,7 @@ func storeLinksTxFunc(json string) neo4j.TransactionWork {
 	}
 }
 
-//StoreLinks stores the links between nodes
+// StoreLinks stores the links between nodes
 func (d Database) StoreLinks(json string) []neo4j.Relationship {
 	session := createSession(d.driver, true)
 	defer session.Close()
@@ -245,8 +251,8 @@ func (d Database) StoreLinks(json string) []neo4j.Relationship {
 	return result.([]neo4j.Relationship)
 }
 
-//storeNodeEdgePointsTxFunc transaction to store interfaces from a json.
-//returns count of added/updated interfaces
+// storeNodeEdgePointsTxFunc transaction to store interfaces from a json.
+// returns count of added/updated interfaces
 func storeNodeEdgePointsTxFunc(json string) neo4j.TransactionWork {
 	return func(tx neo4j.Transaction) (interface{}, error) {
 		query :=
@@ -282,8 +288,8 @@ func storeNodeEdgePointsTxFunc(json string) neo4j.TransactionWork {
 //TODO: currently this goes over each and every device/interface and adds
 //		a interface_of relation. -> do it only for the newly added interfaces
 
-//storeNodeEdgePointsRelationTxFunc transaction to create relations between interfaces and devices
-//returns count of added/updated relations
+// storeNodeEdgePointsRelationTxFunc transaction to create relations between interfaces and devices
+// returns count of added/updated relations
 func storeNodeEdgePointsRelationTxFunc() neo4j.TransactionWork {
 	return func(tx neo4j.Transaction) (interface{}, error) {
 		query :=
@@ -309,7 +315,7 @@ func storeNodeEdgePointsRelationTxFunc() neo4j.TransactionWork {
 	}
 }
 
-//StoreNodeEdgePoints stores the given node edge points (interfaces)
+// StoreNodeEdgePoints stores the given node edge points (interfaces)
 func (d Database) StoreNodeEdgePoints(json string) {
 	session := createSession(d.driver, true)
 	defer session.Close()
@@ -327,27 +333,27 @@ func (d Database) StoreNodeEdgePoints(json string) {
 	log.Info("added/updated nodeEdgePoints (count): ", result)
 }
 
-//StoreConnections stores relations between nodes
+// StoreConnections stores relations between nodes
 func (d Database) StoreConnections(json string) {}
 
-//StoreTopology creates a new network topology node. Can also create a relation
+// StoreTopology creates a new network topology node. Can also create a relation
 //the new node and a existing one if desired
 func StoreTopology() {}
 
-//RemoveTopology removes the given network topology. This includes the node itself
+// RemoveTopology removes the given network topology. This includes the node itself
 //aswell as the containing links and relations
 func RemoveTopology() {}
 
-//CreateTopologyRelation creates a relation between two given topologies
+// CreateTopologyRelation creates a relation between two given topologies
 func CreateTopologyRelation() {}
 
-//CreateLink creates a link between two network elements
+// CreateLink creates a link between two network elements
 func CreateLink() {}
 
-//RemoveLink removes a link between two network elements
+// RemoveLink removes a link between two network elements
 func RemoveLink() {}
 
-//Shutdown closes the connection to the database
+// Shutdown closes the connection to the database
 func (d Database) Shutdown() error {
 	return d.driver.Close()
 }
diff --git a/documentation/architecture.png b/documentation/architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..d56101394e87c5584b4a770d3fdd201da378b1b1
Binary files /dev/null and b/documentation/architecture.png differ
diff --git a/documentation/design/01-introduction.md b/documentation/design/01-introduction.md
index 3b25e160b6702889591fdc4f8be63a3b44a9996b..d076a98546b199172d0c76b1ee001ae4722e8f59 100644
--- a/documentation/design/01-introduction.md
+++ b/documentation/design/01-introduction.md
@@ -1,16 +1,25 @@
 # Introduction
-This memo is the documentation of the concepts and the implementation of the goSDN controller. goSDN is one possible instance of a SDN controller designed for the operation of optical and non-optical networks. One key item is also the support of teaching in networking by using goSDN and this documentation.
+Data networks consists out of a variety of different network elements, link types, end hosts, services and requirements of such services. Further data networks consists not only of a single plane, but have different (logical) networking planes that have different tasks within any data network, i.e., the control plane, data plane and the network management plane. Keeping track of the different elements, links, hosts, services, their interactions, their runtime behavior on the 3 networking planes is a non-trivial tasks that is usually subsumed under the very broad term of network operations. 
+
+There are different approaches for network operations that are not only divided by their logical distinction but also how an implementer, typically network equipment vendor, is implementing the network elements and the particular operations. 
+
+We outline two basic approaches to network operation:
+
+1.  fully integrated network operations of all networking planes, i.e., usually called the traditional approach.
+2. separation of control- and data planes, i.e., usually called the Software Defined Networking (SDN) approch, though there have been implementations of this concept earlier than SDN with other names, e.g., Forwarding and Control Separation (ForCeS) and others. 
+
 
 ## Motivation
 
 ## Overarching Project Goals
 
 * Keep It Simple, Stupid (KISS)
-* Reuse existing technologies bits wherever possible
+* Reuse existing technologies bits wherever possible if those are stable, i.e., documented, maintained etc,  on a long time scale
 * Integrate state-of-the-art technologies and methodologies
-* Document, Document, Document
 * Automate almost everything right from the beginning
+* Document, Document, Document
 * be an excellent citizen: test, test, test
+* no hacks! 
 
 Some unsorted thoughts the be ordered yet:
 
@@ -22,4 +31,30 @@ Some unsorted thoughts the be ordered yet:
 * modules should be loaded (or unloaded) during runtime of the controller core
 
 
+## Use Cases to be considered
+
+The development of a general purpose SDN controller is not the primary goal at this early stage of the project.
+Instead there are two use cases to be considered in the implemenation works that are currently ongoing:
+* Primary: optical domain SDN-controller for the CoCSN project
+* Secondary: SDN-controller for our local labs to manage an Ethernet-based lab environment
+
+### Primary: optical domain SDN-controller for the CoCSN project
+
+For this use case we initally do not consider the direct control of optical network elements, e.g., Optical Add-Drop Multiplexer (OADM) but we focus on optical network domains managed by another (SDN) controllers. The goSDN controller communicates with this domain controller and can request information about the optical network elements, the links between them and the optical and logical configuration of the network domain. 
+
+In a second step, the goSDN controller has to communicate with multiple domain controllers and has to find potential interchange points between these multiple domains. This is the preparation for a later step in this use case, when the goSDN controller has to find a network path between two end-points across multiple optical domains, including backup paths. 
+
+The intention here is to use an existing SDN southbound interface, very likely based on RESTCONF. 
+
+### Secondary: SDN-controller for our local labs to manage an Ethernet-based lab environment
+
+For this use case we consider one of our local labs, e.g., either the telecommunications or networking lab, and how this lab with all its networking parts can be managed by the goSDN controller. In this case, the controller has to learn about all (network) elements, the links and the topology by obtaining all the required information and its own topology computation. This will require an interface between goSDN and the network components that is potentially beyond the typical SDN southbound interfaces. 
+
 ## Structure of this Memo
+
+This memo starts with this introduction that sets the stage for the theoretical underpinings of the SDN-controller
+and the acutal implementation (and the various choice for this). Chapter 2 discusses the related work and chapter 3
+outlines the theoretical foundations related to the control of networks and their relation to SDN. Chapter 4 uses
+the output of Chapter 3 to define the conceptual design of the goSDN controller and some discussions about the pro
+and cons of conceptual design. Chapter 5 describes the actual design of the current goSDN implementation and is 
+meant to be a compendium for the source code. 
diff --git a/documentation/design/04-conceptual-design.md b/documentation/design/04-conceptual-design.md
index eacaad232a44d503eca936d20ed6170484f9df46..6fcdbc5437a55e3c91b3fed9ffcd59d24c5a7b1a 100644
--- a/documentation/design/04-conceptual-design.md
+++ b/documentation/design/04-conceptual-design.md
@@ -137,3 +137,18 @@ An half-unsorted list of core functions:
 * **Northbound Interface (SBI)** 
 
 * **East-West-bound Interface (SBI)**
+
+
+## Applying Changes to What Plane?
+
+Some basic thoughts to dissect how different approaches are applying changes to the various planes. 
+
+### Changes to the Control Plane
+
+### Changes to the Data Plane
+
+This is the use case for the SDN approach: A so-called SDN-controller applies policy rules to the data plane. These policy rules are defining the handling of the flows in the networks on a larger scale or to be more precise the handling of more less specified packets. 
+
+A change to the data plane will not directly trigger a change to other planes. Though the flow of packets on the data plane can be observed by the control plane and the control plane can take action depending on the data packets. 
+
+### Changes to the Management Plane
diff --git a/documentation/design/05-implementation.md b/documentation/design/05-implementation.md
index 5fab531916ae5f9bcb94e86ca0f348d6bf461156..6a1c3aaee2b0d9703e7e6cf76358609180f522e6 100644
--- a/documentation/design/05-implementation.md
+++ b/documentation/design/05-implementation.md
@@ -2,6 +2,220 @@
 
 
 ## Why we do this in go
+Because it rocks, but let's see afterwards what can be written here.
+
+## Storing Information
+
+Section XXX (Conceptual Design of a SDN Controller as Network Supervisor)
+discusses the need to store information about for element inventories and
+topology inventories.
+
+### Element Inventories
+
+Storing information about network elements and their properties is a relative
+static process, at least when one considers potential changes over time.
+Typically such network elements are added to a network and they will remain in
+the network for a longer time, i.e., multiple minutes or even longer.
+
+### Topology Inventory
+
+Every network has one given physical topology (G<sub>physical</sub> ) and on
+top of this at least one logical topology (G<sub>logical1</sub>). There may be
+multiple logical topologies (G<sub>n+1</sub>) on top logical topologies
+(G<sub>n</sub>), i.e., a recursion. Such logical topologies (G<sub>n+1</sub>)
+can again have other logical topologies as recursion or other logical topologies
+in parallel.
+
+A topology consists out of interfaces, which are attached to their respective
+network elements, and links between these interfaces.
+
+Mathematically, such a topology can be described as a directed graph, whereas
+the interfaces of the network elements are the nodes and the links are
+the edges.
+
+G<sub>physical</sub> ist a superset of G<sub>logical1</sub>.
+
+The topology inventory has to store the particular graph for any topology and
+also the connections between the different levels of topologies. For instance,
+the G<sub>logical1</sub> is linked to G<sub>physical</sub>. (needs to be clear
+if changes in n-1 graph has impact on n graph).
+
+For further study at this point: Which type of database and implementation of
+databases should be used to store the different topology graphs and their
+pontential dependencies? How should the interface between gosdn and this
+database look like?
+
+Here is an attempt to describe the above text in a graphical reprensetation (kinda of...not perfect yet):
+
+```mermaid
+graph TB
+
+  SubGraph1 --> SubGraph1Flow
+  subgraph "G_logical1"
+  SubGraph1Flow(Logical Net)
+  Node1_l1[Node1_l1] <--> Node2_l1[Node2_l1] <--> Node3_l1[Node3_l1] <--> Node4_l1[Node4_l1] <--> Node5_l1[Node5_l1] <--> Node1_l1[Node1_l1]
+  end
+
+  subgraph "G_physical"
+  Node1[Node 1] <--> Node2[Node 2] <--> Node3[Node 3]
+  Node4[Node 4] <--> Node2[Node 2] <--> Node5[Node 5]
+
+  Net_physical[Net_physical] --> SubGraph1[Reference to G_logical1]
+
+end
+```
+
+### Potential other Inventories
+
+There may be the potential need to store information beyond pure topologies,
+actually about network flows, i.e., information about a group of packets
+belonging together.
+
+## Database
+A database will be used for the management and persistence of network
+topologies and their associated elements within goSDN.
+
+Since network topologies are often depicted as graphs, it was obvious to stick
+to this concept and, also due to their increasing popularity, to use a graph
+database. After a more intensive examination of graph databases it was found
+that they (with their labels, nodes, relations and properties) are well suited
+for a representation of network topologies.
+
+The first basic idea was to create different single graphs representing the
+different network topologies and label each node and edge to ensure a clear
+assignment to a topology.
+This would mean that nodes and edges of a graph have 1...n labels.
+Therefore if you want to display a simple network topology in a graph, you can
+display the different network elements as individual nodes and the edges between
+network elements as their respective connections, such as Ethernet.
+This works with both physical and logical topologies, which are described in
+more detail [here](#topology-inventory).
+So a simple topology in a graph database could look like shown below.
+
+```mermaid
+graph TD
+A[Node 1 - Label: 'Host,physical'] -->|Ethernet - Label: 'physical'| B[Node 2 - Label: 'Hub,physical']
+C[Node 3 - Label: 'Host,physical'] -->|Ethernet - Label: 'physical'| B
+B -->|Ethernet - Label: 'physical'| D[Node 4 - Label: 'Host,physical']
+B -->|Ethernet - Label: 'physical'| E[Node 5 - Label: 'Host,physical']
+```
+
+For this purpose some experiments with the [Redis](https://redis.io/)-Database
+module [`RedisGraph`](https://oss.redislabs.com/redisgraph/) were carried out
+first. The basic implementation was possible, but the function of assigning
+several labels to one node/edge is missing (originally we considered this to be
+indispensable especially to map different topologies).
+For this reason we looked around for an alternative and with
+[neo4j](https://neo4j.com/) we found a graph database, which gives us the
+possibility to label nodes and edges with a multitude of labels and offers a
+wide range of additional plugins such as [apoc](https://neo4j.com/labs/apoc/).
+
+### neo4j
+TODO: add a little description for neo4j in general
+
+#### Implementation With neo4j
+The current implementation offers the possibility to persist different network
+elements (e.g. devices, interfaces...) and their physical topology and mainly
+serves to represent the prototypical dataflow of goSDN to the database.
+The following figure shows our first idea of a persistence of network
+topologies with neo4j (to save space, only the labels were included).
+```mermaid
+graph TD
+  PND[PND 1]
+  A --> |belongs to| PND
+  B --> |belongs to| PND
+  C --> |belongs to| PND
+  D --> |belongs to| PND
+  E --> |belongs to| PND
+
+  A[Label: 'Host,physical,logical1'] --> |Label: 'physical'| B[Label: 'Hub,physical,logical1']
+  D[Label: 'Host,physical,logical1'] --> |Label: 'physical'| B
+  B --> |Label: 'physical'| C[Label: 'Host,physical,logical1']
+  B --> |Label: 'physical'| E[Label: 'Host,physical,logical1']
+
+  A --> |Label: 'logical1'| B
+  B --> |Label: 'logical1'| C
+  C --> |Label: 'logical1'| D
+  D --> |Label: 'logical1'| E
+  E --> |Label: 'logical1'| A
+```
+
+The basic idea is to assign the different network elements to a specific
+Principal Network Domain (PND). The different topologies are represented by a
+neo4j relationship between the network elements that are stored as neo4j nodes.
+However, with this current variant it is not possible, as required in
+[Topology Inventory](#topology-inventory), to represent topologies that are hierarchically
+interdependent, since neo4j does not allow relations to be stored as properties
+(as described [here](https://neo4j.com/docs/cypher-manual/current/syntax/values/#structural-types)).
+Furthermore, multiple links between the same nodes which belong to the same
+topology are difficult to represent, since this model only provides a single
+link between nodes of a certain topology.
+
+For the reason mentioned above, a more complex idea for persistence is available
+for the further development, which hopefully allows us to persist and map
+network elements, PNDs and topologies with all their hirarchical dependencies.
+
+The following figure tries to visualize this idea.
+```mermaid
+graph TD
+  subgraph "dependencies of topologies"
+      logical1 -->|related_to| physical
+      logical5 -->|related_to| physical
+      logical3 -->|related_to| logical1
+  end
+
+  subgraph "every node belongs to a specific PND"
+    Node1 -->|belongs_to| PND
+    Node2 -->|belongs_to| PND
+    Node3 -->|belongs_to| PND
+    Node4 -->|belongs_to| PND
+    Node5 -->|belongs_to| PND
+  end
+
+  subgraph "relationship between nodes (nodes can be linked by 0...n links)"
+    lp2[link_physical]
+    lp3[link_physical]
+    lp4[link_physical]
+    lp5[link_logical1]
+    lp2 --> |connects| Node4
+    lp2 --> |connects| Node2
+    lp3 --> |connects| Node2
+    lp3 --> |connects| Node3
+    lp4 --> |connects| Node2
+    lp4 --> |connects| Node5
+    lp5 --> |connects| Node1
+    lp5 --> |connects| Node2
+  end
+
+  subgraph "links are part of a topology"
+    lp1[link_physical]
+    lp1 --> |connects| Node1
+    lp1 --> |connects| Node2
+    lp1 --> |part_of| physical
+  end
+
+  subgraph "links can contain 1...n layers"
+    lp2 --> |contains| ODUH
+    lp2 --> |contains| OTUCN
+    lp2 --> |contains| ODUCN
+  end
+```
+The basic structure explained in the upper part remains the same.
+However, the relations, which previously served as links between the respective
+nodes, now become **separate nodes**. These nodes now act as links between the
+respective network elements and are part of a network topology (which itself
+is represented as a separate node in the graph). By this change, network
+topologies can now be interdependent. Furthermore, as can be seen in the figure
+above, you can add additional nodes to the link nodes by using this scheme.
+So a physical link between two nodes could e.g. **contain** several cables.
+All other information can be stored in the properties of the respective nodes/edges.
+
+The above idea is not yet approved and there are still open questions.
+- Is there a better solution for the assumption that there are several different physical connections between the same nodes than separate link nodes between them?
+- Can topologies run over different PNDs -> membership to different PNDs?
+- Where can we benefit from using different layers? (e.g. possible saving of unnecessary relations between nodes)
+- Do the sdn controllers provide us with the necessary information to map the topologies in this way?
+- ...
 
 ## YANG to code
 
@@ -11,7 +225,7 @@ The base of the development of goSDN are YANG modules. The RESTful API used for
 
 ### YANG
 
-YANG defines an abstract netwoprk interface. It is the foundation of the RESTCONF protocol. Several code generators exist to generate code stubs from a given definition.
+YANG defines an abstract network interface. It is the foundation of the RESTCONF protocol. Several code generators exist to generate code stubs from a given definition.
 
 ### OpenAPI
 
@@ -29,18 +243,18 @@ For now we can only use the OpenAPI 2.0 standard. This is because `go-swagger` d
 
 ## Storing Information
 
-This section keeps by now some loose thoughts about what information has to be stored how and where. 
+This section keeps by now some loose thoughts about what information has to be stored how and where.
 
 There seem to be two classes of information to be stored in the controller:
 * short-living information, such as, current configured network flows or obtained network configuration out of use case #1 (CoCSN)
-* long-time information, such as, information about principle network domains, elements in such a domain if directly learned from SBI, etc 
+* long-time information, such as, information about principle network domains, elements in such a domain if directly learned from SBI, etc
 
 Long-time information should be persistenly stored in the database and survive reboots of goSDN etc. Short-Living information doesn't have to survive reboots of goSDN
 
 
 ### Some more details for implementation for the database(s)
 
-We define the principle network domain (PND) and each piece of information of any PND has to be stored in relation the particular PND. 
+We define the principle network domain (PND) and each piece of information of any PND has to be stored in relation the particular PND.
 
 Specification of a PND:
 * Human readable name of PND
@@ -48,4 +262,4 @@ Specification of a PND:
 * Set of supported Southbound-Interfaces, e.g., RESTCONF, TAPI, OpenFlow etc
 * Physical Inventory Network Elements, hosts and links, pontentially only the SBI SDN controller
 
-A PND entry must be explicitly generated, though some information can be automatically be generated, e.g., the physical inventory for use-case #1 (CoCSN) would mean that the information about the SBI domain specific SDN controller is entered. 
\ No newline at end of file
+A PND entry must be explicitly generated, though some information can be automatically be generated, e.g., the physical inventory for use-case #1 (CoCSN) would mean that the information about the SBI domain specific SDN controller is entered.
diff --git a/forks/goarista/gnmi/arbitration.go b/forks/goarista/gnmi/arbitration.go
new file mode 100644
index 0000000000000000000000000000000000000000..78225d70240584b7e4e8b048bd833753b39ebc5e
--- /dev/null
+++ b/forks/goarista/gnmi/arbitration.go
@@ -0,0 +1,58 @@
+// Copyright (c) 2019 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"github.com/openconfig/gnmi/proto/gnmi_ext"
+)
+
+// ArbitrationExt takes a string representation of a master arbitration value
+// (e.g. "23", "role:42") and return a *gnmi_ext.Extension.
+func ArbitrationExt(s string) (*gnmi_ext.Extension, error) {
+	if s == "" {
+		return nil, nil
+	}
+	roleID, electionID, err := parseArbitrationString(s)
+	if err != nil {
+		return nil, err
+	}
+	arb := &gnmi_ext.MasterArbitration{
+		Role:       &gnmi_ext.Role{Id: roleID},
+		ElectionId: &gnmi_ext.Uint128{High: 0, Low: electionID},
+	}
+	ext := gnmi_ext.Extension_MasterArbitration{MasterArbitration: arb}
+	return &gnmi_ext.Extension{Ext: &ext}, nil
+}
+
+// parseArbitrationString parses the supplied string and returns the role and election id
+// values. Input is of the form [<role>:]<election_id>, where election_id is a uint64.
+//
+// Examples:
+//  "1"
+//  "admin:42"
+func parseArbitrationString(s string) (string, uint64, error) {
+	tokens := strings.Split(s, ":")
+	switch len(tokens) {
+	case 1: // just election id
+		id, err := parseElectionID(tokens[0])
+		return "", id, err
+	case 2: // role and election id
+		id, err := parseElectionID(tokens[1])
+		return tokens[0], id, err
+	}
+	return "", 0, fmt.Errorf("badly formed arbitration id (%s)", s)
+}
+
+func parseElectionID(s string) (uint64, error) {
+	id, err := strconv.ParseUint(s, 0, 64)
+	if err != nil {
+		return 0, fmt.Errorf("badly formed arbitration id (%s)", s)
+	}
+	return id, nil
+}
diff --git a/forks/goarista/gnmi/arbitration_test.go b/forks/goarista/gnmi/arbitration_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..cdcc37c35b8c332f3ae4279b66ddf7b46e8b8798
--- /dev/null
+++ b/forks/goarista/gnmi/arbitration_test.go
@@ -0,0 +1,73 @@
+// Copyright (c) 2019 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/aristanetworks/goarista/test"
+
+	"github.com/openconfig/gnmi/proto/gnmi_ext"
+)
+
+func arbitration(role string, id *gnmi_ext.Uint128) *gnmi_ext.Extension {
+	arb := &gnmi_ext.MasterArbitration{
+		Role:       &gnmi_ext.Role{Id: role},
+		ElectionId: id,
+	}
+	ext := gnmi_ext.Extension_MasterArbitration{MasterArbitration: arb}
+	return &gnmi_ext.Extension{Ext: &ext}
+}
+
+func electionID(high, low uint64) *gnmi_ext.Uint128 {
+	return &gnmi_ext.Uint128{High: high, Low: low}
+}
+
+func TestArbitrationExt(t *testing.T) {
+	testCases := map[string]struct {
+		s   string
+		ext *gnmi_ext.Extension
+		err error
+	}{
+		"empty": {},
+		"no_role": {
+			s:   "1",
+			ext: arbitration("", electionID(0, 1)),
+		},
+		"with_role": {
+			s:   "admin:1",
+			ext: arbitration("admin", electionID(0, 1)),
+		},
+		"large_no_role": {
+			s:   "9223372036854775807",
+			ext: arbitration("", electionID(0, 9223372036854775807)),
+		},
+		"large_with_role": {
+			s:   "admin:18446744073709551615",
+			ext: arbitration("admin", electionID(0, 18446744073709551615)),
+		},
+		"invalid": {
+			s:   "cat",
+			err: fmt.Errorf("badly formed arbitration id (%s)", "cat"),
+		},
+		"invalid_too_many_colons": {
+			s:   "dog:1:2",
+			err: fmt.Errorf("badly formed arbitration id (%s)", "dog:1:2"),
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			ext, err := ArbitrationExt(tc.s)
+			if !test.DeepEqual(tc.ext, ext) {
+				t.Errorf("Expected %#v, got %#v", tc.ext, ext)
+			}
+			if !test.DeepEqual(tc.err, err) {
+				t.Errorf("Expected %v, got %v", tc.err, err)
+			}
+		})
+	}
+}
diff --git a/forks/goarista/gnmi/client.go b/forks/goarista/gnmi/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..f9ed05b53fcd4852b7f5fa4c61d40e25c3688532
--- /dev/null
+++ b/forks/goarista/gnmi/client.go
@@ -0,0 +1,284 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"context"
+	"crypto/tls"
+	"crypto/x509"
+	"errors"
+	"fmt"
+	"math"
+	"net"
+	"os"
+
+	"io/ioutil"
+	"strings"
+
+	"github.com/golang/protobuf/proto"
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/credentials"
+	"google.golang.org/grpc/encoding/gzip"
+	"google.golang.org/grpc/metadata"
+)
+
+const (
+	defaultPort = "6030"
+	// HostnameArg is the value to be replaced by the actual hostname
+	HostnameArg = "HOSTNAME"
+)
+
+// PublishFunc is the method to publish responses
+type PublishFunc func(addr string, message proto.Message)
+
+// ParseHostnames parses a comma-separated list of names and replaces HOSTNAME with the current
+// hostname in it
+func ParseHostnames(list string) ([]string, error) {
+	items := strings.Split(list, ",")
+	hostname, err := os.Hostname()
+	if err != nil {
+		return nil, err
+	}
+	names := make([]string, len(items))
+	for i, name := range items {
+		if name == HostnameArg {
+			name = hostname
+		}
+		names[i] = name
+	}
+	return names, nil
+}
+
+// Config is the gnmi.Client config
+type Config struct {
+	Addr        string
+	CAFile      string
+	CertFile    string
+	KeyFile     string
+	Password    string
+	Username    string
+	TLS         bool
+	Compression string
+	DialOptions []grpc.DialOption
+	Token       string
+	Encoding    pb.Encoding
+}
+
+// SubscribeOptions is the gNMI subscription request options
+type SubscribeOptions struct {
+	UpdatesOnly       bool
+	Prefix            string
+	Mode              string
+	StreamMode        string
+	SampleInterval    uint64
+	SuppressRedundant bool
+	HeartbeatInterval uint64
+	Paths             [][]string
+	Origin            string
+	Target            string
+}
+
+// accessTokenCred implements credentials.PerRPCCredentials, the gRPC
+// interface for credentials that need to attach security information
+// to every RPC.
+type accessTokenCred struct {
+	bearerToken string
+}
+
+// newAccessTokenCredential constructs a new per-RPC credential from a token.
+func newAccessTokenCredential(token string) credentials.PerRPCCredentials {
+	bearerFmt := "Bearer %s"
+	return &accessTokenCred{bearerToken: fmt.Sprintf(bearerFmt, token)}
+}
+
+func (a *accessTokenCred) GetRequestMetadata(ctx context.Context,
+	uri ...string) (map[string]string, error) {
+	authHeader := "Authorization"
+	return map[string]string{
+		authHeader: a.bearerToken,
+	}, nil
+}
+
+func (a *accessTokenCred) RequireTransportSecurity() bool { return true }
+
+// DialContext connects to a gnmi service and returns a client
+func DialContext(ctx context.Context, cfg *Config) (pb.GNMIClient, error) {
+	opts := append([]grpc.DialOption(nil), cfg.DialOptions...)
+
+	switch cfg.Compression {
+	case "":
+	case "gzip":
+		opts = append(opts, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
+	default:
+		return nil, fmt.Errorf("unsupported compression option: %q", cfg.Compression)
+	}
+
+	if cfg.TLS || cfg.CAFile != "" || cfg.CertFile != "" || cfg.Token != "" {
+		tlsConfig := &tls.Config{}
+		if cfg.CAFile != "" {
+			b, err := ioutil.ReadFile(cfg.CAFile)
+			if err != nil {
+				return nil, err
+			}
+			cp := x509.NewCertPool()
+			if !cp.AppendCertsFromPEM(b) {
+				return nil, fmt.Errorf("credentials: failed to append certificates")
+			}
+			tlsConfig.RootCAs = cp
+		} else {
+			tlsConfig.InsecureSkipVerify = true
+		}
+		if cfg.CertFile != "" {
+			if cfg.KeyFile == "" {
+				return nil, fmt.Errorf("please provide both -certfile and -keyfile")
+			}
+			cert, err := tls.LoadX509KeyPair(cfg.CertFile, cfg.KeyFile)
+			if err != nil {
+				return nil, err
+			}
+			tlsConfig.Certificates = []tls.Certificate{cert}
+		}
+		if cfg.Token != "" {
+			opts = append(opts,
+				grpc.WithPerRPCCredentials(newAccessTokenCredential(cfg.Token)))
+		}
+		opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)))
+	} else {
+		opts = append(opts, grpc.WithInsecure())
+	}
+
+	dial := func(ctx context.Context, addrIn string) (conn net.Conn, err error) {
+		var network, addr string
+
+		split := strings.Split(addrIn, "://")
+		if l := len(split); l == 2 {
+			network = split[0]
+			addr = split[1]
+		} else {
+			network = "tcp"
+			addr = split[0]
+		}
+
+		conn, err = (&net.Dialer{}).DialContext(ctx, network, addr)
+		return
+	}
+
+	opts = append(opts,
+		grpc.WithContextDialer(dial),
+
+		// Allows received protobuf messages to be larger than 4MB
+		grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)),
+	)
+
+	grpcconn, err := grpc.DialContext(ctx, cfg.Addr, opts...)
+	if err != nil {
+		return nil, fmt.Errorf("failed to dial: %s", err)
+	}
+
+	return pb.NewGNMIClient(grpcconn), nil
+}
+
+// Dial connects to a gnmi service and returns a client
+func Dial(cfg *Config) (pb.GNMIClient, error) {
+	return DialContext(context.Background(), cfg)
+}
+
+// NewContext returns a new context with username and password
+// metadata if they are set in cfg.
+func NewContext(ctx context.Context, cfg *Config) context.Context {
+	if cfg.Username != "" {
+		ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(
+			"username", cfg.Username,
+			"password", cfg.Password))
+	}
+	return ctx
+}
+
+// NewGetRequest returns a GetRequest for the given paths
+func NewGetRequest(ctx context.Context, paths [][]string, origin string) (*pb.GetRequest, error) {
+	val := ctx.Value("config")
+	cfg, ok := val.(*Config)
+	if !ok {
+		return nil, errors.New("invalid type assertion")
+	}
+	req := &pb.GetRequest{
+		Path:     make([]*pb.Path, len(paths)),
+		Encoding: cfg.Encoding,
+	}
+	for i, p := range paths {
+		gnmiPath, err := ParseGNMIElements(p)
+		if err != nil {
+			return nil, err
+		}
+		req.Path[i] = gnmiPath
+		req.Path[i].Origin = origin
+	}
+	return req, nil
+}
+
+// NewSubscribeRequest returns a SubscribeRequest for the given paths
+func NewSubscribeRequest(subscribeOptions *SubscribeOptions) (*pb.SubscribeRequest, error) {
+	var mode pb.SubscriptionList_Mode
+	switch subscribeOptions.Mode {
+	case "once":
+		mode = pb.SubscriptionList_ONCE
+	case "poll":
+		mode = pb.SubscriptionList_POLL
+	case "":
+		fallthrough
+	case "stream":
+		mode = pb.SubscriptionList_STREAM
+	default:
+		return nil, fmt.Errorf("subscribe mode (%s) invalid", subscribeOptions.Mode)
+	}
+
+	var streamMode pb.SubscriptionMode
+	switch subscribeOptions.StreamMode {
+	case "on_change":
+		streamMode = pb.SubscriptionMode_ON_CHANGE
+	case "sample":
+		streamMode = pb.SubscriptionMode_SAMPLE
+	case "":
+		fallthrough
+	case "target_defined":
+		streamMode = pb.SubscriptionMode_TARGET_DEFINED
+	default:
+		return nil, fmt.Errorf("subscribe stream mode (%s) invalid", subscribeOptions.StreamMode)
+	}
+
+	prefixPath, err := ParseGNMIElements(SplitPath(subscribeOptions.Prefix))
+	if err != nil {
+		return nil, err
+	}
+	subList := &pb.SubscriptionList{
+		Subscription: make([]*pb.Subscription, len(subscribeOptions.Paths)),
+		Mode:         mode,
+		UpdatesOnly:  subscribeOptions.UpdatesOnly,
+		Prefix:       prefixPath,
+	}
+	if subscribeOptions.Target != "" {
+		if subList.Prefix == nil {
+			subList.Prefix = &pb.Path{}
+		}
+		subList.Prefix.Target = subscribeOptions.Target
+	}
+	for i, p := range subscribeOptions.Paths {
+		gnmiPath, err := ParseGNMIElements(p)
+		if err != nil {
+			return nil, err
+		}
+		gnmiPath.Origin = subscribeOptions.Origin
+		subList.Subscription[i] = &pb.Subscription{
+			Path:              gnmiPath,
+			Mode:              streamMode,
+			SampleInterval:    subscribeOptions.SampleInterval,
+			SuppressRedundant: subscribeOptions.SuppressRedundant,
+			HeartbeatInterval: subscribeOptions.HeartbeatInterval,
+		}
+	}
+	return &pb.SubscribeRequest{Request: &pb.SubscribeRequest_Subscribe{
+		Subscribe: subList}}, nil
+}
diff --git a/forks/goarista/gnmi/json.go b/forks/goarista/gnmi/json.go
new file mode 100644
index 0000000000000000000000000000000000000000..30aacd3df8239f39dd1af90a4fca9582cff6de1c
--- /dev/null
+++ b/forks/goarista/gnmi/json.go
@@ -0,0 +1,35 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"github.com/openconfig/gnmi/proto/gnmi"
+)
+
+// NotificationToMap converts a Notification into a map[string]interface{}
+func NotificationToMap(notif *gnmi.Notification) (map[string]interface{}, error) {
+	m := make(map[string]interface{}, 1)
+	m["timestamp"] = notif.Timestamp
+	m["path"] = StrPath(notif.Prefix)
+	if len(notif.Update) != 0 {
+		updates := make(map[string]interface{}, len(notif.Update))
+		var err error
+		for _, update := range notif.Update {
+			updates[StrPath(update.Path)] = StrUpdateVal(update)
+			if err != nil {
+				return nil, err
+			}
+		}
+		m["updates"] = updates
+	}
+	if len(notif.Delete) != 0 {
+		deletes := make([]string, len(notif.Delete))
+		for i, del := range notif.Delete {
+			deletes[i] = StrPath(del)
+		}
+		m["deletes"] = deletes
+	}
+	return m, nil
+}
diff --git a/forks/goarista/gnmi/operation.go b/forks/goarista/gnmi/operation.go
new file mode 100644
index 0000000000000000000000000000000000000000..01005d6f0877102e4e73124238b4e7cde93fcda9
--- /dev/null
+++ b/forks/goarista/gnmi/operation.go
@@ -0,0 +1,517 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"bufio"
+	"bytes"
+	"context"
+	"encoding/base64"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"math"
+	"os"
+	"path"
+	"strconv"
+	"strings"
+	"time"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/gnmi/proto/gnmi_ext"
+)
+
+// GetWithRequest takes a fully formed GetRequest, performs the Get,
+// and displays any response.
+func GetWithRequest(ctx context.Context, client pb.GNMIClient,
+	req *pb.GetRequest) error {
+	resp, err := client.Get(ctx, req)
+	if err != nil {
+		return err
+	}
+	for _, notif := range resp.Notification {
+		prefix := StrPath(notif.Prefix)
+		for _, update := range notif.Update {
+			fmt.Printf("%s:\n", path.Join(prefix, StrPath(update.Path)))
+			fmt.Println(StrUpdateVal(update))
+		}
+	}
+	return nil
+}
+
+// Get sends a GetRequest to the given server.
+func Get(ctx context.Context, client pb.GNMIClient, paths [][]string,
+	origin string) error {
+	req, err := NewGetRequest(ctx, paths, origin)
+	if err != nil {
+		return err
+	}
+	return GetWithRequest(ctx, client, req)
+}
+
+// val may be a path to a file or it may be json. First see if it is a
+// file, if so return its contents, otherwise return val
+func extractJSON(val string) []byte {
+	if jsonBytes, err := ioutil.ReadFile(val); err == nil {
+		return jsonBytes
+	}
+	// Best effort check if the value might a string literal, in which
+	// case wrap it in quotes. This is to allow a user to do:
+	//   gnmi update ../hostname host1234
+	//   gnmi update ../description 'This is a description'
+	// instead of forcing them to quote the string:
+	//   gnmi update ../hostname '"host1234"'
+	//   gnmi update ../description '"This is a description"'
+	maybeUnquotedStringLiteral := func(s string) bool {
+		if s == "true" || s == "false" || s == "null" || // JSON reserved words
+			strings.ContainsAny(s, `"'{}[]`) { // Already quoted or is a JSON object or array
+			return false
+		} else if _, err := strconv.ParseInt(s, 0, 32); err == nil {
+			// Integer. Using byte size of 32 because larger integer
+			// types are supposed to be sent as strings in JSON.
+			return false
+		} else if _, err := strconv.ParseFloat(s, 64); err == nil {
+			// Float
+			return false
+		}
+
+		return true
+	}
+	if maybeUnquotedStringLiteral(val) {
+		out := make([]byte, len(val)+2)
+		out[0] = '"'
+		copy(out[1:], val)
+		out[len(out)-1] = '"'
+		return out
+	}
+	return []byte(val)
+}
+
+// StrUpdateVal will return a string representing the value within the supplied update
+func StrUpdateVal(u *pb.Update) string {
+	if u.Value != nil {
+		// Backwards compatibility with pre-v0.4 gnmi
+		switch u.Value.Type {
+		case pb.Encoding_JSON, pb.Encoding_JSON_IETF:
+			return strJSON(u.Value.Value)
+		case pb.Encoding_BYTES, pb.Encoding_PROTO:
+			return base64.StdEncoding.EncodeToString(u.Value.Value)
+		case pb.Encoding_ASCII:
+			return string(u.Value.Value)
+		default:
+			return string(u.Value.Value)
+		}
+	}
+	return StrVal(u.Val)
+}
+
+// StrVal will return a string representing the supplied value
+func StrVal(val *pb.TypedValue) string {
+	switch v := val.GetValue().(type) {
+	case *pb.TypedValue_StringVal:
+		return v.StringVal
+	case *pb.TypedValue_JsonIetfVal:
+		return strJSON(v.JsonIetfVal)
+	case *pb.TypedValue_JsonVal:
+		return strJSON(v.JsonVal)
+	case *pb.TypedValue_IntVal:
+		return strconv.FormatInt(v.IntVal, 10)
+	case *pb.TypedValue_UintVal:
+		return strconv.FormatUint(v.UintVal, 10)
+	case *pb.TypedValue_BoolVal:
+		return strconv.FormatBool(v.BoolVal)
+	case *pb.TypedValue_BytesVal:
+		return base64.StdEncoding.EncodeToString(v.BytesVal)
+	case *pb.TypedValue_DecimalVal:
+		return strDecimal64(v.DecimalVal)
+	case *pb.TypedValue_FloatVal:
+		return strconv.FormatFloat(float64(v.FloatVal), 'g', -1, 32)
+	case *pb.TypedValue_LeaflistVal:
+		return strLeaflist(v.LeaflistVal)
+	case *pb.TypedValue_AsciiVal:
+		return v.AsciiVal
+	case *pb.TypedValue_AnyVal:
+		return v.AnyVal.String()
+	case *pb.TypedValue_ProtoBytes:
+		return base64.StdEncoding.EncodeToString(v.ProtoBytes)
+	default:
+		panic(v)
+	}
+}
+
+func strJSON(inJSON []byte) string {
+	var (
+		out bytes.Buffer
+		err error
+	)
+	// Check for ',' as simple heuristic on whether to expand JSON
+	// onto multiple lines, or compact it to a single line.
+	if bytes.Contains(inJSON, []byte{','}) {
+		err = json.Indent(&out, inJSON, "", "  ")
+	} else {
+		err = json.Compact(&out, inJSON)
+	}
+	if err != nil {
+		return fmt.Sprintf("(error unmarshalling json: %s)\n", err) + string(inJSON)
+	}
+	return out.String()
+}
+
+func strDecimal64(d *pb.Decimal64) string {
+	var i, frac int64
+	if d.Precision > 0 {
+		div := int64(10)
+		it := d.Precision - 1
+		for it > 0 {
+			div *= 10
+			it--
+		}
+		i = d.Digits / div
+		frac = d.Digits % div
+	} else {
+		i = d.Digits
+	}
+	if frac < 0 {
+		frac = -frac
+	}
+	return fmt.Sprintf("%d.%d", i, frac)
+}
+
+// strLeafList builds a human-readable form of a leaf-list. e.g. [1, 2, 3] or [a, b, c]
+func strLeaflist(v *pb.ScalarArray) string {
+	var b strings.Builder
+	b.WriteByte('[')
+
+	for i, elm := range v.Element {
+		b.WriteString(StrVal(elm))
+		if i < len(v.Element)-1 {
+			b.WriteString(", ")
+		}
+	}
+
+	b.WriteByte(']')
+	return b.String()
+}
+
+// TypedValue marshals an interface into a gNMI TypedValue value
+func TypedValue(val interface{}) *pb.TypedValue {
+	// TODO: handle more types:
+	// float64
+	// maps
+	// key.Key
+	// key.Map
+	// ... etc
+	switch v := val.(type) {
+	case string:
+		return &pb.TypedValue{Value: &pb.TypedValue_StringVal{StringVal: v}}
+	case int:
+		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
+	case int8:
+		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
+	case int16:
+		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
+	case int32:
+		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: int64(v)}}
+	case int64:
+		return &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: v}}
+	case uint:
+		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
+	case uint8:
+		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
+	case uint16:
+		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
+	case uint32:
+		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: uint64(v)}}
+	case uint64:
+		return &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: v}}
+	case bool:
+		return &pb.TypedValue{Value: &pb.TypedValue_BoolVal{BoolVal: v}}
+	case float32:
+		return &pb.TypedValue{Value: &pb.TypedValue_FloatVal{FloatVal: v}}
+	case []interface{}:
+		gnmiElems := make([]*pb.TypedValue, len(v))
+		for i, elem := range v {
+			gnmiElems[i] = TypedValue(elem)
+		}
+		return &pb.TypedValue{
+			Value: &pb.TypedValue_LeaflistVal{
+				LeaflistVal: &pb.ScalarArray{
+					Element: gnmiElems,
+				}}}
+	default:
+		panic(fmt.Sprintf("unexpected type %T for value %v", val, val))
+	}
+}
+
+// ExtractValue pulls a value out of a gNMI Update, parsing JSON if present.
+// Possible return types:
+//  string
+//  int64
+//  uint64
+//  bool
+//  []byte
+//  float32
+//  *gnmi.Decimal64
+//  json.Number
+//  *any.Any
+//  []interface{}
+//  map[string]interface{}
+func ExtractValue(update *pb.Update) (interface{}, error) {
+	var i interface{}
+	var err error
+	if update == nil {
+		return nil, fmt.Errorf("empty update")
+	}
+	if update.Val != nil {
+		i, err = extractValueV04(update.Val)
+	} else if update.Value != nil {
+		i, err = extractValueV03(update.Value)
+	}
+	return i, err
+}
+
+func extractValueV04(val *pb.TypedValue) (interface{}, error) {
+	switch v := val.Value.(type) {
+	case *pb.TypedValue_StringVal:
+		return v.StringVal, nil
+	case *pb.TypedValue_IntVal:
+		return v.IntVal, nil
+	case *pb.TypedValue_UintVal:
+		return v.UintVal, nil
+	case *pb.TypedValue_BoolVal:
+		return v.BoolVal, nil
+	case *pb.TypedValue_BytesVal:
+		return v.BytesVal, nil
+	case *pb.TypedValue_FloatVal:
+		return v.FloatVal, nil
+	case *pb.TypedValue_DecimalVal:
+		return v.DecimalVal, nil
+	case *pb.TypedValue_LeaflistVal:
+		elementList := v.LeaflistVal.Element
+		l := make([]interface{}, len(elementList))
+		for i, element := range elementList {
+			el, err := extractValueV04(element)
+			if err != nil {
+				return nil, err
+			}
+			l[i] = el
+		}
+		return l, nil
+	case *pb.TypedValue_AnyVal:
+		return v.AnyVal, nil
+	case *pb.TypedValue_JsonVal:
+		return decode(v.JsonVal)
+	case *pb.TypedValue_JsonIetfVal:
+		return decode(v.JsonIetfVal)
+	case *pb.TypedValue_AsciiVal:
+		return v.AsciiVal, nil
+	case *pb.TypedValue_ProtoBytes:
+		return v.ProtoBytes, nil
+	}
+	return nil, fmt.Errorf("unhandled type of value %v", val.GetValue())
+}
+
+func extractValueV03(val *pb.Value) (interface{}, error) {
+	switch val.Type {
+	case pb.Encoding_JSON, pb.Encoding_JSON_IETF:
+		return decode(val.Value)
+	case pb.Encoding_BYTES, pb.Encoding_PROTO:
+		return val.Value, nil
+	case pb.Encoding_ASCII:
+		return string(val.Value), nil
+	}
+	return nil, fmt.Errorf("unhandled type of value %v", val.GetValue())
+}
+
+func decode(byteArr []byte) (interface{}, error) {
+	decoder := json.NewDecoder(bytes.NewReader(byteArr))
+	decoder.UseNumber()
+	var value interface{}
+	err := decoder.Decode(&value)
+	return value, err
+}
+
+// DecimalToFloat converts a gNMI Decimal64 to a float64
+func DecimalToFloat(dec *pb.Decimal64) float64 {
+	return float64(dec.Digits) / math.Pow10(int(dec.Precision))
+}
+
+func update(p *pb.Path, val string) (*pb.Update, error) {
+	var v *pb.TypedValue
+	switch p.Origin {
+	case "":
+		v = &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: extractJSON(val)}}
+	case "eos_native":
+		v = &pb.TypedValue{
+			Value: &pb.TypedValue_JsonVal{JsonVal: extractJSON(val)}}
+	case "cli", "test-regen-cli":
+		v = &pb.TypedValue{
+			Value: &pb.TypedValue_AsciiVal{AsciiVal: val}}
+	case "p4_config":
+		b, err := ioutil.ReadFile(val)
+		if err != nil {
+			return nil, err
+		}
+		v = &pb.TypedValue{
+			Value: &pb.TypedValue_ProtoBytes{ProtoBytes: b}}
+	default:
+		return nil, fmt.Errorf("unexpected origin: %q", p.Origin)
+	}
+
+	return &pb.Update{Path: p, Val: v}, nil
+}
+
+// Operation describes an gNMI operation.
+type Operation struct {
+	Type   string
+	Origin string
+	Target string
+	Path   []string
+	Val    string
+}
+
+func newSetRequest(setOps []*Operation, exts ...*gnmi_ext.Extension) (*pb.SetRequest, error) {
+	req := &pb.SetRequest{}
+	for _, op := range setOps {
+		p, err := ParseGNMIElements(op.Path)
+		if err != nil {
+			return nil, err
+		}
+		p.Origin = op.Origin
+
+		// Target must apply to the entire SetRequest.
+		if op.Target != "" {
+			req.Prefix = &pb.Path{
+				Target: op.Target,
+			}
+		}
+
+		switch op.Type {
+		case "delete":
+			req.Delete = append(req.Delete, p)
+		case "update":
+			u, err := update(p, op.Val)
+			if err != nil {
+				return nil, err
+			}
+			req.Update = append(req.Update, u)
+		case "replace":
+			u, err := update(p, op.Val)
+			if err != nil {
+				return nil, err
+			}
+			req.Replace = append(req.Replace, u)
+		}
+	}
+	for _, ext := range exts {
+		req.Extension = append(req.Extension, ext)
+	}
+	return req, nil
+}
+
+// Set sends a SetRequest to the given client.
+func Set(ctx context.Context, client pb.GNMIClient, setOps []*Operation,
+	exts ...*gnmi_ext.Extension) (*pb.SetResponse, error) {
+	req, err := newSetRequest(setOps, exts...)
+	if err != nil {
+		return nil, err
+	}
+	return client.Set(ctx, req)
+}
+
+// Subscribe sends a SubscribeRequest to the given client.
+// Deprecated: Use SubscribeErr instead.
+func Subscribe(ctx context.Context, client pb.GNMIClient, subscribeOptions *SubscribeOptions,
+	respChan chan<- *pb.SubscribeResponse, errChan chan<- error) {
+	defer close(errChan)
+	if err := SubscribeErr(ctx, client, subscribeOptions, respChan); err != nil {
+		errChan <- err
+	}
+}
+
+// SubscribeErr makes a gNMI.Subscribe call and writes the responses
+// to the respChan. Before returning respChan will be closed.
+func SubscribeErr(ctx context.Context, client pb.GNMIClient, subscribeOptions *SubscribeOptions,
+	respChan chan<- *pb.SubscribeResponse) error {
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+	defer close(respChan)
+
+	stream, err := client.Subscribe(ctx)
+	if err != nil {
+		return err
+	}
+	req, err := NewSubscribeRequest(subscribeOptions)
+	if err != nil {
+		return err
+	}
+	if err := stream.Send(req); err != nil {
+		return err
+	}
+
+	for {
+		resp, err := stream.Recv()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		respChan <- resp
+
+		// For POLL subscriptions, initiate a poll request by pressing ENTER
+		if subscribeOptions.Mode == "poll" {
+			switch resp.Response.(type) {
+			case *pb.SubscribeResponse_SyncResponse:
+				fmt.Print("Press ENTER to send a poll request: ")
+				reader := bufio.NewReader(os.Stdin)
+				reader.ReadString('\n')
+
+				pollReq := &pb.SubscribeRequest{
+					Request: &pb.SubscribeRequest_Poll{
+						Poll: &pb.Poll{},
+					},
+				}
+				if err := stream.Send(pollReq); err != nil {
+					return err
+				}
+			}
+		}
+	}
+}
+
+// LogSubscribeResponse logs update responses to stderr.
+func LogSubscribeResponse(response *pb.SubscribeResponse) error {
+	switch resp := response.Response.(type) {
+	case *pb.SubscribeResponse_Error:
+		return errors.New(resp.Error.Message)
+	case *pb.SubscribeResponse_SyncResponse:
+		if !resp.SyncResponse {
+			return errors.New("initial sync failed")
+		}
+	case *pb.SubscribeResponse_Update:
+		t := time.Unix(0, resp.Update.Timestamp).UTC()
+		prefix := StrPath(resp.Update.Prefix)
+		var target string
+		if t := resp.Update.Prefix.GetTarget(); t != "" {
+			target = "(" + t + ") "
+		}
+		for _, update := range resp.Update.Update {
+			fmt.Printf("[%s] %s%s = %s\n", t.Format(time.RFC3339Nano),
+				target,
+				path.Join(prefix, StrPath(update.Path)),
+				StrUpdateVal(update))
+		}
+		for _, del := range resp.Update.Delete {
+			fmt.Printf("[%s] %sDeleted %s\n", t.Format(time.RFC3339Nano),
+				target,
+				path.Join(prefix, StrPath(del)))
+		}
+	}
+	return nil
+}
diff --git a/forks/goarista/gnmi/operation_test.go b/forks/goarista/gnmi/operation_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..fd575d10aa5ea2766b9da07a4c4865ee101d923c
--- /dev/null
+++ b/forks/goarista/gnmi/operation_test.go
@@ -0,0 +1,423 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"bytes"
+	"encoding/json"
+	"io/ioutil"
+	"os"
+	"testing"
+
+	"github.com/aristanetworks/goarista/test"
+	"github.com/golang/protobuf/proto"
+	"github.com/golang/protobuf/ptypes/any"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+func TestNewSetRequest(t *testing.T) {
+	pathFoo := &pb.Path{
+		Element: []string{"foo"},
+		Elem:    []*pb.PathElem{{Name: "foo"}},
+	}
+	pathCli := &pb.Path{
+		Origin: "cli",
+	}
+	pathP4 := &pb.Path{
+		Origin: "p4_config",
+	}
+
+	p4FileContent := "p4_config test"
+	p4TestFile, err := ioutil.TempFile("", "p4TestFile")
+	if err != nil {
+		t.Errorf("cannot create test file for p4_config")
+	}
+	p4Filename := p4TestFile.Name()
+
+	defer os.Remove(p4Filename)
+
+	if _, err := p4TestFile.WriteString(p4FileContent); err != nil {
+		t.Errorf("cannot write test file for p4_config")
+	}
+	p4TestFile.Close()
+
+	testCases := map[string]struct {
+		setOps []*Operation
+		exp    pb.SetRequest
+	}{
+		"delete": {
+			setOps: []*Operation{{Type: "delete", Path: []string{"foo"}}},
+			exp:    pb.SetRequest{Delete: []*pb.Path{pathFoo}},
+		},
+		"update": {
+			setOps: []*Operation{{Type: "update", Path: []string{"foo"}, Val: "true"}},
+			exp: pb.SetRequest{
+				Update: []*pb.Update{{
+					Path: pathFoo,
+					Val: &pb.TypedValue{
+						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
+				}},
+			},
+		},
+		"replace": {
+			setOps: []*Operation{{Type: "replace", Path: []string{"foo"}, Val: "true"}},
+			exp: pb.SetRequest{
+				Replace: []*pb.Update{{
+					Path: pathFoo,
+					Val: &pb.TypedValue{
+						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
+				}},
+			},
+		},
+		"cli-replace": {
+			setOps: []*Operation{{Type: "replace", Origin: "cli",
+				Val: "hostname foo\nip routing"}},
+			exp: pb.SetRequest{
+				Replace: []*pb.Update{{
+					Path: pathCli,
+					Val: &pb.TypedValue{
+						Value: &pb.TypedValue_AsciiVal{AsciiVal: "hostname foo\nip routing"}},
+				}},
+			},
+		},
+		"p4_config": {
+			setOps: []*Operation{{Type: "replace", Origin: "p4_config",
+				Val: p4Filename}},
+			exp: pb.SetRequest{
+				Replace: []*pb.Update{{
+					Path: pathP4,
+					Val: &pb.TypedValue{
+						Value: &pb.TypedValue_ProtoBytes{ProtoBytes: []byte(p4FileContent)}},
+				}},
+			},
+		},
+		"target": {
+			setOps: []*Operation{{Type: "replace", Target: "JPE1234567",
+				Path: []string{"foo"}, Val: "true"}},
+			exp: pb.SetRequest{
+				Prefix: &pb.Path{Target: "JPE1234567"},
+				Replace: []*pb.Update{{
+					Path: pathFoo,
+					Val: &pb.TypedValue{
+						Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte("true")}},
+				}},
+			},
+		},
+	}
+
+	for name, tc := range testCases {
+		t.Run(name, func(t *testing.T) {
+			got, err := newSetRequest(tc.setOps)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if diff := test.Diff(tc.exp, *got); diff != "" {
+				t.Errorf("unexpected diff: %s", diff)
+			}
+		})
+	}
+}
+
+func TestStrUpdateVal(t *testing.T) {
+	anyBytes, err := proto.Marshal(&pb.ModelData{Name: "foobar"})
+	if err != nil {
+		t.Fatal(err)
+	}
+	anyMessage := &any.Any{TypeUrl: "gnmi/ModelData", Value: anyBytes}
+	anyString := proto.CompactTextString(anyMessage)
+
+	for name, tc := range map[string]struct {
+		update *pb.Update
+		exp    string
+	}{
+		"JSON Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte(`{"foo":"bar"}`),
+					Type:  pb.Encoding_JSON}},
+			exp: `{"foo":"bar"}`,
+		},
+		"JSON_IETF Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte(`{"foo":"bar"}`),
+					Type:  pb.Encoding_JSON_IETF}},
+			exp: `{"foo":"bar"}`,
+		},
+		"BYTES Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte{0xde, 0xad},
+					Type:  pb.Encoding_BYTES}},
+			exp: "3q0=",
+		},
+		"PROTO Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte{0xde, 0xad},
+					Type:  pb.Encoding_PROTO}},
+			exp: "3q0=",
+		},
+		"ASCII Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte("foobar"),
+					Type:  pb.Encoding_ASCII}},
+			exp: "foobar",
+		},
+		"INVALID Value": {
+			update: &pb.Update{
+				Value: &pb.Value{
+					Value: []byte("foobar"),
+					Type:  pb.Encoding(42)}},
+			exp: "foobar",
+		},
+		"StringVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_StringVal{StringVal: "foobar"}}},
+			exp: "foobar",
+		},
+		"IntVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_IntVal{IntVal: -42}}},
+			exp: "-42",
+		},
+		"UintVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_UintVal{UintVal: 42}}},
+			exp: "42",
+		},
+		"BoolVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_BoolVal{BoolVal: true}}},
+			exp: "true",
+		},
+		"BytesVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_BytesVal{BytesVal: []byte{0xde, 0xad}}}},
+			exp: "3q0=",
+		},
+		"FloatVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_FloatVal{FloatVal: 3.14}}},
+			exp: "3.14",
+		},
+		"DecimalVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_DecimalVal{
+					DecimalVal: &pb.Decimal64{Digits: 314, Precision: 2},
+				}}},
+			exp: "3.14",
+		},
+		"LeafListVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_LeaflistVal{
+					LeaflistVal: &pb.ScalarArray{Element: []*pb.TypedValue{
+						{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
+						{Value: &pb.TypedValue_AsciiVal{AsciiVal: "foobar"}},
+					}},
+				}}},
+			exp: "[true, foobar]",
+		},
+		"AnyVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_AnyVal{AnyVal: anyMessage}}},
+			exp: anyString,
+		},
+		"JsonVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar"}`)}}},
+			exp: `{"foo":"bar"}`,
+		},
+		"JsonVal_complex": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar","baz":"qux"}`)}}},
+			exp: `{
+  "foo": "bar",
+  "baz": "qux"
+}`,
+		},
+		"JsonIetfVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(`{"foo":"bar"}`)}}},
+			exp: `{"foo":"bar"}`,
+		},
+		"AsciiVal": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_AsciiVal{AsciiVal: "foobar"}}},
+			exp: "foobar",
+		},
+		"ProtoBytes": {
+			update: &pb.Update{Val: &pb.TypedValue{
+				Value: &pb.TypedValue_ProtoBytes{ProtoBytes: anyBytes}}},
+			exp: "CgZmb29iYXI=",
+		},
+	} {
+		t.Run(name, func(t *testing.T) {
+			got := StrUpdateVal(tc.update)
+			if got != tc.exp {
+				t.Errorf("Expected: %q Got: %q", tc.exp, got)
+			}
+		})
+	}
+}
+
+func TestTypedValue(t *testing.T) {
+	for tname, tcase := range map[string]struct {
+		in  interface{}
+		exp *pb.TypedValue
+	}{
+		"string": {
+			in:  "foo",
+			exp: &pb.TypedValue{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
+		},
+		"int": {
+			in:  42,
+			exp: &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: 42}},
+		},
+		"int64": {
+			in:  int64(42),
+			exp: &pb.TypedValue{Value: &pb.TypedValue_IntVal{IntVal: 42}},
+		},
+		"uint": {
+			in:  uint(42),
+			exp: &pb.TypedValue{Value: &pb.TypedValue_UintVal{UintVal: 42}},
+		},
+		"bool": {
+			in:  true,
+			exp: &pb.TypedValue{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
+		},
+		"slice": {
+			in: []interface{}{"foo", 1, uint(2), true},
+			exp: &pb.TypedValue{Value: &pb.TypedValue_LeaflistVal{LeaflistVal: &pb.ScalarArray{
+				Element: []*pb.TypedValue{
+					{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
+					{Value: &pb.TypedValue_IntVal{IntVal: 1}},
+					{Value: &pb.TypedValue_UintVal{UintVal: 2}},
+					{Value: &pb.TypedValue_BoolVal{BoolVal: true}},
+				}}}},
+		},
+	} {
+		t.Run(tname, func(t *testing.T) {
+			if got := TypedValue(tcase.in); !test.DeepEqual(got, tcase.exp) {
+				t.Errorf("Expected: %q Got: %q", tcase.exp, got)
+			}
+		})
+	}
+}
+
+func TestExtractJSON(t *testing.T) {
+	jsonFile, err := ioutil.TempFile("", "extractJSON")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.Remove(jsonFile.Name())
+	if _, err := jsonFile.Write([]byte(`"jsonFile"`)); err != nil {
+		jsonFile.Close()
+		t.Fatal(err)
+	}
+	if err := jsonFile.Close(); err != nil {
+		t.Fatal(err)
+	}
+
+	for val, exp := range map[string][]byte{
+		jsonFile.Name(): []byte(`"jsonFile"`),
+		"foobar":        []byte(`"foobar"`),
+		`"foobar"`:      []byte(`"foobar"`),
+		"Val: true":     []byte(`"Val: true"`),
+		"host42":        []byte(`"host42"`),
+		"42":            []byte("42"),
+		"-123.43":       []byte("-123.43"),
+		"0xFFFF":        []byte("0xFFFF"),
+		// Int larger than can fit in 32 bits should be quoted
+		"0x8000000000":  []byte(`"0x8000000000"`),
+		"-0x8000000000": []byte(`"-0x8000000000"`),
+		"true":          []byte("true"),
+		"false":         []byte("false"),
+		"null":          []byte("null"),
+		"{true: 42}":    []byte("{true: 42}"),
+		"[]":            []byte("[]"),
+	} {
+		t.Run(val, func(t *testing.T) {
+			got := extractJSON(val)
+			if !bytes.Equal(exp, got) {
+				t.Errorf("Unexpected diff. Expected: %q Got: %q", exp, got)
+			}
+		})
+	}
+}
+
+func TestExtractValue(t *testing.T) {
+	cases := []struct {
+		in  *pb.Update
+		exp interface{}
+	}{{
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_StringVal{StringVal: "foo"}}},
+		exp: "foo",
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_IntVal{IntVal: 123}}},
+		exp: int64(123),
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_UintVal{UintVal: 123}}},
+		exp: uint64(123),
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_BoolVal{BoolVal: true}}},
+		exp: true,
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_BytesVal{BytesVal: []byte{0xde, 0xad}}}},
+		exp: []byte{0xde, 0xad},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_FloatVal{FloatVal: -12.34}}},
+		exp: float32(-12.34),
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_DecimalVal{DecimalVal: &pb.Decimal64{
+				Digits: -1234, Precision: 2}}}},
+		exp: &pb.Decimal64{Digits: -1234, Precision: 2},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_LeaflistVal{LeaflistVal: &pb.ScalarArray{
+				Element: []*pb.TypedValue{
+					{Value: &pb.TypedValue_StringVal{StringVal: "foo"}},
+					{Value: &pb.TypedValue_IntVal{IntVal: 123}}}}}}},
+		exp: []interface{}{"foo", int64(123)},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`12.34`)}}},
+		exp: json.Number("12.34"),
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`[12.34, 123, "foo"]`)}}},
+		exp: []interface{}{json.Number("12.34"), json.Number("123"), "foo"},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":"bar"}`)}}},
+		exp: map[string]interface{}{"foo": "bar"},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonVal{JsonVal: []byte(`{"foo":45.67}`)}}},
+		exp: map[string]interface{}{"foo": json.Number("45.67")},
+	}, {
+		in: &pb.Update{Val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(`{"foo":"bar"}`)}}},
+		exp: map[string]interface{}{"foo": "bar"},
+	}}
+	for _, tc := range cases {
+		out, err := ExtractValue(tc.in)
+		if err != nil {
+			t.Errorf(err.Error())
+		}
+		if !test.DeepEqual(tc.exp, out) {
+			t.Errorf("Extracted value is incorrect. Expected %+v, got %+v", tc.exp, out)
+		}
+	}
+}
diff --git a/forks/goarista/gnmi/path.go b/forks/goarista/gnmi/path.go
new file mode 100644
index 0000000000000000000000000000000000000000..00280a8fc5924785e036e8daf7e9e187ec8a0406
--- /dev/null
+++ b/forks/goarista/gnmi/path.go
@@ -0,0 +1,251 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"fmt"
+	"sort"
+	"strings"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+// nextTokenIndex returns the end index of the first token.
+func nextTokenIndex(path string) int {
+	var inBrackets bool
+	var escape bool
+	for i, c := range path {
+		switch c {
+		case '[':
+			inBrackets = true
+			escape = false
+		case ']':
+			if !escape {
+				inBrackets = false
+			}
+			escape = false
+		case '\\':
+			escape = !escape
+		case '/':
+			if !inBrackets && !escape {
+				return i
+			}
+			escape = false
+		default:
+			escape = false
+		}
+	}
+	return len(path)
+}
+
+// SplitPath splits a gnmi path according to the spec. See
+// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-path-conventions.md
+// No validation is done. Behavior is undefined if path is an invalid
+// gnmi path. TODO: Do validation?
+func SplitPath(path string) []string {
+	var result []string
+	if len(path) > 0 && path[0] == '/' {
+		path = path[1:]
+	}
+	for len(path) > 0 {
+		i := nextTokenIndex(path)
+		result = append(result, path[:i])
+		path = path[i:]
+		if len(path) > 0 && path[0] == '/' {
+			path = path[1:]
+		}
+	}
+	return result
+}
+
+// SplitPaths splits multiple gnmi paths
+func SplitPaths(paths []string) [][]string {
+	out := make([][]string, len(paths))
+	for i, path := range paths {
+		out[i] = SplitPath(path)
+	}
+	return out
+}
+
+// StrPath builds a human-readable form of a gnmi path.
+// e.g. /a/b/c[e=f]
+func StrPath(path *pb.Path) string {
+	if path == nil {
+		return "/"
+	} else if len(path.Elem) != 0 {
+		return strPathV04(path)
+	} else if len(path.Element) != 0 {
+		return strPathV03(path)
+	}
+	return "/"
+}
+
+// strPathV04 handles the v0.4 gnmi and later path.Elem member.
+func strPathV04(path *pb.Path) string {
+	b := &strings.Builder{}
+	for _, elm := range path.Elem {
+		b.WriteRune('/')
+		writeSafeString(b, elm.Name, '/')
+		if len(elm.Key) > 0 {
+			// Sort the keys so that they print in a conistent
+			// order. We don't have the YANG AST information, so the
+			// best we can do is sort them alphabetically.
+			keys := make([]string, 0, len(elm.Key))
+			for k := range elm.Key {
+				keys = append(keys, k)
+			}
+			sort.Strings(keys)
+			for _, k := range keys {
+				b.WriteRune('[')
+				b.WriteString(k)
+				b.WriteRune('=')
+				writeSafeString(b, elm.Key[k], ']')
+				b.WriteRune(']')
+			}
+		}
+	}
+	return b.String()
+}
+
+// strPathV03 handles the v0.3 gnmi and earlier path.Element member.
+func strPathV03(path *pb.Path) string {
+	return "/" + strings.Join(path.Element, "/")
+}
+
+// upgradePath modernizes a Path by translating the contents of the Element field to Elem
+func upgradePath(path *pb.Path) *pb.Path {
+	if len(path.Elem) == 0 {
+		var elems []*pb.PathElem
+		for _, element := range path.Element {
+			n, keys, _ := parseElement(element)
+			elems = append(elems, &pb.PathElem{Name: n, Key: keys})
+		}
+		path.Elem = elems
+		path.Element = nil
+	}
+	return path
+}
+
+// JoinPaths joins multiple gnmi paths and returns a string representation
+func JoinPaths(paths ...*pb.Path) *pb.Path {
+	var elems []*pb.PathElem
+	for _, path := range paths {
+		path = upgradePath(path)
+		elems = append(elems, path.Elem...)
+	}
+	return &pb.Path{Elem: elems}
+}
+
+func writeSafeString(b *strings.Builder, s string, esc rune) {
+	for _, c := range s {
+		if c == esc || c == '\\' {
+			b.WriteRune('\\')
+		}
+		b.WriteRune(c)
+	}
+}
+
+// ParseGNMIElements builds up a gnmi path, from user-supplied text
+func ParseGNMIElements(elms []string) (*pb.Path, error) {
+	var parsed []*pb.PathElem
+	for _, e := range elms {
+		n, keys, err := parseElement(e)
+		if err != nil {
+			return nil, err
+		}
+		parsed = append(parsed, &pb.PathElem{Name: n, Key: keys})
+	}
+	return &pb.Path{
+		Element: elms, // Backwards compatibility with pre-v0.4 gnmi
+		Elem:    parsed,
+	}, nil
+}
+
+// parseElement parses a path element, according to the gNMI specification. See
+// https://github.com/openconfig/reference/blame/master/rpc/gnmi/gnmi-path-conventions.md
+//
+// It returns the first string (the current element name), and an optional map of key name
+// value pairs.
+func parseElement(pathElement string) (string, map[string]string, error) {
+	// First check if there are any keys, i.e. do we have at least one '[' in the element
+	name, keyStart := findUnescaped(pathElement, '[')
+	if keyStart < 0 {
+		return name, nil, nil
+	}
+
+	// Error if there is no element name or if the "[" is at the beginning of the path element
+	if len(name) == 0 {
+		return "", nil, fmt.Errorf("failed to find element name in %q", pathElement)
+	}
+
+	// Look at the keys now.
+	keys := make(map[string]string)
+	keyPart := pathElement[keyStart:]
+	for keyPart != "" {
+		k, v, nextKey, err := parseKey(keyPart)
+		if err != nil {
+			return "", nil, err
+		}
+		keys[k] = v
+		keyPart = nextKey
+	}
+	return name, keys, nil
+}
+
+// parseKey returns the key name, key value and the remaining string to be parsed,
+func parseKey(s string) (string, string, string, error) {
+	if s[0] != '[' {
+		return "", "", "", fmt.Errorf("failed to find opening '[' in %q", s)
+	}
+	k, iEq := findUnescaped(s[1:], '=')
+	if iEq < 0 {
+		return "", "", "", fmt.Errorf("failed to find '=' in %q", s)
+	}
+	if k == "" {
+		return "", "", "", fmt.Errorf("failed to find key name in %q", s)
+	}
+
+	rhs := s[1+iEq+1:]
+	v, iClosBr := findUnescaped(rhs, ']')
+	if iClosBr < 0 {
+		return "", "", "", fmt.Errorf("failed to find ']' in %q", s)
+	}
+	if v == "" {
+		return "", "", "", fmt.Errorf("failed to find key value in %q", s)
+	}
+
+	next := rhs[iClosBr+1:]
+	return k, v, next, nil
+}
+
+// findUnescaped will return the index of the first unescaped match of 'find', and the unescaped
+// string leading up to it.
+func findUnescaped(s string, find byte) (string, int) {
+	// Take a fast track if there are no escape sequences
+	if strings.IndexByte(s, '\\') == -1 {
+		i := strings.IndexByte(s, find)
+		if i < 0 {
+			return s, -1
+		}
+		return s[:i], i
+	}
+
+	// Find the first match, taking care of escaped chars.
+	var b strings.Builder
+	var i int
+	len := len(s)
+	for i = 0; i < len; {
+		ch := s[i]
+		if ch == find {
+			return b.String(), i
+		} else if ch == '\\' && i < len-1 {
+			i++
+			ch = s[i]
+		}
+		b.WriteByte(ch)
+		i++
+	}
+	return b.String(), -1
+}
diff --git a/forks/goarista/gnmi/path_test.go b/forks/goarista/gnmi/path_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..27318b65c10a64949326995b727347d3f5de211a
--- /dev/null
+++ b/forks/goarista/gnmi/path_test.go
@@ -0,0 +1,308 @@
+// Copyright (c) 2017 Arista Networks, Inc.
+// Use of this source code is governed by the Apache License 2.0
+// that can be found in the COPYING file.
+
+package gnmi
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/aristanetworks/goarista/test"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+func p(s ...string) []string {
+	return s
+}
+
+func TestSplitPath(t *testing.T) {
+	for i, tc := range []struct {
+		in  string
+		exp []string
+	}{{
+		in:  "/foo/bar",
+		exp: p("foo", "bar"),
+	}, {
+		in:  "/foo/bar/",
+		exp: p("foo", "bar"),
+	}, {
+		in:  "//foo//bar//",
+		exp: p("", "foo", "", "bar", ""),
+	}, {
+		in:  "/foo[name=///]/bar",
+		exp: p("foo[name=///]", "bar"),
+	}, {
+		in:  `/foo[name=[\\\]/]/bar`,
+		exp: p(`foo[name=[\\\]/]`, "bar"),
+	}, {
+		in:  `/foo[name=[\\]/bar`,
+		exp: p(`foo[name=[\\]`, "bar"),
+	}, {
+		in:  "/foo[a=1][b=2]/bar",
+		exp: p("foo[a=1][b=2]", "bar"),
+	}, {
+		in:  "/foo[a=1\\]2][b=2]/bar",
+		exp: p("foo[a=1\\]2][b=2]", "bar"),
+	}, {
+		in:  "/foo[a=1][b=2]/bar\\baz",
+		exp: p("foo[a=1][b=2]", "bar\\baz"),
+	}} {
+		got := SplitPath(tc.in)
+		if !test.DeepEqual(tc.exp, got) {
+			t.Errorf("[%d] unexpect split for %q. Expected: %v, Got: %v",
+				i, tc.in, tc.exp, got)
+		}
+	}
+}
+
+func TestStrPath(t *testing.T) {
+	for i, tc := range []struct {
+		path string
+	}{{
+		path: "/",
+	}, {
+		path: "/foo/bar",
+	}, {
+		path: "/foo[name=a]/bar",
+	}, {
+		path: "/foo[a=1][b=2]/bar",
+	}, {
+		path: "/foo[a=1\\]2][b=2]/bar",
+	}, {
+		path: "/foo[a=1][b=2]/bar\\/baz",
+	}} {
+		sElms := SplitPath(tc.path)
+		pbPath, err := ParseGNMIElements(sElms)
+		if err != nil {
+			t.Errorf("failed to parse %s: %s", sElms, err)
+		}
+		s := StrPath(pbPath)
+		if !test.DeepEqual(tc.path, s) {
+			t.Errorf("[%d] want %s, got %s", i, tc.path, s)
+		}
+	}
+}
+
+func TestStrPathBackwardsCompat(t *testing.T) {
+	for i, tc := range []struct {
+		path *pb.Path
+		str  string
+	}{{
+		path: &pb.Path{
+			Element: p("foo[a=1][b=2]", "bar"),
+		},
+		str: "/foo[a=1][b=2]/bar",
+	}} {
+		got := StrPath(tc.path)
+		if got != tc.str {
+			t.Errorf("[%d] want %q, got %q", i, tc.str, got)
+		}
+	}
+}
+
+func TestParseElement(t *testing.T) {
+	// test cases
+	cases := []struct {
+		// name is the name of the test useful if you want to run a single test
+		// from the command line -run TestParseElement/<name>
+		name string
+		// in is the path element to be parsed
+		in string
+		// fieldName is field name (YANG node name) expected to be parsed from the path element.
+		// Normally this is simply the path element, or if the path element contains keys this is
+		// the text before the first [
+		fieldName string
+		// keys is a map of the expected key value pairs from within the []s in the
+		// `path element.
+		//
+		// For example prefix[ip-prefix=10.0.0.0/24][masklength-range=26..28]
+		// fieldName would be "prefix"
+		// keys would be {"ip-prefix": "10.0.0.0/24", "masklength-range": "26..28"}
+		keys map[string]string
+		// expectedError is the exact error we expect.
+		expectedError error
+	}{{
+		name:      "no_elms",
+		in:        "hello",
+		fieldName: "hello",
+	}, {
+		name:          "single_open",
+		in:            "[",
+		expectedError: fmt.Errorf("failed to find element name in %q", "["),
+	}, {
+		name:          "no_equal_no_close",
+		in:            "hello[there",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "[there"),
+	}, {
+		name:          "no_equals",
+		in:            "hello[there]",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "[there]"),
+	}, {
+		name:          "no_left_side",
+		in:            "hello[=there]",
+		expectedError: fmt.Errorf("failed to find key name in %q", "[=there]"),
+	}, {
+		name:          "no_right_side",
+		in:            "hello[there=]",
+		expectedError: fmt.Errorf("failed to find key value in %q", "[there=]"),
+	}, {
+		name:          "hanging_escape",
+		in:            "hello[there\\",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "[there\\"),
+	}, {
+		name:      "single_name_value",
+		in:        "hello[there=where]",
+		fieldName: "hello",
+		keys:      map[string]string{"there": "where"},
+	}, {
+		name:      "single_value_with=",
+		in:        "hello[there=whe=r=e]",
+		fieldName: "hello",
+		keys:      map[string]string{"there": "whe=r=e"},
+	}, {
+		name:      "single_value_with=_and_escaped_]",
+		in:        `hello[there=whe=\]r=e]`,
+		fieldName: "hello",
+		keys:      map[string]string{"there": `whe=]r=e`},
+	}, {
+		name:      "single_value_with[",
+		in:        "hello[there=w[[here]",
+		fieldName: "hello",
+		keys:      map[string]string{"there": "w[[here"},
+	}, {
+		name:          "value_single_open",
+		in:            "hello[first=value][",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "["),
+	}, {
+		name:          "value_no_close",
+		in:            "hello[there=where][somename",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "[somename"),
+	}, {
+		name:          "value_no_equals",
+		in:            "hello[there=where][somename]",
+		expectedError: fmt.Errorf("failed to find '=' in %q", "[somename]"),
+	}, {
+		name:          "no_left_side",
+		in:            "hello[there=where][=somevalue]",
+		expectedError: fmt.Errorf("failed to find key name in %q", "[=somevalue]"),
+	}, {
+		name:          "no_right_side",
+		in:            "hello[there=where][somename=]",
+		expectedError: fmt.Errorf("failed to find key value in %q", "[somename=]"),
+	}, {
+		name:      "two_name_values",
+		in:        "hello[there=where][somename=somevalue]",
+		fieldName: "hello",
+		keys:      map[string]string{"there": "where", "somename": "somevalue"},
+	}, {
+		name:      "three_name_values",
+		in:        "hello[there=where][somename=somevalue][anothername=value]",
+		fieldName: "hello",
+		keys: map[string]string{"there": "where", "somename": "somevalue",
+			"anothername": "value"},
+	}, {
+		name:      "aserisk_value",
+		in:        "hello[there=*][somename=somevalue][anothername=value]",
+		fieldName: "hello",
+		keys: map[string]string{"there": "*", "somename": "somevalue",
+			"anothername": "value"},
+	}}
+
+	for _, tc := range cases {
+		t.Run(tc.name, func(t *testing.T) {
+			fieldName, keys, err := parseElement(tc.in)
+			if !test.DeepEqual(tc.expectedError, err) {
+				t.Fatalf("[%s] expected err %#v, got %#v", tc.name, tc.expectedError, err)
+			}
+			if !test.DeepEqual(tc.keys, keys) {
+				t.Fatalf("[%s] expected output %#v, got %#v", tc.name, tc.keys, keys)
+			}
+			if tc.fieldName != fieldName {
+				t.Fatalf("[%s] expected field name %s, got %s", tc.name, tc.fieldName, fieldName)
+			}
+		})
+	}
+}
+
+func strToPath(pathStr string) *pb.Path {
+	splitPath := SplitPath(pathStr)
+	path, _ := ParseGNMIElements(splitPath)
+	path.Element = nil
+	return path
+}
+
+func strsToPaths(pathStrs []string) []*pb.Path {
+	var paths []*pb.Path
+	for _, splitPath := range SplitPaths(pathStrs) {
+		path, _ := ParseGNMIElements(splitPath)
+		path.Element = nil
+		paths = append(paths, path)
+	}
+	return paths
+}
+
+func TestJoinPath(t *testing.T) {
+	cases := []struct {
+		paths []*pb.Path
+		exp   string
+	}{{
+		paths: strsToPaths([]string{"/foo/bar", "/baz/qux"}),
+		exp:   "/foo/bar/baz/qux",
+	},
+		{
+			paths: strsToPaths([]string{
+				"/foo/bar[somekey=someval][otherkey=otherval]", "/baz/qux"}),
+			exp: "/foo/bar[otherkey=otherval][somekey=someval]/baz/qux",
+		},
+		{
+			paths: strsToPaths([]string{
+				"/foo/bar[somekey=someval][otherkey=otherval]",
+				"/baz/qux[somekey=someval][otherkey=otherval]"}),
+			exp: "/foo/bar[otherkey=otherval][somekey=someval]/" +
+				"baz/qux[otherkey=otherval][somekey=someval]",
+		},
+		{
+			paths: []*pb.Path{
+				{Element: []string{"foo", "bar[somekey=someval][otherkey=otherval]"}},
+				{Element: []string{"baz", "qux[somekey=someval][otherkey=otherval]"}}},
+			exp: "/foo/bar[somekey=someval][otherkey=otherval]/" +
+				"baz/qux[somekey=someval][otherkey=otherval]",
+		},
+	}
+
+	for _, tc := range cases {
+		got := JoinPaths(tc.paths...)
+		exp := strToPath(tc.exp)
+		exp.Element = nil
+		if !test.DeepEqual(got, exp) {
+			t.Fatalf("ERROR!\n Got: %s,\n Want %s\n", got, exp)
+		}
+	}
+}
+
+func BenchmarkPathElementToSigleElementName(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_, _, _ = parseElement("hello")
+	}
+}
+
+func BenchmarkPathElementTwoKeys(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_, _, _ = parseElement("hello[hello=world][bye=moon]")
+	}
+}
+
+func BenchmarkPathElementBadKeys(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_, _, _ = parseElement("hello[hello=world][byemoon]")
+	}
+}
+
+func BenchmarkPathElementMaxKeys(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		_, _, _ = parseElement("hello[name=firstName][name=secondName][name=thirdName]" +
+			"[name=fourthName][name=fifthName][name=sixthName]")
+	}
+}
diff --git a/forks/google/gnmi/model.go b/forks/google/gnmi/model.go
new file mode 100644
index 0000000000000000000000000000000000000000..8d6a4998be62fba77ec2b50ea7decfb8b989fb75
--- /dev/null
+++ b/forks/google/gnmi/model.go
@@ -0,0 +1,128 @@
+/* Copyright 2017 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package gnmi
+
+import (
+	oc "code.fbi.h-da.de/cocsn/yang-models/generated/arista"
+	"errors"
+	"fmt"
+	log "github.com/sirupsen/logrus"
+	"net"
+	"reflect"
+	"sort"
+
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ygot"
+	"github.com/openconfig/ygot/ytypes"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+// JSONUnmarshaler is the signature of the Unmarshal() function in the GoStruct code generated by openconfig ygot library.
+type JSONUnmarshaler func([]byte, ygot.GoStruct, ...ytypes.UnmarshalOpt) error
+
+// GoStructEnumData is the data type to maintain GoStruct enum type.
+type GoStructEnumData map[string]map[int64]ygot.EnumDefinition
+
+// Model contains the model data and GoStruct information for the device to config.
+type Model struct {
+	modelData       []*pb.ModelData
+	structRootType  reflect.Type
+	schemaTreeRoot  *yang.Entry
+	jsonUnmarshaler JSONUnmarshaler
+	enumData        GoStructEnumData
+}
+
+// NewModel returns an instance of Model struct.
+func NewModel(m []*pb.ModelData, t reflect.Type, r *yang.Entry, f JSONUnmarshaler, e GoStructEnumData) *Model {
+	return &Model{
+		modelData:       m,
+		structRootType:  t,
+		schemaTreeRoot:  r,
+		jsonUnmarshaler: f,
+		enumData:        e,
+	}
+}
+
+func (m *Model) newRootValue() interface{} {
+	return reflect.New(m.structRootType.Elem()).Interface()
+}
+
+// NewConfigStruct creates a ValidatedGoStruct of this model from jsonConfig. If jsonConfig is nil, creates an empty GoStruct.
+func (m *Model) NewConfigStruct(jsonConfig []byte) (ygot.ValidatedGoStruct, error) {
+	rootStruct, ok := m.newRootValue().(ygot.ValidatedGoStruct)
+	if !ok {
+		return nil, errors.New("root node is not a ygot.ValidatedGoStruct")
+	}
+	ifaces, err := getInterfaces()
+	if err != nil {
+		return nil, err
+	}
+	device, ok := rootStruct.(*oc.Device)
+	if !ok {
+		return nil, errors.New("root node is not a oc.Device")
+	}
+	device.Interfaces = ifaces
+	return device, nil
+}
+
+// SupportedModels returns a list of supported models.
+func (m *Model) SupportedModels() []string {
+	mDesc := make([]string, len(m.modelData))
+	for i, m := range m.modelData {
+		mDesc[i] = fmt.Sprintf("%s %s", m.Name, m.Version)
+	}
+	sort.Strings(mDesc)
+	return mDesc
+}
+
+func getInterfaces() (*oc.OpenconfigInterfaces_Interfaces, error) {
+	ifaces, err := net.Interfaces()
+	if err != nil {
+		log.Fatal()
+	}
+	interfaces := &oc.OpenconfigInterfaces_Interfaces{
+		Interface: make(map[string]*oc.OpenconfigInterfaces_Interfaces_Interface),
+	}
+
+	for _, tInterface := range ifaces {
+		var mtu *uint16
+		var name *string
+		var index *uint32
+
+		rmtu := uint16(tInterface.MTU)
+		rname := tInterface.Name
+		rindex := uint32(tInterface.Index)
+
+		mtu = &rmtu
+		name = &rname
+		index = &rindex
+
+		iface, err := interfaces.NewInterface(tInterface.Name)
+		if err != nil {
+			return nil, err
+		}
+		iface.State = &oc.OpenconfigInterfaces_Interfaces_Interface_State{
+			Ifindex: &rindex,
+			Mtu:     &rmtu,
+			Name:    &rname,
+		}
+		iface.State.Name = name
+		iface.State.Mtu = mtu
+		iface.State.Ifindex = index
+	}
+	return interfaces, nil
+}
diff --git a/forks/google/gnmi/server.go b/forks/google/gnmi/server.go
new file mode 100644
index 0000000000000000000000000000000000000000..2f9416149ea5b861078378049a4e3a416b7bde7c
--- /dev/null
+++ b/forks/google/gnmi/server.go
@@ -0,0 +1,602 @@
+/* Copyright 2017 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Package gnmi implements a gnmi server to mock a device with YANG models.
+package gnmi
+
+import (
+	"bytes"
+	"compress/gzip"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"reflect"
+	"strconv"
+	"sync"
+	"time"
+
+	"golang.org/x/net/context"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/openconfig/gnmi/value"
+	"github.com/openconfig/ygot/util"
+	"github.com/openconfig/ygot/ygot"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+
+	dpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+// ConfigCallback is the signature of the function to apply a validated config to the physical device.
+type ConfigCallback func(ygot.ValidatedGoStruct) error
+
+var (
+	pbRootPath         = &pb.Path{}
+	supportedEncodings = []pb.Encoding{pb.Encoding_PROTO, pb.Encoding_JSON_IETF, pb.Encoding_JSON}
+)
+
+// Server struct maintains the data structure for device config and implements the interface of gnmi server.
+// It supports Capabilities, Get, and Set APIs.
+// Typical usage:
+//	g := grpc.NewServer()
+//	s, err := Server.NewServer(model, config, callback)
+//	pb.NewServer(g, s)
+//	reflection.Register(g)
+//	listen, err := net.Listen("tcp", ":8080")
+//	g.Serve(listen)
+//
+// For a real device, apply the config changes to the hardware in the callback function.
+// Arguments:
+//		newConfig: new root config to be applied on the device.
+
+type Server struct {
+	model    *Model
+	callback ConfigCallback
+
+	config ygot.ValidatedGoStruct
+	mu     sync.RWMutex // mu is the RW lock to protect the access to config
+}
+
+// NewServer creates an instance of Server with given json config.
+func NewServer(model *Model, config []byte, callback ConfigCallback) (*Server, error) {
+	rootStruct, err := model.NewConfigStruct(config)
+	if err != nil {
+		return nil, err
+	}
+	s := &Server{
+		model:    model,
+		config:   rootStruct,
+		callback: callback,
+	}
+	if config != nil && s.callback != nil {
+		if err := s.callback(rootStruct); err != nil {
+			return nil, err
+		}
+	}
+	return s, nil
+}
+
+// checkEncodingAndModel checks whether encoding and models are supported by the server. Return error if anything is unsupported.
+func (s *Server) checkEncodingAndModel(encoding pb.Encoding, models []*pb.ModelData) error {
+	hasSupportedEncoding := false
+	for _, supportedEncoding := range supportedEncodings {
+		if encoding == supportedEncoding {
+			hasSupportedEncoding = true
+			break
+		}
+	}
+	if !hasSupportedEncoding {
+		return fmt.Errorf("unsupported encoding: %s", pb.Encoding_name[int32(encoding)])
+	}
+	for _, m := range models {
+		isSupported := false
+		for _, supportedModel := range s.model.modelData {
+			if reflect.DeepEqual(m, supportedModel) {
+				isSupported = true
+				break
+			}
+		}
+		if !isSupported {
+			return fmt.Errorf("unsupported model: %v", m)
+		}
+	}
+	return nil
+}
+
+// doDelete deletes the path from the json tree if the path exists. If success,
+// it calls the callback function to apply the change to the device hardware.
+func (s *Server) doDelete(jsonTree map[string]interface{}, prefix, path *pb.Path) (*pb.UpdateResult, error) {
+	// Update json tree of the device config
+	var curNode interface{} = jsonTree
+	pathDeleted := false
+	fullPath := gnmiFullPath(prefix, path)
+	schema := s.model.schemaTreeRoot
+	for i, elem := range fullPath.Elem { // Delete sub-tree or leaf node.
+		node, ok := curNode.(map[string]interface{})
+		if !ok {
+			break
+		}
+
+		// Delete node
+		if i == len(fullPath.Elem)-1 {
+			if elem.GetKey() == nil {
+				delete(node, elem.Name)
+				pathDeleted = true
+				break
+			}
+			pathDeleted = deleteKeyedListEntry(node, elem)
+			break
+		}
+
+		if curNode, schema = getChildNode(node, schema, elem, false); curNode == nil {
+			break
+		}
+	}
+	if reflect.DeepEqual(fullPath, pbRootPath) { // Delete root
+		for k := range jsonTree {
+			delete(jsonTree, k)
+		}
+	}
+
+	// Apply the validated operation to the config tree and device.
+	if pathDeleted {
+		newConfig, err := s.toGoStruct(jsonTree)
+		if err != nil {
+			return nil, status.Error(codes.Internal, err.Error())
+		}
+		if s.callback != nil {
+			if applyErr := s.callback(newConfig); applyErr != nil {
+				if rollbackErr := s.callback(s.config); rollbackErr != nil {
+					return nil, status.Errorf(codes.Internal, "error in rollback the failed operation (%v): %v", applyErr, rollbackErr)
+				}
+				return nil, status.Errorf(codes.Aborted, "error in applying operation to device: %v", applyErr)
+			}
+		}
+	}
+	return &pb.UpdateResult{
+		Path: path,
+		Op:   pb.UpdateResult_DELETE,
+	}, nil
+}
+
+// doReplaceOrUpdate validates the replace or update operation to be applied to
+// the device, modifies the json tree of the config struct, then calls the
+// callback function to apply the operation to the device hardware.
+func (s *Server) doReplaceOrUpdate(jsonTree map[string]interface{}, op pb.UpdateResult_Operation, prefix, path *pb.Path, val *pb.TypedValue) (*pb.UpdateResult, error) {
+	// Validate the operation.
+	fullPath := gnmiFullPath(prefix, path)
+	emptyNode, _, err := ytypes.GetOrCreateNode(s.model.schemaTreeRoot, s.model.newRootValue(), fullPath)
+	if err != nil {
+		return nil, status.Errorf(codes.NotFound, "path %v is not found in the config structure: %v", fullPath, err)
+	}
+	var nodeVal interface{}
+	nodeStruct, ok := emptyNode.(ygot.ValidatedGoStruct)
+	if ok {
+		if err := s.model.jsonUnmarshaler(val.GetJsonIetfVal(), nodeStruct); err != nil {
+			return nil, status.Errorf(codes.InvalidArgument, "unmarshaling json data to config struct fails: %v", err)
+		}
+		if err := nodeStruct.Validate(); err != nil {
+			return nil, status.Errorf(codes.InvalidArgument, "config data validation fails: %v", err)
+		}
+		var err error
+		if nodeVal, err = ygot.ConstructIETFJSON(nodeStruct, &ygot.RFC7951JSONConfig{}); err != nil {
+			msg := fmt.Sprintf("error in constructing IETF JSON tree from config struct: %v", err)
+			log.Error(msg)
+			return nil, status.Error(codes.Internal, msg)
+		}
+	} else {
+		var err error
+		if nodeVal, err = value.ToScalar(val); err != nil {
+			return nil, status.Errorf(codes.Internal, "cannot convert leaf node to scalar type: %v", err)
+		}
+	}
+
+	// Update json tree of the device config.
+	var curNode interface{} = jsonTree
+	schema := s.model.schemaTreeRoot
+	for i, elem := range fullPath.Elem {
+		switch node := curNode.(type) {
+		case map[string]interface{}:
+			// Set node value.
+			if i == len(fullPath.Elem)-1 {
+				if elem.GetKey() == nil {
+					if grpcStatusError := setPathWithoutAttribute(op, node, elem, nodeVal); grpcStatusError != nil {
+						return nil, grpcStatusError
+					}
+					break
+				}
+				if grpcStatusError := setPathWithAttribute(op, node, elem, nodeVal); grpcStatusError != nil {
+					return nil, grpcStatusError
+				}
+				break
+			}
+
+			if curNode, schema = getChildNode(node, schema, elem, true); curNode == nil {
+				return nil, status.Errorf(codes.NotFound, "path elem not found: %v", elem)
+			}
+		case []interface{}:
+			return nil, status.Errorf(codes.NotFound, "incompatible path elem: %v", elem)
+		default:
+			return nil, status.Errorf(codes.Internal, "wrong node type: %T", curNode)
+		}
+	}
+	if reflect.DeepEqual(fullPath, pbRootPath) { // Replace/Update root.
+		if op == pb.UpdateResult_UPDATE {
+			return nil, status.Error(codes.Unimplemented, "update the root of config tree is unsupported")
+		}
+		nodeValAsTree, ok := nodeVal.(map[string]interface{})
+		if !ok {
+			return nil, status.Errorf(codes.InvalidArgument, "expect a tree to replace the root, got a scalar value: %T", nodeVal)
+		}
+		for k := range jsonTree {
+			delete(jsonTree, k)
+		}
+		for k, v := range nodeValAsTree {
+			jsonTree[k] = v
+		}
+	}
+	newConfig, err := s.toGoStruct(jsonTree)
+	if err != nil {
+		return nil, status.Error(codes.Internal, err.Error())
+	}
+
+	// Apply the validated operation to the device.
+	if s.callback != nil {
+		if applyErr := s.callback(newConfig); applyErr != nil {
+			if rollbackErr := s.callback(s.config); rollbackErr != nil {
+				return nil, status.Errorf(codes.Internal, "error in rollback the failed operation (%v): %v", applyErr, rollbackErr)
+			}
+			return nil, status.Errorf(codes.Aborted, "error in applying operation to device: %v", applyErr)
+		}
+	}
+	return &pb.UpdateResult{
+		Path: path,
+		Op:   op,
+	}, nil
+}
+
+func (s *Server) toGoStruct(jsonTree map[string]interface{}) (ygot.ValidatedGoStruct, error) {
+	jsonDump, err := json.Marshal(jsonTree)
+	if err != nil {
+		return nil, fmt.Errorf("error in marshaling IETF JSON tree to bytes: %v", err)
+	}
+	goStruct, err := s.model.NewConfigStruct(jsonDump)
+	if err != nil {
+		return nil, fmt.Errorf("error in creating config struct from IETF JSON data: %v", err)
+	}
+	return goStruct, nil
+}
+
+// getGNMIServiceVersion returns a pointer to the gNMI service version string.
+// The method is non-trivial because of the way it is defined in the proto file.
+func getGNMIServiceVersion() (*string, error) {
+	gzB := (&pb.Update{}).ProtoReflect().Descriptor()
+	r, err := gzip.NewReader(bytes.NewReader([]byte(gzB.Name())))
+	if err != nil {
+		return nil, fmt.Errorf("error in initializing gzip reader: %v", err)
+	}
+	defer r.Close()
+	b, err := ioutil.ReadAll(r)
+	if err != nil {
+		return nil, fmt.Errorf("error in reading gzip data: %v", err)
+	}
+	desc := &dpb.FileDescriptorProto{}
+	if err := proto.Unmarshal(b, desc); err != nil {
+		return nil, fmt.Errorf("error in unmarshaling proto: %v", err)
+	}
+	ver, err := proto.GetExtension(desc.Options, pb.E_GnmiService)
+	if err != nil {
+		return nil, fmt.Errorf("error in getting version from proto extension: %v", err)
+	}
+	return ver.(*string), nil
+}
+
+// deleteKeyedListEntry deletes the keyed list entry from node that matches the
+// path elem. If the entry is the only one in keyed list, deletes the entire
+// list. If the entry is found and deleted, the function returns true. If it is
+// not found, the function returns false.
+func deleteKeyedListEntry(node map[string]interface{}, elem *pb.PathElem) bool {
+	curNode, ok := node[elem.Name]
+	if !ok {
+		return false
+	}
+
+	keyedList, ok := curNode.([]interface{})
+	if !ok {
+		return false
+	}
+	for i, n := range keyedList {
+		m, ok := n.(map[string]interface{})
+		if !ok {
+			log.Errorf("expect map[string]interface{} for a keyed list entry, got %T", n)
+			return false
+		}
+		keyMatching := true
+		for k, v := range elem.Key {
+			attrVal, ok := m[k]
+			if !ok {
+				return false
+			}
+			if v != fmt.Sprintf("%v", attrVal) {
+				keyMatching = false
+				break
+			}
+		}
+		if keyMatching {
+			listLen := len(keyedList)
+			if listLen == 1 {
+				delete(node, elem.Name)
+				return true
+			}
+			keyedList[i] = keyedList[listLen-1]
+			node[elem.Name] = keyedList[0 : listLen-1]
+			return true
+		}
+	}
+	return false
+}
+
+// gnmiFullPath builds the full path from the prefix and path.
+func gnmiFullPath(prefix, path *pb.Path) *pb.Path {
+	fullPath := &pb.Path{Origin: path.Origin}
+	if path.GetElem() != nil {
+		fullPath.Elem = append(prefix.GetElem(), path.GetElem()...)
+	}
+	return fullPath
+}
+
+// isNIl checks if an interface is nil or its value is nil.
+func isNil(i interface{}) bool {
+	if i == nil {
+		return true
+	}
+	switch kind := reflect.ValueOf(i).Kind(); kind {
+	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+		return reflect.ValueOf(i).IsNil()
+	default:
+		return false
+	}
+}
+
+// setPathWithAttribute replaces or updates a child node of curNode in the IETF
+// JSON config tree, where the child node is indexed by pathElem with attribute.
+// The function returns grpc status error if unsuccessful.
+func setPathWithAttribute(op pb.UpdateResult_Operation, curNode map[string]interface{}, pathElem *pb.PathElem, nodeVal interface{}) error {
+	nodeValAsTree, ok := nodeVal.(map[string]interface{})
+	if !ok {
+		return status.Errorf(codes.InvalidArgument, "expect nodeVal is a json node of map[string]interface{}, received %T", nodeVal)
+	}
+	m := getKeyedListEntry(curNode, pathElem, true)
+	if m == nil {
+		return status.Errorf(codes.NotFound, "path elem not found: %v", pathElem)
+	}
+	if op == pb.UpdateResult_REPLACE {
+		for k := range m {
+			delete(m, k)
+		}
+	}
+	for attrKey, attrVal := range pathElem.GetKey() {
+		m[attrKey] = attrVal
+		if asNum, err := strconv.ParseFloat(attrVal, 64); err == nil {
+			m[attrKey] = asNum
+		}
+		for k, v := range nodeValAsTree {
+			if k == attrKey && fmt.Sprintf("%v", v) != attrVal {
+				return status.Errorf(codes.InvalidArgument, "invalid config data: %v is a path attribute", k)
+			}
+		}
+	}
+	for k, v := range nodeValAsTree {
+		m[k] = v
+	}
+	return nil
+}
+
+// setPathWithoutAttribute replaces or updates a child node of curNode in the
+// IETF config tree, where the child node is indexed by pathElem without
+// attribute. The function returns grpc status error if unsuccessful.
+func setPathWithoutAttribute(op pb.UpdateResult_Operation, curNode map[string]interface{}, pathElem *pb.PathElem, nodeVal interface{}) error {
+	target, hasElem := curNode[pathElem.Name]
+	nodeValAsTree, nodeValIsTree := nodeVal.(map[string]interface{})
+	if op == pb.UpdateResult_REPLACE || !hasElem || !nodeValIsTree {
+		curNode[pathElem.Name] = nodeVal
+		return nil
+	}
+	targetAsTree, ok := target.(map[string]interface{})
+	if !ok {
+		return status.Errorf(codes.Internal, "error in setting path: expect map[string]interface{} to update, got %T", target)
+	}
+	for k, v := range nodeValAsTree {
+		targetAsTree[k] = v
+	}
+	return nil
+}
+
+// Capabilities returns supported encodings and supported models.
+func (s *Server) Capabilities(ctx context.Context, req *pb.CapabilityRequest) (*pb.CapabilityResponse, error) {
+	ver, err := getGNMIServiceVersion()
+	if err != nil {
+		return nil, status.Errorf(codes.Internal, "error in getting gnmi service version: %v", err)
+	}
+	return &pb.CapabilityResponse{
+		SupportedModels:    s.model.modelData,
+		SupportedEncodings: supportedEncodings,
+		GNMIVersion:        *ver,
+	}, nil
+}
+
+// Get implements the Get RPC in gNMI spec.
+func (s *Server) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
+	if req.GetType() != pb.GetRequest_ALL {
+		return nil, status.Errorf(codes.Unimplemented, "unsupported request type: %s", pb.GetRequest_DataType_name[int32(req.GetType())])
+	}
+	if err := s.checkEncodingAndModel(req.GetEncoding(), req.GetUseModels()); err != nil {
+		return nil, status.Error(codes.Unimplemented, err.Error())
+	}
+
+	prefix := req.GetPrefix()
+	paths := req.GetPath()
+	notifications := make([]*pb.Notification, 0)
+
+	s.mu.RLock()
+	defer s.mu.RUnlock()
+
+	for _, path := range paths {
+		// Get schema node for path from config struct.
+		fullPath := path
+		if prefix != nil {
+			fullPath = gnmiFullPath(prefix, path)
+		}
+		if fullPath.GetElem() == nil && fullPath.GetElement() != nil {
+			return nil, status.Error(codes.Unimplemented, "deprecated path element type is unsupported")
+		}
+		opts := []ytypes.GetNodeOpt{&ytypes.GetHandleWildcards{}, &ytypes.GetPartialKeyMatch{}}
+		nodes, err := ytypes.GetNode(s.model.schemaTreeRoot, s.config, fullPath, opts...)
+		if len(nodes) == 0 || err != nil || util.IsValueNil(nodes[0].Data) {
+			return nil, status.Errorf(codes.NotFound, "path %v not found: %v", fullPath, err)
+		}
+		for _, n := range nodes {
+			node := n.Data
+			ts := time.Now().UnixNano()
+
+			nodeStruct, ok := node.(ygot.GoStruct)
+			// Return leaf node.
+			if !ok {
+				var val *pb.TypedValue
+				switch kind := reflect.ValueOf(node).Kind(); kind {
+				case reflect.Ptr, reflect.Interface:
+					var err error
+					val, err = value.FromScalar(reflect.ValueOf(node).Elem().Interface())
+					if err != nil {
+						msg := fmt.Sprintf("leaf node %v does not contain a scalar type value: %v", path, err)
+						log.Error(msg)
+						return nil, status.Error(codes.Internal, msg)
+					}
+				case reflect.Int64:
+					enumMap, ok := s.model.enumData[reflect.TypeOf(node).Name()]
+					if !ok {
+						return nil, status.Error(codes.Internal, "not a GoStruct enumeration type")
+					}
+					val = &pb.TypedValue{
+						Value: &pb.TypedValue_StringVal{
+							StringVal: enumMap[reflect.ValueOf(node).Int()].Name,
+						},
+					}
+				default:
+					return nil, status.Errorf(codes.Internal, "unexpected kind of leaf node type: %v %v", node, kind)
+				}
+
+				update := &pb.Update{Path: path, Val: val}
+				notification := &pb.Notification{
+					Timestamp: ts,
+					Prefix:    prefix,
+					Update:    []*pb.Update{update},
+				}
+				notifications = append(notifications, notification)
+				continue
+			}
+
+			if req.GetUseModels() != nil {
+				return nil, status.Errorf(codes.Unimplemented, "filtering Get using use_models is unsupported, got: %v", req.GetUseModels())
+			}
+
+			nots, err := ygot.TogNMINotifications(nodeStruct, ts, ygot.GNMINotificationsConfig{
+				UsePathElem:       false,
+				StringSlicePrefix: []string{"interfaces", "interface"},
+			})
+
+			if err != nil {
+				return nil, err
+			}
+
+			notifications = append(notifications, nots...)
+
+		}
+	}
+
+	return &pb.GetResponse{Notification: notifications}, nil
+}
+
+// Set implements the Set RPC in gNMI spec.
+func (s *Server) Set(ctx context.Context, req *pb.SetRequest) (*pb.SetResponse, error) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+
+	jsonTree, err := ygot.ConstructIETFJSON(s.config, &ygot.RFC7951JSONConfig{})
+	if err != nil {
+		msg := fmt.Sprintf("error in constructing IETF JSON tree from config struct: %v", err)
+		log.Error(msg)
+		return nil, status.Error(codes.Internal, msg)
+	}
+
+	prefix := req.GetPrefix()
+	var results []*pb.UpdateResult
+
+	for _, path := range req.GetDelete() {
+		res, grpcStatusError := s.doDelete(jsonTree, prefix, path)
+		if grpcStatusError != nil {
+			return nil, grpcStatusError
+		}
+		results = append(results, res)
+	}
+	for _, upd := range req.GetReplace() {
+		res, grpcStatusError := s.doReplaceOrUpdate(jsonTree, pb.UpdateResult_REPLACE, prefix, upd.GetPath(), upd.GetVal())
+		if grpcStatusError != nil {
+			return nil, grpcStatusError
+		}
+		results = append(results, res)
+	}
+	for _, upd := range req.GetUpdate() {
+		res, grpcStatusError := s.doReplaceOrUpdate(jsonTree, pb.UpdateResult_UPDATE, prefix, upd.GetPath(), upd.GetVal())
+		if grpcStatusError != nil {
+			return nil, grpcStatusError
+		}
+		results = append(results, res)
+	}
+
+	jsonDump, err := json.Marshal(jsonTree)
+	if err != nil {
+		msg := fmt.Sprintf("error in marshaling IETF JSON tree to bytes: %v", err)
+		log.Error(msg)
+		return nil, status.Error(codes.Internal, msg)
+	}
+	rootStruct, err := s.model.NewConfigStruct(jsonDump)
+	if err != nil {
+		msg := fmt.Sprintf("error in creating config struct from IETF JSON data: %v", err)
+		log.Error(msg)
+		return nil, status.Error(codes.Internal, msg)
+	}
+	s.config = rootStruct
+	return &pb.SetResponse{
+		Prefix:   req.GetPrefix(),
+		Response: results,
+	}, nil
+}
+
+// Subscribe method is not implemented.
+func (s *Server) Subscribe(stream pb.GNMI_SubscribeServer) error {
+	return status.Error(codes.Unimplemented, "Subscribe is not implemented.")
+}
+
+// InternalUpdate is an experimental feature to let the server update its
+// internal states. Use it with your own risk.
+func (s *Server) InternalUpdate(fp func(config ygot.ValidatedGoStruct) error) error {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	return fp(s.config)
+}
diff --git a/forks/google/gnmi/server_test.go b/forks/google/gnmi/server_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..68ffea696df150f69e722256389f472a875de107
--- /dev/null
+++ b/forks/google/gnmi/server_test.go
@@ -0,0 +1,1161 @@
+/* Copyright 2017 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package gnmi
+
+import (
+	"encoding/json"
+	"reflect"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/openconfig/gnmi/value"
+	"github.com/openconfig/ygot/ygot"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+
+	"github.com/google/gnxi/gnmi/modeldata"
+	"github.com/google/gnxi/gnmi/modeldata/gostruct"
+)
+
+var (
+	// model is the model for test config server.
+	model = &Model{
+		modelData:       modeldata.ModelData,
+		structRootType:  reflect.TypeOf((*gostruct.Device)(nil)),
+		schemaTreeRoot:  gostruct.SchemaTree["Device"],
+		jsonUnmarshaler: gostruct.Unmarshal,
+		enumData:        gostruct.ΛEnum,
+	}
+)
+
+func TestCapabilities(t *testing.T) {
+	s, err := NewServer(model, nil, nil)
+	if err != nil {
+		t.Fatalf("error in creating server: %v", err)
+	}
+	resp, err := s.Capabilities(nil, &pb.CapabilityRequest{})
+	if err != nil {
+		t.Fatalf("got error %v, want nil", err)
+	}
+	if !reflect.DeepEqual(resp.GetSupportedModels(), model.modelData) {
+		t.Errorf("got supported models %v\nare not the same as\nmodel supported by the server %v", resp.GetSupportedModels(), model.modelData)
+	}
+	if !reflect.DeepEqual(resp.GetSupportedEncodings(), supportedEncodings) {
+		t.Errorf("got supported encodings %v\nare not the same as\nencodings supported by the server %v", resp.GetSupportedEncodings(), supportedEncodings)
+	}
+}
+
+func TestGet(t *testing.T) {
+	jsonConfigRoot := `{
+		"openconfig-system:system": {
+			"openconfig-openflow:openflow": {
+				"agent": {
+					"config": {
+						"failure-mode": "SECURE",
+						"max-backoff": 10
+					}
+				}
+			}
+		},
+	  "openconfig-platform:components": {
+	    "component": [
+	      {
+	        "config": {
+	          "name": "swpri1-1-1"
+	        },
+	        "name": "swpri1-1-1"
+	      }
+	    ]
+	  }
+	}`
+
+	s, err := NewServer(model, []byte(jsonConfigRoot), nil)
+	if err != nil {
+		t.Fatalf("error in creating server: %v", err)
+	}
+
+	tds := []struct {
+		desc        string
+		textPbPath  string
+		modelData   []*pb.ModelData
+		wantRetCode codes.Code
+		wantRespVal interface{}
+	}{{
+		desc: "get valid but non-existing node",
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+		`,
+		wantRetCode: codes.NotFound,
+	}, {
+		desc:        "root node",
+		wantRetCode: codes.OK,
+		wantRespVal: jsonConfigRoot,
+	}, {
+		desc: "get non-enum type",
+		textPbPath: `
+					elem: <name: "system" >
+					elem: <name: "openflow" >
+					elem: <name: "agent" >
+					elem: <name: "config" >
+					elem: <name: "max-backoff" >
+				`,
+		wantRetCode: codes.OK,
+		wantRespVal: uint64(10),
+	}, {
+		desc: "get enum type",
+		textPbPath: `
+					elem: <name: "system" >
+					elem: <name: "openflow" >
+					elem: <name: "agent" >
+					elem: <name: "config" >
+					elem: <name: "failure-mode" >
+				`,
+		wantRetCode: codes.OK,
+		wantRespVal: "SECURE",
+	}, {
+		desc:        "root child node",
+		textPbPath:  `elem: <name: "components" >`,
+		wantRetCode: codes.OK,
+		wantRespVal: `{
+							"openconfig-platform:component": [{
+								"config": {
+						        	"name": "swpri1-1-1"
+								},
+						        "name": "swpri1-1-1"
+							}]}`,
+	}, {
+		desc: "node with attribute",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "name" value: "swpri1-1-1" >
+								>`,
+		wantRetCode: codes.OK,
+		wantRespVal: `{
+								"openconfig-platform:config": {"name": "swpri1-1-1"},
+								"openconfig-platform:name": "swpri1-1-1"
+							}`,
+	}, {
+		desc: "node with attribute in its parent",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "name" value: "swpri1-1-1" >
+								>
+								elem: <name: "config" >`,
+		wantRetCode: codes.OK,
+		wantRespVal: `{"openconfig-platform:name": "swpri1-1-1"}`,
+	}, {
+		desc: "ref leaf node",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "name" value: "swpri1-1-1" >
+								>
+								elem: <name: "name" >`,
+		wantRetCode: codes.OK,
+		wantRespVal: "swpri1-1-1",
+	}, {
+		desc: "regular leaf node",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "name" value: "swpri1-1-1" >
+								>
+								elem: <name: "config" >
+								elem: <name: "name" >`,
+		wantRetCode: codes.OK,
+		wantRespVal: "swpri1-1-1",
+	}, {
+		desc: "non-existing node: wrong path name",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "foo" value: "swpri1-1-1" >
+								>
+								elem: <name: "bar" >`,
+		wantRetCode: codes.NotFound,
+	}, {
+		desc: "non-existing node: wrong path attribute",
+		textPbPath: `
+								elem: <name: "components" >
+								elem: <
+									name: "component"
+									key: <key: "foo" value: "swpri2-2-2" >
+								>
+								elem: <name: "name" >`,
+		wantRetCode: codes.NotFound,
+	}, {
+		desc:        "use of model data not supported",
+		modelData:   []*pb.ModelData{{}},
+		wantRetCode: codes.Unimplemented,
+	}}
+
+	for _, td := range tds {
+		t.Run(td.desc, func(t *testing.T) {
+			runTestGet(t, s, td.textPbPath, td.wantRetCode, td.wantRespVal, td.modelData)
+		})
+	}
+}
+
+// runTestGet requests a path from the server by Get grpc call, and compares if
+// the return code and response value are expected.
+func runTestGet(t *testing.T, s *Server, textPbPath string, wantRetCode codes.Code, wantRespVal interface{}, useModels []*pb.ModelData) {
+	// Send request
+	var pbPath pb.Path
+	if err := proto.UnmarshalText(textPbPath, &pbPath); err != nil {
+		t.Fatalf("error in unmarshaling path: %v", err)
+	}
+	req := &pb.GetRequest{
+		Path:      []*pb.Path{&pbPath},
+		Encoding:  pb.Encoding_JSON_IETF,
+		UseModels: useModels,
+	}
+	resp, err := s.Get(nil, req)
+
+	// Check return code
+	gotRetStatus, ok := status.FromError(err)
+	if !ok {
+		t.Fatal("got a non-grpc error from grpc call")
+	}
+	if gotRetStatus.Code() != wantRetCode {
+		t.Fatalf("got return code %v, want %v", gotRetStatus.Code(), wantRetCode)
+	}
+
+	// Check response value
+	var gotVal interface{}
+	if resp != nil {
+		notifs := resp.GetNotification()
+		if len(notifs) != 1 {
+			t.Fatalf("got %d notifications, want 1", len(notifs))
+		}
+		updates := notifs[0].GetUpdate()
+		if len(updates) != 1 {
+			t.Fatalf("got %d updates in the notification, want 1", len(updates))
+		}
+		val := updates[0].GetVal()
+		if val.GetJsonIetfVal() == nil {
+			gotVal, err = value.ToScalar(val)
+			if err != nil {
+				t.Errorf("got: %v, want a scalar value", gotVal)
+			}
+		} else {
+			// Unmarshal json data to gotVal container for comparison
+			if err := json.Unmarshal(val.GetJsonIetfVal(), &gotVal); err != nil {
+				t.Fatalf("error in unmarshaling IETF JSON data to json container: %v", err)
+			}
+			var wantJSONStruct interface{}
+			if err := json.Unmarshal([]byte(wantRespVal.(string)), &wantJSONStruct); err != nil {
+				t.Fatalf("error in unmarshaling IETF JSON data to json container: %v", err)
+			}
+			wantRespVal = wantJSONStruct
+		}
+	}
+
+	if !reflect.DeepEqual(gotVal, wantRespVal) {
+		t.Errorf("got: %v (%T),\nwant %v (%T)", gotVal, gotVal, wantRespVal, wantRespVal)
+	}
+}
+
+type gnmiSetTestCase struct {
+	desc        string                    // description of test case.
+	initConfig  string                    // config before the operation.
+	op          pb.UpdateResult_Operation // operation type.
+	textPbPath  string                    // text format of gnmi Path proto.
+	val         *pb.TypedValue            // value for UPDATE/REPLACE operations. always nil for DELETE.
+	wantRetCode codes.Code                // grpc return code.
+	wantConfig  string                    // config after the operation.
+}
+
+func TestDelete(t *testing.T) {
+	tests := []gnmiSetTestCase{{
+		desc: "delete leaf node",
+		initConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a",
+					"login-banner": "Hello!"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "config" >
+			elem: <name: "login-banner" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}, {
+		desc: "delete sub-tree",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				},
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}, {
+		desc: "delete a sub-tree with only one leaf node",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				},
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <name: "config" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}, {
+		desc: "delete a leaf node whose parent has only this child",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				},
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <name: "config" >
+			elem: <name: "timezone-name" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}, {
+		desc: "delete root",
+		initConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op:          pb.UpdateResult_DELETE,
+		wantRetCode: codes.OK,
+		wantConfig:  `{}`,
+	}, {
+		desc: "delete non-existing node",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <name: "config" >
+			elem: <name: "foo-bar" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+	}, {
+		desc: "delete node with non-existing precedent path",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <name: "foo-bar" >
+			elem: <name: "timezone-name" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+	}, {
+		desc: "delete node with non-existing attribute in precedent path",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <
+				name: "config"
+				key: <key: "name" value: "foo" >
+			>
+			elem: <name: "timezone-name" >`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+	}, {
+		desc: "delete node with non-existing attribute",
+		initConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+			elem: <name: "config" >
+			elem: <
+				name: "timezone-name"
+				key: <key: "name" value: "foo" >
+			>
+			elem: <name: "timezone-name" >`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "Europe/Stockholm"
+					}
+				}
+			}
+		}`,
+	}, {
+		desc: "delete leaf node with attribute in its precedent path",
+		initConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						},
+						"state": {
+							"name": "swpri1-1-1",
+							"mfg-name": "foo bar inc."
+						}
+					}
+				]
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "swpri1-1-1" >
+			>
+			elem: <name: "state" >
+			elem: <name: "mfg-name" >`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						},
+						"state": {
+							"name": "swpri1-1-1"
+						}
+					}
+				]
+			}
+		}`,
+	}, {
+		desc: "delete sub-tree with attribute in its precedent path",
+		initConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						},
+						"state": {
+							"name": "swpri1-1-1",
+							"mfg-name": "foo bar inc."
+						}
+					}
+				]
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "swpri1-1-1" >
+			>
+			elem: <name: "state" >`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						}
+					}
+				]
+			}
+		}`,
+	}, {
+		desc: "delete path node with attribute",
+		initConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						}
+					},
+					{
+						"name": "swpri1-1-2",
+						"config": {
+							"name": "swpri1-1-2"
+						}
+					}
+				]
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "swpri1-1-1" >
+			>`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-2",
+						"config": {
+							"name": "swpri1-1-2"
+						}
+					}
+				]
+			}
+		}`,
+	}, {
+		desc: "delete path node with int type attribute",
+		initConfig: `{
+			"system": {
+				"openflow": {
+					"controllers": {
+						"controller": [
+							{
+								"config": {
+									"name": "main"
+								},
+								"connections": {
+									"connection": [
+										{
+											"aux-id": 0,
+											"config": {
+												"address": "192.0.2.10",
+												"aux-id": 0
+											}
+										}
+									]
+								},
+								"name": "main"
+							}
+						]
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "controllers" >
+			elem: <
+				name: "controller"
+				key: <key: "name" value: "main" >
+			>
+			elem: <name: "connections" >
+			elem: <
+				name: "connection"
+				key: <key: "aux-id" value: "0" >
+			>
+			`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"openflow": {
+					"controllers": {
+						"controller": [
+							{
+								"config": {
+									"name": "main"
+								},
+								"name": "main"
+							}
+						]
+					}
+				}
+			}
+		}`,
+	}, {
+		desc: "delete leaf node with non-existing attribute value",
+		initConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						}
+					}
+				]
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "foo" >
+			>`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						}
+					}
+				]
+			}
+		}`,
+	}, {
+		desc: "delete leaf node with non-existing attribute value in precedent path",
+		initConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						},
+						"state": {
+							"name": "swpri1-1-1",
+							"mfg-name": "foo bar inc."
+						}
+					}
+				]
+			}
+		}`,
+		op: pb.UpdateResult_DELETE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "foo" >
+			>
+			elem: <name: "state" >
+			elem: <name: "mfg-name" >
+		`,
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						},
+						"state": {
+							"name": "swpri1-1-1",
+							"mfg-name": "foo bar inc."
+						}
+					}
+				]
+			}
+		}`,
+	}}
+
+	for _, tc := range tests {
+		t.Run(tc.desc, func(t *testing.T) {
+			runTestSet(t, model, tc)
+		})
+	}
+}
+
+func TestReplace(t *testing.T) {
+	systemConfig := `{
+		"system": {
+			"clock": {
+				"config": {
+					"timezone-name": "Europe/Stockholm"
+				}
+			},
+			"config": {
+				"hostname": "switch_a",
+				"login-banner": "Hello!"
+			}
+		}
+	}`
+
+	tests := []gnmiSetTestCase{{
+		desc:       "replace root",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{
+				JsonIetfVal: []byte(systemConfig),
+			}},
+		wantRetCode: codes.OK,
+		wantConfig:  systemConfig,
+	}, {
+		desc:       "replace a subtree",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "clock" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{
+				JsonIetfVal: []byte(`{"config": {"timezone-name": "US/New York"}}`),
+			},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"clock": {
+					"config": {
+						"timezone-name": "US/New York"
+					}
+				}
+			}
+		}`,
+	}, {
+		desc:       "replace a keyed list subtree",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "components" >
+			elem: <
+				name: "component"
+				key: <key: "name" value: "swpri1-1-1" >
+			>`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{
+				JsonIetfVal: []byte(`{"config": {"name": "swpri1-1-1"}}`),
+			},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"components": {
+				"component": [
+					{
+						"name": "swpri1-1-1",
+						"config": {
+							"name": "swpri1-1-1"
+						}
+					}
+				]
+			}
+		}`,
+	}, {
+		desc: "replace node with int type attribute in its precedent path",
+		initConfig: `{
+			"system": {
+				"openflow": {
+					"controllers": {
+						"controller": [
+							{
+								"config": {
+									"name": "main"
+								},
+								"name": "main"
+							}
+						]
+					}
+				}
+			}
+		}`,
+		op: pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "controllers" >
+			elem: <
+				name: "controller"
+				key: <key: "name" value: "main" >
+			>
+			elem: <name: "connections" >
+			elem: <
+				name: "connection"
+				key: <key: "aux-id" value: "0" >
+			>
+			elem: <name: "config" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{
+				JsonIetfVal: []byte(`{"address": "192.0.2.10", "aux-id": 0}`),
+			},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"openflow": {
+					"controllers": {
+						"controller": [
+							{
+								"config": {
+									"name": "main"
+								},
+								"connections": {
+									"connection": [
+										{
+											"aux-id": 0,
+											"config": {
+												"address": "192.0.2.10",
+												"aux-id": 0
+											}
+										}
+									]
+								},
+								"name": "main"
+							}
+						]
+					}
+				}
+			}
+		}`,
+	}, {
+		desc:       "replace a leaf node of int type",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "agent" >
+			elem: <name: "config" >
+			elem: <name: "backoff-interval" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_IntVal{IntVal: 5},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"openflow": {
+					"agent": {
+						"config": {
+							"backoff-interval": 5
+						}
+					}
+				}
+			}
+		}`,
+	}, {
+		desc:       "replace a leaf node of string type",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "agent" >
+			elem: <name: "config" >
+			elem: <name: "datapath-id" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_StringVal{StringVal: "00:16:3e:00:00:00:00:00"},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"openflow": {
+					"agent": {
+						"config": {
+							"datapath-id": "00:16:3e:00:00:00:00:00"
+						}
+					}
+				}
+			}
+		}`,
+	}, {
+		desc:       "replace a leaf node of enum type",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "agent" >
+			elem: <name: "config" >
+			elem: <name: "failure-mode" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_StringVal{StringVal: "SECURE"},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"openflow": {
+					"agent": {
+						"config": {
+							"failure-mode": "SECURE"
+						}
+					}
+				}
+			}
+		}`,
+	}, {
+		desc:       "replace an non-existing leaf node",
+		initConfig: `{}`,
+		op:         pb.UpdateResult_REPLACE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "openflow" >
+			elem: <name: "agent" >
+			elem: <name: "config" >
+			elem: <name: "foo-bar" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_StringVal{StringVal: "SECURE"},
+		},
+		wantRetCode: codes.NotFound,
+		wantConfig:  `{}`,
+	}}
+
+	for _, tc := range tests {
+		t.Run(tc.desc, func(t *testing.T) {
+			runTestSet(t, model, tc)
+		})
+	}
+}
+
+func TestUpdate(t *testing.T) {
+	tests := []gnmiSetTestCase{{
+		desc: "update leaf node",
+		initConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_UPDATE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "config" >
+			elem: <name: "domain-name" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_StringVal{StringVal: "foo.bar.com"},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"domain-name": "foo.bar.com",
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}, {
+		desc: "update subtree",
+		initConfig: `{
+			"system": {
+				"config": {
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+		op: pb.UpdateResult_UPDATE,
+		textPbPath: `
+			elem: <name: "system" >
+			elem: <name: "config" >
+		`,
+		val: &pb.TypedValue{
+			Value: &pb.TypedValue_JsonIetfVal{
+				JsonIetfVal: []byte(`{"domain-name": "foo.bar.com", "hostname": "switch_a"}`),
+			},
+		},
+		wantRetCode: codes.OK,
+		wantConfig: `{
+			"system": {
+				"config": {
+					"domain-name": "foo.bar.com",
+					"hostname": "switch_a"
+				}
+			}
+		}`,
+	}}
+
+	for _, tc := range tests {
+		t.Run(tc.desc, func(t *testing.T) {
+			runTestSet(t, model, tc)
+		})
+	}
+}
+
+func runTestSet(t *testing.T, m *Model, tc gnmiSetTestCase) {
+	// Create a new server with empty config
+	s, err := NewServer(m, []byte(tc.initConfig), nil)
+	if err != nil {
+		t.Fatalf("error in creating config server: %v", err)
+	}
+
+	// Send request
+	var pbPath pb.Path
+	if err := proto.UnmarshalText(tc.textPbPath, &pbPath); err != nil {
+		t.Fatalf("error in unmarshaling path: %v", err)
+	}
+	var req *pb.SetRequest
+	switch tc.op {
+	case pb.UpdateResult_DELETE:
+		req = &pb.SetRequest{Delete: []*pb.Path{&pbPath}}
+	case pb.UpdateResult_REPLACE:
+		req = &pb.SetRequest{Replace: []*pb.Update{{Path: &pbPath, Val: tc.val}}}
+	case pb.UpdateResult_UPDATE:
+		req = &pb.SetRequest{Update: []*pb.Update{{Path: &pbPath, Val: tc.val}}}
+	default:
+		t.Fatalf("invalid op type: %v", tc.op)
+	}
+	_, err = s.Set(nil, req)
+
+	// Check return code
+	gotRetStatus, ok := status.FromError(err)
+	if !ok {
+		t.Fatal("got a non-grpc error from grpc call")
+	}
+	if gotRetStatus.Code() != tc.wantRetCode {
+		t.Fatalf("got return code %v, want %v\nerror message: %v", gotRetStatus.Code(), tc.wantRetCode, err)
+	}
+
+	// Check server config
+	wantConfigStruct, err := m.NewConfigStruct([]byte(tc.wantConfig))
+	if err != nil {
+		t.Fatalf("wantConfig data cannot be loaded as a config struct: %v", err)
+	}
+	wantConfigJSON, err := ygot.ConstructIETFJSON(wantConfigStruct, &ygot.RFC7951JSONConfig{})
+	if err != nil {
+		t.Fatalf("error in constructing IETF JSON tree from wanted config: %v", err)
+	}
+	gotConfigJSON, err := ygot.ConstructIETFJSON(s.config, &ygot.RFC7951JSONConfig{})
+	if err != nil {
+		t.Fatalf("error in constructing IETF JSON tree from server config: %v", err)
+	}
+	if !reflect.DeepEqual(gotConfigJSON, wantConfigJSON) {
+		t.Fatalf("got server config %v\nwant: %v", gotConfigJSON, wantConfigJSON)
+	}
+}
diff --git a/forks/google/gnmi/util.go b/forks/google/gnmi/util.go
new file mode 100644
index 0000000000000000000000000000000000000000..73d17b49f7cab79a20236681c773b50844060af4
--- /dev/null
+++ b/forks/google/gnmi/util.go
@@ -0,0 +1,102 @@
+package gnmi
+
+import (
+	"fmt"
+	"strconv"
+
+	"github.com/openconfig/goyang/pkg/yang"
+	log "github.com/sirupsen/logrus"
+
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+)
+
+// getChildNode gets a node's child with corresponding schema specified by path
+// element. If not found and createIfNotExist is set as true, an empty node is
+// created and returned.
+func getChildNode(node map[string]interface{}, schema *yang.Entry, elem *pb.PathElem, createIfNotExist bool) (interface{}, *yang.Entry) {
+	var nextSchema *yang.Entry
+	var ok bool
+
+	if nextSchema, ok = schema.Dir[elem.Name]; !ok {
+		return nil, nil
+	}
+
+	var nextNode interface{}
+	if elem.GetKey() == nil {
+		if nextNode, ok = node[elem.Name]; !ok {
+			if createIfNotExist {
+				node[elem.Name] = make(map[string]interface{})
+				nextNode = node[elem.Name]
+			}
+		}
+		return nextNode, nextSchema
+	}
+
+	nextNode = getKeyedListEntry(node, elem, createIfNotExist)
+	return nextNode, nextSchema
+}
+
+// getKeyedListEntry finds the keyed list entry in node by the name and key of
+// path elem. If entry is not found and createIfNotExist is true, an empty entry
+// will be created (the list will be created if necessary).
+func getKeyedListEntry(node map[string]interface{}, elem *pb.PathElem, createIfNotExist bool) map[string]interface{} {
+	curNode, ok := node[elem.Name]
+	if !ok {
+		if !createIfNotExist {
+			return nil
+		}
+
+		// Create a keyed list as node child and initialize an entry.
+		m := make(map[string]interface{})
+		for k, v := range elem.Key {
+			m[k] = v
+			if vAsNum, err := strconv.ParseFloat(v, 64); err == nil {
+				m[k] = vAsNum
+			}
+		}
+		node[elem.Name] = []interface{}{m}
+		return m
+	}
+
+	// Search entry in keyed list.
+	keyedList, ok := curNode.([]interface{})
+	if !ok {
+		return nil
+	}
+	for _, n := range keyedList {
+		m, ok := n.(map[string]interface{})
+		if !ok {
+			log.Errorf("wrong keyed list entry type: %T", n)
+			return nil
+		}
+		keyMatching := true
+		// must be exactly match
+		for k, v := range elem.Key {
+			attrVal, ok := m[k]
+			if !ok {
+				return nil
+			}
+			if v != fmt.Sprintf("%v", attrVal) {
+				keyMatching = false
+				break
+			}
+		}
+		if keyMatching {
+			return m
+		}
+	}
+	if !createIfNotExist {
+		return nil
+	}
+
+	// Create an entry in keyed list.
+	m := make(map[string]interface{})
+	for k, v := range elem.Key {
+		m[k] = v
+		if vAsNum, err := strconv.ParseFloat(v, 64); err == nil {
+			m[k] = vAsNum
+		}
+	}
+	node[elem.Name] = append(keyedList, m)
+	return m
+}
diff --git a/go.mod b/go.mod
index eb95a65a8340c359295c54d4030bb21ad018440c..1383223929d53e4947e16826082287cdfd8d2268 100644
--- a/go.mod
+++ b/go.mod
@@ -3,17 +3,20 @@ module code.fbi.h-da.de/cocsn/gosdn
 go 1.14
 
 require (
-	code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88
-	github.com/BurntSushi/toml v0.3.1
-	github.com/go-openapi/runtime v0.19.22
-	github.com/go-openapi/strfmt v0.19.5
-	github.com/golang/protobuf v1.4.2
-	github.com/google/go-cmp v0.4.1 // indirect
-	github.com/mattn/go-sqlite3 v1.14.3
+	code.fbi.h-da.de/cocsn/yang-models v0.0.4
+	github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a
+	github.com/golang/protobuf v1.5.0
+	github.com/google/gnxi v0.0.0-20201221102247-c26672548161
+	github.com/google/uuid v1.1.2
 	github.com/neo4j/neo4j-go-driver v1.8.3
-	github.com/rivo/tview v0.0.0-20200915114512-42866ecf6ca6
-	golang.org/x/net v0.0.0-20200904194848-62affa334b73 // indirect
-	google.golang.org/genproto v0.0.0-20200519141106-08726f379972 // indirect
-	google.golang.org/grpc v1.29.1
-	google.golang.org/protobuf v1.23.0
+	github.com/openconfig/gnmi v0.0.0-20200617225440-d2b4e6a45802
+	github.com/openconfig/goyang v0.2.3
+	github.com/openconfig/ygot v0.10.0
+	github.com/sirupsen/logrus v1.4.2
+	github.com/spf13/cobra v1.1.1
+	github.com/spf13/viper v1.7.1
+	github.com/stretchr/testify v1.6.1
+	golang.org/x/net v0.0.0-20201216054612-986b41b23924
+	google.golang.org/grpc v1.34.0
+	google.golang.org/protobuf v1.26.0
 )
diff --git a/go.sum b/go.sum
index 1e8b1b3fb4eb989895297976c1fdf45cb6ab3a18..90f7ff82882f30740f6db7f84db843f8df703e08 100644
--- a/go.sum
+++ b/go.sum
@@ -1,142 +1,102 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88 h1:cNqY3WEh+CX8+esxIwWU/uD7hRC5mPvuJmXzB07OeuA=
-code.fbi.h-da.de/cocsn/swagger/apis v0.0.0-20200924152423-61030cab7b88/go.mod h1:3jDZAOmepPl3kiukNGvPFkJEzgGczgrC3zJ2jcqVFSs=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+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/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+code.fbi.h-da.de/cocsn/yang-models v0.0.4 h1:y/Ph5CaD2NJDPjoOuS59iKrMYf9bvpg2/hefC2RG6E4=
+code.fbi.h-da.de/cocsn/yang-models v0.0.4/go.mod h1:7MnNmAQ9o84BpUepcaV6RB1mBGCNyXVJcdbKUl6rK0g=
+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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
-github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
-github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
-github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
-github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
-github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks=
+github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA=
+github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a h1:R7ghEBfKIqu/SDpGHS9Nj1fWPxkvxh6Lv4Wq6eS95G4=
+github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a/go.mod h1:Q4lsGfepQE823ePrSNr2CjCz1oeeMECJ6k1yBVujrZg=
+github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+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/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/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
+github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
-github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
-github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM=
-github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM=
-github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
-github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
-github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
-github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
-github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
-github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
-github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
-github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys=
-github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
-github.com/go-openapi/errors v0.19.7 h1:Lcq+o0mSwCLKACMxZhreVHigB9ebghJ/lrmeaqASbjo=
-github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
-github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
-github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
-github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
-github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
-github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
-github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
-github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
-github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
-github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls=
-github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY=
-github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
-github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
-github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
-github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
-github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98=
-github.com/go-openapi/runtime v0.19.22 h1:vtT7gJwxIK96BVTd9Ce5OPNQfIsk+q1j/+0e98NoVXk=
-github.com/go-openapi/runtime v0.19.22/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk=
-github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
-github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
-github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
-github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
-github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
-github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
-github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
-github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
-github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
-github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
-github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
-github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
-github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
-github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
-github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk=
-github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8=
-github.com/go-openapi/validate v0.19.11 h1:8lCr0b9lNWKjVjW/hSZZvltUy+bULl7vbnCTsOzlhPo=
-github.com/go-openapi/validate v0.19.11/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
+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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
-github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
-github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
-github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
-github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
-github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
-github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
-github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
-github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
-github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
-github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
-github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
-github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
-github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
-github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
-github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 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.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
@@ -145,217 +105,458 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 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/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/gnxi v0.0.0-20201221102247-c26672548161 h1:8Huhvr/sx+mAUzfujNPTCbq+z4LG1qUIu0smjXTaBw0=
+github.com/google/gnxi v0.0.0-20201221102247-c26672548161/go.mod h1:dPTuHPVOqxZ2yGKPjymiMt1vrZa8KHXWKX+Lx1z5d88=
 github.com/google/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 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0=
 github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+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/protobuf v3.11.4+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0=
+github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
-github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
-github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
-github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
-github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
-github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
-github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
-github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
-github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
-github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
-github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-sqlite3 v1.14.3 h1:j7a/xn1U6TKA/PHHxqZuzh64CdtRc7rU9M+AvkOl5bA=
-github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY=
+github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
-github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
+github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/moby/moby v1.13.1/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/neo4j/neo4j-go-driver v1.8.3 h1:yfuo9YBAlezdIiogu92GwEir/81RD81dNwS5mY/wAIk=
 github.com/neo4j/neo4j-go-driver v1.8.3/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
 github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
+github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc=
+github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
+github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
+github.com/openconfig/gnmi v0.0.0-20200617225440-d2b4e6a45802 h1:WXFwJlWOJINlwlyAZuNo4GdYZS6qPX36+rRUncLmN8Q=
+github.com/openconfig/gnmi v0.0.0-20200617225440-d2b4e6a45802/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A=
+github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU=
+github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
+github.com/openconfig/goyang v0.2.3 h1:pYxQ+VG6KNS3N5zkQeLmIBtc3gRs6JHZOKMD2/knlv4=
+github.com/openconfig/goyang v0.2.3/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
+github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw=
+github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs=
+github.com/openconfig/ygot v0.9.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
+github.com/openconfig/ygot v0.10.0 h1:EmgwLXbFiCBmEUlSI4/1fPuRzgf4EsD0sThmAmRqbYM=
+github.com/openconfig/ygot v0.10.0/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ=
+github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
+github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
+github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.1/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/rivo/tview v0.0.0-20200915114512-42866ecf6ca6 h1:LhmHZTzElCYlOXEWXWOQXy/vgjPsdiDb7LzHV8mTKvI=
-github.com/rivo/tview v0.0.0-20200915114512-42866ecf6ca6/go.mod h1:xV4Aw4WIX8cmhg71U7MUHBdpIQ7zSEXdRruGHLaEAOc=
-github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
-github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
+github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ=
+github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4=
+github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
+github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
+github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 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.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
-github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
-github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
+github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU=
+github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4=
+github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
+github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
-go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
-go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE=
-go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
+github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE=
+github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
-golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/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/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/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/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/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-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA=
-golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY=
+golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 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/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-20190412183630-56d357773e84/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/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200817155316-9781c653f443 h1:X18bCaipMcoJGm27Nv7zr4XYPKGUy92GtqboKC2Hxaw=
-golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/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 h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs=
+golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+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 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
+golang.org/x/text v0.3.4/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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190125232054-d66bd3c5d5a6/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-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190420181800-aa740d480789/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-20190328211700-ab21143f2384/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/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190617190820-da514acc4774 h1:CQVOmarCBFzTx0kbOU0ru54Cvot8SdSrNYjZPhQl+gk=
-golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+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-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+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/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/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-20200519141106-08726f379972 h1:6ydLqG65DIMNJf6p97WudGsmd1w3Ickm/LiZnBrREPI=
+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-20200519141106-08726f379972/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-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
 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=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+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=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
 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/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
+gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
+gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
+gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
+gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
+gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
+gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
+gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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=
+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=
diff --git a/gosdn-cli/gosdn-cli.go b/gosdn-cli/gosdn-cli.go
deleted file mode 100644
index bc6763c5b5777705815f93144674c4bc3a9dd4fb..0000000000000000000000000000000000000000
--- a/gosdn-cli/gosdn-cli.go
+++ /dev/null
@@ -1,200 +0,0 @@
-package main
-
-import (
-	pb "code.fbi.h-da.de/cocsn/gosdn/cliInterface"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"context"
-	"flag"
-	"fmt"
-	"google.golang.org/grpc"
-	"os"
-	"time"
-)
-
-const (
-	defaultName = "gosdn-cli"
-)
-
-// Based on the helloworld example of grpc.io -- thx!
-
-type cliClientConfig struct {
-	goSDNCLIAddr4 *string
-	goSDNCLIPort4 *int
-	interactive   *bool
-	goSDNCommand  *string
-}
-
-type commandOptions struct {
-	name        string
-	description string
-	command     func(conn *grpc.ClientConn)
-}
-
-var commandList = map[string]commandOptions{
-	"hello":           {"hello", "test connection to goSDN controller", goSDNSayHello},
-	"shutdown":        {"shutdown", "request goSDN controller to shutdown", goSDNShutdown},
-	"testdb":          {"testdb", "test all database connections", goSDNTestDB},
-	"tapigetedge":     {"tapigetedge", "get list of edges", TAPIGetEdge},
-	"tapigetedgenode": {"tapigetedgenode", "get list of edgenodes", TAPIGetEdgeNode},
-	"tapigetlink":     {"tapigetlink", "get list of links", TAPIGetLink},
-}
-
-/*
-	gosdn-cli allows to mode of operations:
-	- interactive: text GUI to operate goSDN
-    - non-interactive: basic CLI without text GUI
-*/
-
-func main() {
-	// This holds the basic configuration for gosdn-cli
-	var myConfiguration = new(cliClientConfig)
-
-	myConfiguration.goSDNCLIAddr4 = flag.String("cliServerAddr", "127.0.0.1", "The IPv4 Address of the grpcCLI.")
-	myConfiguration.goSDNCLIPort4 = flag.Int("cliServerPort", 55055, "The port number of the grpcCLI")
-	myConfiguration.interactive = flag.Bool("interactive", false, "interactive: text gui or just not")
-	var printCommandList = flag.Bool("commandlist", false, "interactive: print command list")
-	myConfiguration.goSDNCommand = flag.String("command", "", "-command: <your command> ; show commands with -commandlist")
-
-	flag.Parse()
-
-	// Print complete command list and exit
-	if *printCommandList {
-		for _, element := range commandList {
-			fmt.Println(element.name + "\t" + element.description)
-		}
-		os.Exit(0)
-	}
-
-	log.Info("Starting " + defaultName + " to access the goSDN controller")
-	// Prepare string with socket for connection to the goSDN controller
-	goSDNSocketAddress := fmt.Sprintf("%s:%d", *myConfiguration.goSDNCLIAddr4, *myConfiguration.goSDNCLIPort4)
-
-	log.Info("Connecting to the goSDN server at: " + goSDNSocketAddress)
-	// Set up a connection to the server.
-	address := "localhost:55055"
-
-	conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer conn.Close()
-	log.Info("Connected to " + conn.Target())
-
-	// Check for non-interactive or interactive mode
-	if !*myConfiguration.interactive {
-		log.Info("starting in non-interactive mode")
-		// Lookup command or die
-		_, found := commandList[*myConfiguration.goSDNCommand]
-		if found {
-			// Excecute desired command
-			commandList[*myConfiguration.goSDNCommand].command(conn)
-		} else {
-			// TODO: change once gosdn/errors exist
-			log.Fatal("Your desired command is not available: ", commandList[*myConfiguration.goSDNCommand].name)
-			os.Exit(1)
-		}
-
-	} else {
-		log.Info("starting in interactive mode -- do not use yet")
-		os.Exit(1)
-	}
-}
-
-func goSDNSayHello(conn *grpc.ClientConn) {
-	c := pb.NewGrpcCliClient(conn)
-
-	// Contact the server and print out its response.
-	name := defaultName
-	if len(os.Args) > 1 {
-		name = os.Args[1]
-	}
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Info("Greeting: ", r.String())
-
-}
-
-func goSDNShutdown(conn *grpc.ClientConn) {
-
-	c := pb.NewGrpcCliClient(conn)
-
-	// Contact the server and print out its response.
-	name := defaultName
-	if len(os.Args) > 1 {
-		name = os.Args[0]
-	}
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := c.Shutdown(ctx, &pb.ShutdownRequest{Name: name})
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Info("Greeting: ", r.GetMessage())
-}
-
-func goSDNTestDB(conn *grpc.ClientConn) {
-	// TODO: fill with code and also see if grpc interface has this stub implemented.
-}
-
-// TAPIGetEdge triggers the GetEdge function of the Ciena
-// flavoured TAPI client
-func TAPIGetEdge(conn *grpc.ClientConn) {
-
-	c := pb.NewGrpcCliClient(conn)
-
-	// Contact the server and print out its response.
-	name := defaultName
-	if len(os.Args) > 1 {
-		name = os.Args[0]
-	}
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := c.TAPIGetEdge(ctx, &pb.TAPIRequest{Name: name})
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Info("TAPIGetEdge said: ", r.GetMessage())
-}
-
-// TAPIGetEdgeNode triggers the GetEdgeNode function of the Ciena
-// flavoured TAPI client
-func TAPIGetEdgeNode(conn *grpc.ClientConn) {
-	c := pb.NewGrpcCliClient(conn)
-
-	// Contact the server and print out its response.
-	name := defaultName
-	if len(os.Args) > 1 {
-		name = os.Args[0]
-	}
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := c.TAPIGetEdgeNode(ctx, &pb.TAPIRequest{Name: name})
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Info("TAPIGetEdgeNode said: ", r.GetMessage())
-}
-
-// TAPIGetLink triggers the GetLink function of the Ciena
-// flavoured TAPI client
-func TAPIGetLink(conn *grpc.ClientConn) {
-
-	c := pb.NewGrpcCliClient(conn)
-
-	// Contact the server and print out its response.
-	name := defaultName
-	if len(os.Args) > 1 {
-		name = os.Args[0]
-	}
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := c.TAPIGetLink(ctx, &pb.TAPIRequest{Name: name})
-	if err != nil {
-		log.Fatal(err)
-	}
-	log.Info("TAPIGetLink said: ", r.GetMessage())
-}
diff --git a/gosdn.png b/gosdn.png
new file mode 100644
index 0000000000000000000000000000000000000000..b16c83696fe11f6b983da0bf923457ecf59add8d
Binary files /dev/null and b/gosdn.png differ
diff --git a/gosdn.puml b/gosdn.puml
new file mode 100644
index 0000000000000000000000000000000000000000..1dc2379006cdef8990adf2f73dc4fe5ddd414c51
--- /dev/null
+++ b/gosdn.puml
@@ -0,0 +1,118 @@
+@startuml
+namespace nucleus {
+    class ClientConfig << (S,Aquamarine) >> {
+        + Identifier string
+        + Endpoint string
+        + Username string
+        + Password string
+        + GjsonDefaultPath string
+        + GjsonConnectionsPath string
+
+    }
+    class Core << (S,Aquamarine) >> {
+        - devices <font color=blue>map</font>[string]Device
+        - southboundInterfaces <font color=blue>map</font>[string]interfaces.SouthboundInterface
+        - prinipalNetworkDomains <font color=blue>map</font>[uuid.UUID]interfaces.PrincipalNetworkDomain
+        - database database.Database
+        - config controllerConfig
+
+        + IsRunning <font color=blue>chan</font> bool
+
+        - readControllerConfig(configFileController string) error
+
+        + Init(socket string, configFileController string, configFileClient string, IsRunningChannel <font color=blue>chan</font> bool) 
+        + AttachDatabase() 
+        + Shutdown() 
+
+    }
+    class Device << (S,Aquamarine) >> {
+        - device ygot.GoStruct
+
+        + SBI interfaces.SouthboundInterface
+        + Config DeviceConfig
+
+    }
+    class DeviceConfig << (S,Aquamarine) >> {
+        + Identifier uuid.UUID
+        + Endpoint string
+        + Username string
+        + Password string
+
+    }
+    interface PrincipalNetworkDomain  {
+        + Destroy() error
+        + AddSbi() error
+        + RemoveSbi() error
+        + AddDevice( interfaces.Device) error
+        + RemoveDevice(uuid uuid.UUID) error
+
+    }
+    interface SouthboundInterface  {
+    }
+    class buf << (S,Aquamarine) >> {
+        + Write(p []byte) (int, error)
+
+    }
+    class controllerConfig << (S,Aquamarine) >> {
+        + CliSocket string
+        + DatabaseSocket string
+        + DatabaseUser string
+        + DatabasePassword string
+        + DatabaseCrypto bool
+        + ConfigPath string
+
+    }
+    class logConnection << (S,Aquamarine) >> {
+        - stream proto.GrpcCli_CreateLogStreamServer
+        - id string
+        - active bool
+        - error <font color=blue>chan</font> error
+
+    }
+    class nucleus.buf << (T, #FF7700) >>  {
+    }
+    class pndImplementation << (S,Aquamarine) >> {
+        - name string
+        - sbiContainer <font color=blue>map</font>[string]*interfaces.SouthboundInterface
+        - devices <font color=blue>map</font>[uuid.UUID]Device
+
+        + Destroy() error
+        + AddSbi() error
+        + RemoveSbi() error
+        + AddDevice(device Device) error
+        + RemoveDevice(uuid uuid.UUID) error
+
+    }
+    class server << (S,Aquamarine) >> {
+        - core *Core
+        - logConnections []*logConnection
+
+        + SayHello(ctx context.Context, in *proto.HelloRequest) (*proto.HelloReply, error)
+        + CreateLogStream(req *emptypb.Empty, stream proto.GrpcCli_CreateLogStreamServer) error
+        + BroadcastLog(log *proto.LogReply) 
+        + Shutdown(ctx context.Context, in *proto.ShutdownRequest) (*proto.ShutdownReply, error)
+        + TAPIGetEdge(ctx context.Context, in *proto.TAPIRequest) (*proto.TAPIReply, error)
+        + TAPIGetEdgeNode(ctx context.Context, in *proto.TAPIRequest) (*proto.TAPIReply, error)
+        + TAPIGetLink(ctx context.Context, in *proto.TAPIRequest) (*proto.TAPIReply, error)
+
+    }
+}
+"proto.UnimplementedGrpcCliServer" *-- "nucleus.server"
+
+
+namespace sbi {
+    class OpenConfig << (S,Aquamarine) >> {
+        - name string
+        - clientContainer []Client
+
+        + AddClient() error
+        + RemoveClient() error
+        + CollectHeartbeats() error
+        + ListClients() <font color=blue>map</font>[int]interfaces.Client
+
+    }
+}
+
+
+"__builtin__.[]byte" #.. "nucleus.buf"
+@enduml
diff --git a/gosdn.toml b/gosdn.toml
deleted file mode 100644
index 7fe3795e751421e29f26eb7e02d9dc3571163a61..0000000000000000000000000000000000000000
--- a/gosdn.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-#example gosdn.toml
-CliSocket       = "localhost:55055"
-DatabaseSocket  = "bolt://141.100.70.170:7687"
-ConfigPath      = "./gosdn.toml"
\ No newline at end of file
diff --git a/log/logger.go b/log/logger.go
deleted file mode 100644
index 479d68e3b3e18e951f20bfc5e8aa8903158f1f61..0000000000000000000000000000000000000000
--- a/log/logger.go
+++ /dev/null
@@ -1,181 +0,0 @@
-package log
-
-import (
-	"fmt"
-	"io"
-	"log/syslog"
-	"os"
-	"reflect"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-)
-
-var logger *Logger
-var once sync.Once
-
-// Logger is a wrapper for log.Logger and provides
-// methods to enable and disable logging.
-type Logger struct {
-	DefaultWriter  io.Writer
-	LoglevelWriter map[Level]io.Writer
-	toSyslog       map[Level]bool
-	Loglevel       Level
-	lock           sync.Mutex
-	builder        strings.Builder
-}
-
-func (l *Logger) buildMessage(level Level, syslog bool, args ...interface{}) {
-	if !syslog {
-		l.builder.WriteString(time.Now().Format(time.RFC3339))
-	}
-	l.builder.WriteRune('\t')
-	l.builder.WriteString(prefix(level))
-	l.builder.WriteRune('\t')
-	function, line := callers()
-	functionSplitted := strings.SplitAfter(function, "/")
-	function = functionSplitted[len(functionSplitted)-1]
-	l.builder.WriteString(function)
-	l.builder.WriteRune(':')
-	l.builder.WriteString(strconv.Itoa(line))
-	l.builder.WriteRune('\t')
-	l.builder.WriteString(fmt.Sprint(args...))
-	l.builder.WriteRune('\n')
-}
-
-func get() *Logger {
-	once.Do(func() {
-		logger = &Logger{
-			DefaultWriter:  os.Stderr,
-			LoglevelWriter: make(map[Level]io.Writer),
-			toSyslog:       make(map[Level]bool),
-			Loglevel:       INFO,
-			lock:           sync.Mutex{},
-		}
-	})
-	return logger
-}
-
-//Loglevel sets the verbosity of the logger
-//Defaults to INFO
-func Loglevel(level Level) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.Loglevel = level
-}
-
-//Output defines the output of the logger
-//Defaults to os.Stderr
-func Output(out io.Writer) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.DefaultWriter = out
-}
-
-//LoglevelOutput defines a special output
-//for a certain log level
-func LoglevelOutput(level Level, out io.Writer) {
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	l.LoglevelWriter[level] = out
-	if reflect.TypeOf(out) == reflect.TypeOf(&syslog.Writer{}) {
-		l.toSyslog[level] = true
-	}
-}
-
-//Debug passes the DEBUG flag and a
-//message to the logger
-func Debug(args ...interface{}) {
-	log(DEBUG, args...)
-}
-
-//Info passes the INFO flag and a
-//message to the logger
-func Info(args ...interface{}) {
-	log(INFO, args...)
-}
-
-//Warn passes the WARNING flag and a
-//message to the logger
-func Warn(args ...interface{}) {
-	log(WARNING, args...)
-}
-
-//Error passes the ERROR flag and a
-//message to the logger
-func Error(args ...interface{}) {
-	log(ERROR, args...)
-}
-
-//Fatal passes the FATAL flag and a
-//message to the logger and calls
-//os.Exit(1)
-func Fatal(args ...interface{}) {
-	log(FATAL, args...)
-	os.Exit(1)
-}
-
-//Panic passes the PANIC flag and a
-//message to the logger
-//Also calls builtin.panic()
-func Panic(args ...interface{}) {
-	log(PANIC, args...)
-	panic(args)
-}
-
-func log(level Level, args ...interface{}) {
-	defer func() {
-		if r := recover(); r != nil {
-			fmt.Println("Recovered in f", r)
-		}
-	}()
-	l := get()
-	l.lock.Lock()
-	defer l.lock.Unlock()
-	defer l.builder.Reset()
-	if level <= l.Loglevel {
-		l.buildMessage(level, l.toSyslog[level], args...)
-		msg := []byte(l.builder.String())
-		writer, ok := l.LoglevelWriter[level]
-		var err error
-		if !ok {
-			_, err = l.DefaultWriter.Write(msg)
-		} else {
-			_, err = writer.Write(msg)
-		}
-		if err != nil {
-			panic(err)
-		}
-	}
-}
-
-func callers() (string, int) {
-	pc := make([]uintptr, 15)
-	n := runtime.Callers(5, pc)
-	frames := runtime.CallersFrames(pc[:n])
-	frame, _ := frames.Next()
-	return frame.Function, frame.Line
-}
-
-func prefix(level Level) string {
-	switch level {
-	case PANIC:
-		return "PANIC"
-	case FATAL:
-		return "FATAL"
-	case ERROR:
-		return "ERROR"
-	case WARNING:
-		return "WARNING"
-	case INFO:
-		return "INFO"
-	case DEBUG:
-		return "DEBUG"
-	}
-	return ""
-}
diff --git a/log/loglevel.go b/log/loglevel.go
deleted file mode 100644
index 6288bcbc97b5843f346565bfe753e78aff7579cc..0000000000000000000000000000000000000000
--- a/log/loglevel.go
+++ /dev/null
@@ -1,16 +0,0 @@
-package log
-
-// Level is an 8 bit integer representing a
-// log level for the logger
-type Level uint8
-
-// Constants for more verbose integer
-// values
-const (
-	PANIC Level = iota
-	FATAL
-	ERROR
-	WARNING
-	INFO
-	DEBUG
-)
diff --git a/main.go b/main.go
deleted file mode 100644
index 7527c7d3e71b2c3548031f90f24772174560a41c..0000000000000000000000000000000000000000
--- a/main.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package main
-
-import (
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
-	"flag"
-)
-
-func main() {
-
-	// register our supported flags
-	cliListenAddr := flag.String("cli-listen-addr", "localhost", "The IP address of the grpcCLI.")
-	cliListenPort := flag.String("cli-server-port", "55055", "The port number of the grpcCLI")
-	configFileName := flag.String("config-file", "", "Path to the config file")
-
-	flag.Parse()
-	cliSocket := *cliListenAddr + ":" + *cliListenPort
-
-	log.Loglevel(log.DEBUG)
-
-	// Setup a channel to communicate if goSDN should shutdown.
-	IsRunningChannel := make(chan bool)
-
-	// hand off to cmd for further processing
-	nucleus.StartAndRun(cliSocket, *configFileName, IsRunningChannel)
-
-	// nothing to see here, please move on!
-}
diff --git a/mocks/ConfigCallback.go b/mocks/ConfigCallback.go
new file mode 100644
index 0000000000000000000000000000000000000000..36173a9d7ae5bafba95cff07a023db983ab80db0
--- /dev/null
+++ b/mocks/ConfigCallback.go
@@ -0,0 +1,27 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	ygot "github.com/openconfig/ygot/ygot"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// ConfigCallback is an autogenerated mock type for the ConfigCallback type
+type ConfigCallback struct {
+	mock.Mock
+}
+
+// Execute provides a mock function with given fields: _a0
+func (_m *ConfigCallback) Execute(_a0 ygot.ValidatedGoStruct) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(ygot.ValidatedGoStruct) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
diff --git a/mocks/EscapeFunc.go b/mocks/EscapeFunc.go
new file mode 100644
index 0000000000000000000000000000000000000000..3ab84b3e650e7bad1fb3e88f2f0f7d02bee2abb1
--- /dev/null
+++ b/mocks/EscapeFunc.go
@@ -0,0 +1,24 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// EscapeFunc is an autogenerated mock type for the EscapeFunc type
+type EscapeFunc struct {
+	mock.Mock
+}
+
+// Execute provides a mock function with given fields: k
+func (_m *EscapeFunc) Execute(k string) string {
+	ret := _m.Called(k)
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func(string) string); ok {
+		r0 = rf(k)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
diff --git a/mocks/GNMIClient.go b/mocks/GNMIClient.go
new file mode 100644
index 0000000000000000000000000000000000000000..255d4a40d68513d1b1125101f8e9cdc12f139dc2
--- /dev/null
+++ b/mocks/GNMIClient.go
@@ -0,0 +1,137 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	grpc "google.golang.org/grpc"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// GNMIClient is an autogenerated mock type for the GNMIClient type
+type GNMIClient struct {
+	mock.Mock
+}
+
+// Capabilities provides a mock function with given fields: ctx, in, opts
+func (_m *GNMIClient) Capabilities(ctx context.Context, in *gnmi.CapabilityRequest, opts ...grpc.CallOption) (*gnmi.CapabilityResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *gnmi.CapabilityResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.CapabilityRequest, ...grpc.CallOption) *gnmi.CapabilityResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.CapabilityResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.CapabilityRequest, ...grpc.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Get provides a mock function with given fields: ctx, in, opts
+func (_m *GNMIClient) Get(ctx context.Context, in *gnmi.GetRequest, opts ...grpc.CallOption) (*gnmi.GetResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *gnmi.GetResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.GetRequest, ...grpc.CallOption) *gnmi.GetResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.GetResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.GetRequest, ...grpc.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Set provides a mock function with given fields: ctx, in, opts
+func (_m *GNMIClient) Set(ctx context.Context, in *gnmi.SetRequest, opts ...grpc.CallOption) (*gnmi.SetResponse, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx, in)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 *gnmi.SetResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.SetRequest, ...grpc.CallOption) *gnmi.SetResponse); ok {
+		r0 = rf(ctx, in, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.SetResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.SetRequest, ...grpc.CallOption) error); ok {
+		r1 = rf(ctx, in, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Subscribe provides a mock function with given fields: ctx, opts
+func (_m *GNMIClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (gnmi.GNMI_SubscribeClient, error) {
+	_va := make([]interface{}, len(opts))
+	for _i := range opts {
+		_va[_i] = opts[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 gnmi.GNMI_SubscribeClient
+	if rf, ok := ret.Get(0).(func(context.Context, ...grpc.CallOption) gnmi.GNMI_SubscribeClient); ok {
+		r0 = rf(ctx, opts...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(gnmi.GNMI_SubscribeClient)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, ...grpc.CallOption) error); ok {
+		r1 = rf(ctx, opts...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
diff --git a/mocks/GNMIServer.go b/mocks/GNMIServer.go
new file mode 100644
index 0000000000000000000000000000000000000000..0628c5b31fe2c971810f5a2c9f7be3a8326ee40c
--- /dev/null
+++ b/mocks/GNMIServer.go
@@ -0,0 +1,98 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// GNMIServer is an autogenerated mock type for the GNMIServer type
+type GNMIServer struct {
+	mock.Mock
+}
+
+// Capabilities provides a mock function with given fields: _a0, _a1
+func (_m *GNMIServer) Capabilities(_a0 context.Context, _a1 *gnmi.CapabilityRequest) (*gnmi.CapabilityResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *gnmi.CapabilityResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.CapabilityRequest) *gnmi.CapabilityResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.CapabilityResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.CapabilityRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Get provides a mock function with given fields: _a0, _a1
+func (_m *GNMIServer) Get(_a0 context.Context, _a1 *gnmi.GetRequest) (*gnmi.GetResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *gnmi.GetResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.GetRequest) *gnmi.GetResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.GetResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.GetRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Set provides a mock function with given fields: _a0, _a1
+func (_m *GNMIServer) Set(_a0 context.Context, _a1 *gnmi.SetRequest) (*gnmi.SetResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *gnmi.SetResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *gnmi.SetRequest) *gnmi.SetResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.SetResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *gnmi.SetRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Subscribe provides a mock function with given fields: _a0
+func (_m *GNMIServer) Subscribe(_a0 gnmi.GNMI_SubscribeServer) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(gnmi.GNMI_SubscribeServer) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
diff --git a/mocks/GNMI_SubscribeClient.go b/mocks/GNMI_SubscribeClient.go
new file mode 100644
index 0000000000000000000000000000000000000000..456be898e5d92171a26add0d03e863f08f302d24
--- /dev/null
+++ b/mocks/GNMI_SubscribeClient.go
@@ -0,0 +1,151 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	metadata "google.golang.org/grpc/metadata"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// GNMI_SubscribeClient is an autogenerated mock type for the GNMI_SubscribeClient type
+type GNMI_SubscribeClient struct {
+	mock.Mock
+}
+
+// CloseSend provides a mock function with given fields:
+func (_m *GNMI_SubscribeClient) CloseSend() error {
+	ret := _m.Called()
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func() error); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Context provides a mock function with given fields:
+func (_m *GNMI_SubscribeClient) Context() context.Context {
+	ret := _m.Called()
+
+	var r0 context.Context
+	if rf, ok := ret.Get(0).(func() context.Context); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(context.Context)
+		}
+	}
+
+	return r0
+}
+
+// Header provides a mock function with given fields:
+func (_m *GNMI_SubscribeClient) Header() (metadata.MD, error) {
+	ret := _m.Called()
+
+	var r0 metadata.MD
+	if rf, ok := ret.Get(0).(func() metadata.MD); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(metadata.MD)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Recv provides a mock function with given fields:
+func (_m *GNMI_SubscribeClient) Recv() (*gnmi.SubscribeResponse, error) {
+	ret := _m.Called()
+
+	var r0 *gnmi.SubscribeResponse
+	if rf, ok := ret.Get(0).(func() *gnmi.SubscribeResponse); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.SubscribeResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// RecvMsg provides a mock function with given fields: m
+func (_m *GNMI_SubscribeClient) RecvMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Send provides a mock function with given fields: _a0
+func (_m *GNMI_SubscribeClient) Send(_a0 *gnmi.SubscribeRequest) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*gnmi.SubscribeRequest) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SendMsg provides a mock function with given fields: m
+func (_m *GNMI_SubscribeClient) SendMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Trailer provides a mock function with given fields:
+func (_m *GNMI_SubscribeClient) Trailer() metadata.MD {
+	ret := _m.Called()
+
+	var r0 metadata.MD
+	if rf, ok := ret.Get(0).(func() metadata.MD); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(metadata.MD)
+		}
+	}
+
+	return r0
+}
diff --git a/mocks/GNMI_SubscribeServer.go b/mocks/GNMI_SubscribeServer.go
new file mode 100644
index 0000000000000000000000000000000000000000..e19a9379ffc57345b30141b757dbd5d57327a82a
--- /dev/null
+++ b/mocks/GNMI_SubscribeServer.go
@@ -0,0 +1,131 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	metadata "google.golang.org/grpc/metadata"
+
+	mock "github.com/stretchr/testify/mock"
+)
+
+// GNMI_SubscribeServer is an autogenerated mock type for the GNMI_SubscribeServer type
+type GNMI_SubscribeServer struct {
+	mock.Mock
+}
+
+// Context provides a mock function with given fields:
+func (_m *GNMI_SubscribeServer) Context() context.Context {
+	ret := _m.Called()
+
+	var r0 context.Context
+	if rf, ok := ret.Get(0).(func() context.Context); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(context.Context)
+		}
+	}
+
+	return r0
+}
+
+// Recv provides a mock function with given fields:
+func (_m *GNMI_SubscribeServer) Recv() (*gnmi.SubscribeRequest, error) {
+	ret := _m.Called()
+
+	var r0 *gnmi.SubscribeRequest
+	if rf, ok := ret.Get(0).(func() *gnmi.SubscribeRequest); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*gnmi.SubscribeRequest)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// RecvMsg provides a mock function with given fields: m
+func (_m *GNMI_SubscribeServer) RecvMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Send provides a mock function with given fields: _a0
+func (_m *GNMI_SubscribeServer) Send(_a0 *gnmi.SubscribeResponse) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*gnmi.SubscribeResponse) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SendHeader provides a mock function with given fields: _a0
+func (_m *GNMI_SubscribeServer) SendHeader(_a0 metadata.MD) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(metadata.MD) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SendMsg provides a mock function with given fields: m
+func (_m *GNMI_SubscribeServer) SendMsg(m interface{}) error {
+	ret := _m.Called(m)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(m)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SetHeader provides a mock function with given fields: _a0
+func (_m *GNMI_SubscribeServer) SetHeader(_a0 metadata.MD) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(metadata.MD) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// SetTrailer provides a mock function with given fields: _a0
+func (_m *GNMI_SubscribeServer) SetTrailer(_a0 metadata.MD) {
+	_m.Called(_a0)
+}
diff --git a/mocks/JSONUnmarshaler.go b/mocks/JSONUnmarshaler.go
new file mode 100644
index 0000000000000000000000000000000000000000..15dd0529058297459efe0de40d6264846bb03586
--- /dev/null
+++ b/mocks/JSONUnmarshaler.go
@@ -0,0 +1,36 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	ygot "github.com/openconfig/ygot/ygot"
+	mock "github.com/stretchr/testify/mock"
+
+	ytypes "github.com/openconfig/ygot/ytypes"
+)
+
+// JSONUnmarshaler is an autogenerated mock type for the JSONUnmarshaler type
+type JSONUnmarshaler struct {
+	mock.Mock
+}
+
+// Execute provides a mock function with given fields: _a0, _a1, _a2
+func (_m *JSONUnmarshaler) Execute(_a0 []byte, _a1 ygot.GoStruct, _a2 ...ytypes.UnmarshalOpt) error {
+	_va := make([]interface{}, len(_a2))
+	for _i := range _a2 {
+		_va[_i] = _a2[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, _a0, _a1)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func([]byte, ygot.GoStruct, ...ytypes.UnmarshalOpt) error); ok {
+		r0 = rf(_a0, _a1, _a2...)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
diff --git a/mocks/PrincipalNetworkDomain.go b/mocks/PrincipalNetworkDomain.go
new file mode 100644
index 0000000000000000000000000000000000000000..38233e76794d9913cf722aa848b2409fe4e1e499
--- /dev/null
+++ b/mocks/PrincipalNetworkDomain.go
@@ -0,0 +1,207 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+)
+
+// PrincipalNetworkDomain is an autogenerated mock type for the PrincipalNetworkDomain type
+type PrincipalNetworkDomain struct {
+	mock.Mock
+}
+
+// AddDevice provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) AddDevice(_a0 interface{}) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// AddSbi provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) AddSbi(_a0 interface{}) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// ContainsDevice provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) ContainsDevice(_a0 uuid.UUID) bool {
+	ret := _m.Called(_a0)
+
+	var r0 bool
+	if rf, ok := ret.Get(0).(func(uuid.UUID) bool); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Get(0).(bool)
+	}
+
+	return r0
+}
+
+// Destroy provides a mock function with given fields:
+func (_m *PrincipalNetworkDomain) Destroy() error {
+	ret := _m.Called()
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func() error); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// GetDescription provides a mock function with given fields:
+func (_m *PrincipalNetworkDomain) GetDescription() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// GetName provides a mock function with given fields:
+func (_m *PrincipalNetworkDomain) GetName() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// GetSBIs provides a mock function with given fields:
+func (_m *PrincipalNetworkDomain) GetSBIs() interface{} {
+	ret := _m.Called()
+
+	var r0 interface{}
+	if rf, ok := ret.Get(0).(func() interface{}); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(interface{})
+		}
+	}
+
+	return r0
+}
+
+// Id provides a mock function with given fields:
+func (_m *PrincipalNetworkDomain) ID() uuid.UUID {
+	ret := _m.Called()
+
+	var r0 uuid.UUID
+	if rf, ok := ret.Get(0).(func() uuid.UUID); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(uuid.UUID)
+		}
+	}
+
+	return r0
+}
+
+// MarshalDevice provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) MarshalDevice(_a0 uuid.UUID) (string, error) {
+	ret := _m.Called(_a0)
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func(uuid.UUID) string); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(uuid.UUID) error); ok {
+		r1 = rf(_a0)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// RemoveDevice provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) RemoveDevice(_a0 uuid.UUID) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(uuid.UUID) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// RemoveSbi provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) RemoveSbi(_a0 uuid.UUID) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(uuid.UUID) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Request provides a mock function with given fields: _a0, _a1
+func (_m *PrincipalNetworkDomain) Request(_a0 uuid.UUID, _a1 string) error {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(uuid.UUID, string) error); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// RequestAll provides a mock function with given fields: _a0
+func (_m *PrincipalNetworkDomain) RequestAll(_a0 string) error {
+	ret := _m.Called(_a0)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(string) error); ok {
+		r0 = rf(_a0)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
diff --git a/mocks/PublishFunc.go b/mocks/PublishFunc.go
new file mode 100644
index 0000000000000000000000000000000000000000..9bafd22090b46cd8a0b9d9aedcb5d502b340911b
--- /dev/null
+++ b/mocks/PublishFunc.go
@@ -0,0 +1,18 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	mock "github.com/stretchr/testify/mock"
+	protoiface "google.golang.org/protobuf/runtime/protoiface"
+)
+
+// PublishFunc is an autogenerated mock type for the PublishFunc type
+type PublishFunc struct {
+	mock.Mock
+}
+
+// Execute provides a mock function with given fields: addr, message
+func (_m *PublishFunc) Execute(addr string, message protoiface.MessageV1) {
+	_m.Called(addr, message)
+}
diff --git a/mocks/SBIGreeter.go b/mocks/SBIGreeter.go
new file mode 100644
index 0000000000000000000000000000000000000000..7b7c999166b64bdf711da1b7ddb8e5801e9330fc
--- /dev/null
+++ b/mocks/SBIGreeter.go
@@ -0,0 +1,15 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// SBIGreeter is an autogenerated mock type for the SBIGreeter type
+type SBIGreeter struct {
+	mock.Mock
+}
+
+// SBIHello provides a mock function with given fields:
+func (_m *SBIGreeter) SBIHello() {
+	_m.Called()
+}
diff --git a/mocks/SouthboundInterface.go b/mocks/SouthboundInterface.go
new file mode 100644
index 0000000000000000000000000000000000000000..6217f5a7674db004f64254bfe5d5c8348ac733a7
--- /dev/null
+++ b/mocks/SouthboundInterface.go
@@ -0,0 +1,81 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	gnmi "github.com/openconfig/gnmi/proto/gnmi"
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+
+	yang "github.com/openconfig/goyang/pkg/yang"
+
+	ytypes "github.com/openconfig/ygot/ytypes"
+)
+
+// SouthboundInterface is an autogenerated mock type for the SouthboundInterface type
+type SouthboundInterface struct {
+	mock.Mock
+}
+
+// Id provides a mock function with given fields:
+func (_m *SouthboundInterface) ID() uuid.UUID {
+	ret := _m.Called()
+
+	var r0 uuid.UUID
+	if rf, ok := ret.Get(0).(func() uuid.UUID); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(uuid.UUID)
+		}
+	}
+
+	return r0
+}
+
+// SbiIdentifier provides a mock function with given fields:
+func (_m *SouthboundInterface) SbiIdentifier() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// Schema provides a mock function with given fields:
+func (_m *SouthboundInterface) Schema() *ytypes.Schema {
+	ret := _m.Called()
+
+	var r0 *ytypes.Schema
+	if rf, ok := ret.Get(0).(func() *ytypes.Schema); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*ytypes.Schema)
+		}
+	}
+
+	return r0
+}
+
+// SetNode provides a mock function with given fields:
+func (_m *SouthboundInterface) SetNode() func(*yang.Entry, interface{}, *gnmi.Path, interface{}, []ytypes.SetNodeOpt) error {
+	ret := _m.Called()
+
+	var r0 func(*yang.Entry, interface{}, *gnmi.Path, interface{}, []ytypes.SetNodeOpt) error
+	if rf, ok := ret.Get(0).(func() func(*yang.Entry, interface{}, *gnmi.Path, interface{}, []ytypes.SetNodeOpt) error); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(func(*yang.Entry, interface{}, *gnmi.Path, interface{}, []ytypes.SetNodeOpt) error)
+		}
+	}
+
+	return r0
+}
diff --git a/mocks/Storable.go b/mocks/Storable.go
new file mode 100644
index 0000000000000000000000000000000000000000..630f70145d05ec4878461e243d238fe59958a483
--- /dev/null
+++ b/mocks/Storable.go
@@ -0,0 +1,30 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	mock "github.com/stretchr/testify/mock"
+
+	uuid "github.com/google/uuid"
+)
+
+// Storable is an autogenerated mock type for the Storable type
+type Storable struct {
+	mock.Mock
+}
+
+// Id provides a mock function with given fields:
+func (_m *Storable) ID() uuid.UUID {
+	ret := _m.Called()
+
+	var r0 uuid.UUID
+	if rf, ok := ret.Get(0).(func() uuid.UUID); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(uuid.UUID)
+		}
+	}
+
+	return r0
+}
diff --git a/mocks/Transport.go b/mocks/Transport.go
new file mode 100644
index 0000000000000000000000000000000000000000..6dc256acae1ee730623be6ab1fd5508f9f4ed9f5
--- /dev/null
+++ b/mocks/Transport.go
@@ -0,0 +1,137 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	mock "github.com/stretchr/testify/mock"
+
+	ytypes "github.com/openconfig/ygot/ytypes"
+)
+
+// Transport is an autogenerated mock type for the Transport type
+type Transport struct {
+	mock.Mock
+}
+
+// Get provides a mock function with given fields: ctx, params
+func (_m *Transport) Get(ctx context.Context, params ...string) (interface{}, error) {
+	_va := make([]interface{}, len(params))
+	for _i := range params {
+		_va[_i] = params[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 interface{}
+	if rf, ok := ret.Get(0).(func(context.Context, ...string) interface{}); ok {
+		r0 = rf(ctx, params...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(interface{})
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, ...string) error); ok {
+		r1 = rf(ctx, params...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetOptions provides a mock function with given fields:
+func (_m *Transport) GetOptions() interface{} {
+	ret := _m.Called()
+
+	var r0 interface{}
+	if rf, ok := ret.Get(0).(func() interface{}); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(interface{})
+		}
+	}
+
+	return r0
+}
+
+// ProcessResponse provides a mock function with given fields: resp, root, models
+func (_m *Transport) ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error {
+	ret := _m.Called(resp, root, models)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(interface{}, interface{}, *ytypes.Schema) error); ok {
+		r0 = rf(resp, root, models)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Set provides a mock function with given fields: ctx, params
+func (_m *Transport) Set(ctx context.Context, params ...interface{}) (interface{}, error) {
+	var _ca []interface{}
+	_ca = append(_ca, ctx)
+	_ca = append(_ca, params...)
+	ret := _m.Called(_ca...)
+
+	var r0 interface{}
+	if rf, ok := ret.Get(0).(func(context.Context, ...interface{}) interface{}); ok {
+		r0 = rf(ctx, params...)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(interface{})
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, ...interface{}) error); ok {
+		r1 = rf(ctx, params...)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Subscribe provides a mock function with given fields: ctx, params
+func (_m *Transport) Subscribe(ctx context.Context, params ...string) error {
+	_va := make([]interface{}, len(params))
+	for _i := range params {
+		_va[_i] = params[_i]
+	}
+	var _ca []interface{}
+	_ca = append(_ca, ctx)
+	_ca = append(_ca, _va...)
+	ret := _m.Called(_ca...)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, ...string) error); ok {
+		r0 = rf(ctx, params...)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Type provides a mock function with given fields:
+func (_m *Transport) Type() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
diff --git a/mocks/TransportOptions.go b/mocks/TransportOptions.go
new file mode 100644
index 0000000000000000000000000000000000000000..4893655f8a5bc0fef06e4898e116fc3df7171421
--- /dev/null
+++ b/mocks/TransportOptions.go
@@ -0,0 +1,57 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// TransportOptions is an autogenerated mock type for the TransportOptions type
+type TransportOptions struct {
+	mock.Mock
+}
+
+// GetAddress provides a mock function with given fields:
+func (_m *TransportOptions) GetAddress() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// GetPassword provides a mock function with given fields:
+func (_m *TransportOptions) GetPassword() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// GetUsername provides a mock function with given fields:
+func (_m *TransportOptions) GetUsername() string {
+	ret := _m.Called()
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func() string); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// IsTransportOption provides a mock function with given fields:
+func (_m *TransportOptions) IsTransportOption() {
+	_m.Called()
+}
diff --git a/mocks/isSubscribeRequest_Request.go b/mocks/isSubscribeRequest_Request.go
new file mode 100644
index 0000000000000000000000000000000000000000..73f763981ed7bd4586787e88694c844885b2b843
--- /dev/null
+++ b/mocks/isSubscribeRequest_Request.go
@@ -0,0 +1,15 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// isSubscribeRequest_Request is an autogenerated mock type for the isSubscribeRequest_Request type
+type isSubscribeRequest_Request struct {
+	mock.Mock
+}
+
+// isSubscribeRequest_Request provides a mock function with given fields:
+func (_m *isSubscribeRequest_Request) isSubscribeRequest_Request() {
+	_m.Called()
+}
diff --git a/mocks/isSubscribeResponse_Response.go b/mocks/isSubscribeResponse_Response.go
new file mode 100644
index 0000000000000000000000000000000000000000..ba10966e2703113f5fc03233883022efb7843b4b
--- /dev/null
+++ b/mocks/isSubscribeResponse_Response.go
@@ -0,0 +1,15 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// isSubscribeResponse_Response is an autogenerated mock type for the isSubscribeResponse_Response type
+type isSubscribeResponse_Response struct {
+	mock.Mock
+}
+
+// isSubscribeResponse_Response provides a mock function with given fields:
+func (_m *isSubscribeResponse_Response) isSubscribeResponse_Response() {
+	_m.Called()
+}
diff --git a/mocks/isTypedValue_Value.go b/mocks/isTypedValue_Value.go
new file mode 100644
index 0000000000000000000000000000000000000000..a49fc787f9dbe7f24023258d180371a5bcd42c7b
--- /dev/null
+++ b/mocks/isTypedValue_Value.go
@@ -0,0 +1,15 @@
+// Code generated by mockery v2.6.0. DO NOT EDIT.
+
+package mocks
+
+import mock "github.com/stretchr/testify/mock"
+
+// isTypedValue_Value is an autogenerated mock type for the isTypedValue_Value type
+type isTypedValue_Value struct {
+	mock.Mock
+}
+
+// isTypedValue_Value provides a mock function with given fields:
+func (_m *isTypedValue_Value) isTypedValue_Value() {
+	_m.Called()
+}
diff --git a/nucleus/cli-handling.go b/nucleus/cli-handling.go
deleted file mode 100644
index 9c5886980801ba10d37d52ae46f7b90bfdad1575..0000000000000000000000000000000000000000
--- a/nucleus/cli-handling.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-	This file contains the grpc cli server-side calls.
-    Functions here should call other functions in charge of the
-	particular task.
-*/
-
-package nucleus
-
-import (
-	pb "code.fbi.h-da.de/cocsn/gosdn/cliInterface"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/client/ciena"
-	"context"
-	"google.golang.org/grpc"
-	"net"
-)
-
-// server is used to implement the grcp cli server
-type server struct {
-	pb.UnimplementedGrpcCliServer
-	core *Core
-}
-
-func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
-	log.Info("Received: ", in.GetName())
-	return &pb.HelloReply{Message: "Hello " + in.GetName(), GoSDNInfo: "goSDN in version: DEVELOP"}, nil
-}
-
-func (s *server) Shutdown(ctx context.Context, in *pb.ShutdownRequest) (*pb.ShutdownReply, error) {
-	log.Info("Shutdown Received: ", in.GetName())
-	s.core.IsRunning <- false
-	return &pb.ShutdownReply{Message: "Shutdown " + in.GetName()}, nil
-}
-
-func getCLIGoing(core *Core) {
-	log.Info("Starting: GetCLIGoing")
-	// Boot-up the control interface for the cli
-	cliControlListener, err := net.Listen("tcp", core.config.CliSocket)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	cliControlServer := grpc.NewServer()
-
-	pb.RegisterGrpcCliServer(cliControlServer, &server{core: core})
-	if err := cliControlServer.Serve(cliControlListener); err != nil {
-		log.Fatal(err)
-	}
-	log.Info("Started: GetCLIGoing")
-}
-
-// SBI specific calls, by now TAPI only
-func (s *server) TAPIGetEdge(ctx context.Context, in *pb.TAPIRequest) (*pb.TAPIReply, error) {
-	log.Info("Received: ", in.GetName())
-	if err := s.core.clients["ciena-mcp"].(*ciena.MCPClient).GetNodes(); err != nil {
-		log.Error(err)
-		return &pb.TAPIReply{Message: "TAPI error"}, nil
-	}
-	return &pb.TAPIReply{Message: "Done"}, nil
-}
-
-func (s *server) TAPIGetEdgeNode(ctx context.Context, in *pb.TAPIRequest) (*pb.TAPIReply, error) {
-	log.Info("Received: ", in.GetName())
-	if err := s.core.clients["ciena-mcp"].(*ciena.MCPClient).GetNodeEdgePoints(); err != nil {
-		log.Error(err)
-		return &pb.TAPIReply{Message: "TAPI error"}, nil
-	}
-	return &pb.TAPIReply{Message: "Done"}, nil
-}
-
-func (s *server) TAPIGetLink(ctx context.Context, in *pb.TAPIRequest) (*pb.TAPIReply, error) {
-	log.Info("Received: ", in.GetName())
-	if err := s.core.clients["ciena-mcp"].(*ciena.MCPClient).GetLinks(); err != nil {
-		log.Error(err)
-		return &pb.TAPIReply{Message: "TAPI error"}, nil
-	}
-	return &pb.TAPIReply{Message: "Done"}, nil
-}
diff --git a/nucleus/clientConfig.go b/nucleus/clientConfig.go
new file mode 100644
index 0000000000000000000000000000000000000000..c88b951fc03fcb5be59a0fad54fa44aab749bbe5
--- /dev/null
+++ b/nucleus/clientConfig.go
@@ -0,0 +1,13 @@
+package nucleus
+
+// ClientConfig contains SBI client
+// configuration parameters
+// Deprecated in favor of spf viper
+type ClientConfig struct {
+	Identifier           string `toml:"identifier"`
+	Endpoint             string `toml:"endpoint"`
+	Username             string `toml:"username"`
+	Password             string `toml:"password"`
+	GjsonDefaultPath     string `toml:"gjsonDefaultPath"`
+	GjsonConnectionsPath string `toml:"gjsonConnectionsPath"`
+}
diff --git a/nucleus/controller.go b/nucleus/controller.go
index f5f0997efec9bb4272b25f7cf4475e0bdbc06f7c..4e96a290b394a596dd2568b73305f1f7a27f7dc8 100644
--- a/nucleus/controller.go
+++ b/nucleus/controller.go
@@ -2,108 +2,104 @@ package nucleus
 
 import (
 	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/client/ciena"
-	"github.com/BurntSushi/toml"
+	"context"
+	"github.com/google/uuid"
+	log "github.com/sirupsen/logrus"
+	"net/http"
 	"os"
+	"os/signal"
+	"sync"
+	"time"
 )
 
-type controllerConfig struct {
-	CliSocket        string
-	DatabaseSocket   string
-	DatabaseUser     string
-	DatabasePassword string
-	DatabaseCrypto   bool
-	ConfigPath       string
-}
-
-type clientConfigs struct {
-	Client []interfaces.ClientConfig `toml:"client"`
-}
+var coreLock sync.RWMutex
+var coreOnce sync.Once
 
 // Core is the representation of the controllers core
 type Core struct {
-	//Assert type with clients[key].(*MCPClient)
-	clients   map[string]interfaces.Client
-	database  database.Database
-	config    controllerConfig
-	IsRunning chan bool
+	// deprecated
+	database database.Database
+
+	pndc       pndStore
+	sbic       sbiStore
+	httpServer *http.Server
+	stopChan   chan os.Signal
 }
 
-//Init does start-up housekeeping like reading controller and client config files
-func (c *Core) Init(socket, configFileController, configFileClient string, IsRunningChannel chan bool) {
-	if err := c.readControllerConfig(configFileController); err != nil {
-		log.Fatal(err)
-	}
+var c *Core
 
-	if socket != "localhost:55055" {
-		c.config.CliSocket = socket
+func init() {
+	c = &Core{
+		database: database.Database{},
+		pndc:     pndStore{store{}},
+		sbic:     sbiStore{store{}},
+		stopChan: make(chan os.Signal, 1),
 	}
 
-	c.AttachDatabase()
-
-	c.IsRunning = IsRunningChannel
+	// Setting up signal capturing
+	signal.Notify(c.stopChan, os.Interrupt)
+}
 
-	if err := c.readClientConfig(configFileClient); err != nil {
-		log.Fatal(err)
+// initialize does start-up housekeeping like reading controller config files
+func initialize() error {
+	if err := createSouthboundInterfaces(); err != nil {
+		return err
 	}
-}
 
-// AttachDatabase connects to the database and passes the connectio to the controller core
-func (c *Core) AttachDatabase() {
-	c.database = database.NewDatabaseClient(c.config.DatabaseSocket, c.config.DatabaseUser, c.config.DatabasePassword, c.config.DatabaseCrypto)
+	// TODO: Start grpc listener here
+	coreLock.Lock()
+	defer coreLock.Unlock()
+	return httpAPI()
 }
 
-// Shutdown waits for the shutdown signal and gracefully shuts down once it arrived
-func (c *Core) Shutdown() {
-	<-c.IsRunning
-	log.Info("Received shutdown signal. Shutting down")
-
-	f, err := os.Create(c.config.ConfigPath)
-	if err != nil {
-		log.Fatal(err)
-	}
-	enc := toml.NewEncoder(f)
-	if err := enc.Encode(c.config); err != nil {
-		log.Fatal(err)
+// createSouthboundInterfaces initializes the controller with its supported SBIs
+func createSouthboundInterfaces() error {
+	sbi := &OpenConfig{id: uuid.New()}
+	if err := c.sbic.add(sbi); err != nil {
+		return err
 	}
-	log.Info("Shutdown complete")
-	os.Exit(0)
+	return createPrincipalNetworkDomain(sbi)
 }
 
-func (c *Core) readControllerConfig(configFileController string) error {
-	if configFileController == "" {
-		configFileController = "gosdn.toml"
-	}
-	if _, err := os.Stat(configFileController); err != nil {
+// createPrincipalNetworkDomain initializes the controller with an initial PND
+func createPrincipalNetworkDomain(sbi SouthboundInterface) error {
+	pnd, err := NewPND("base", "gosdn base pnd", uuid.New(), sbi)
+	if err != nil {
 		return err
 	}
-
-	c.config = controllerConfig{}
-	if _, err := toml.DecodeFile(configFileController, &c.config); err != nil {
+	err = c.pndc.add(pnd)
+	if err != nil {
 		return err
 	}
-
-	if c.config.ConfigPath == "" {
-		c.config.ConfigPath = configFileController
-	}
 	return nil
 }
 
-func (c *Core) readClientConfig(configFileClient string) error {
-	if configFileClient == "" {
-		configFileClient = "clients.toml"
+// Run calls initialize to start the controller
+func Run(ctx context.Context) error {
+	var initError error
+	coreOnce.Do(func() {
+		initError = initialize()
+	})
+	if initError != nil {
+		log.WithFields(log.Fields{}).Error(initError)
+		return initError
 	}
-	if _, err := os.Stat(configFileClient); err != nil {
-		return err
+	log.WithFields(log.Fields{}).Info("initialisation finished")
+	for {
+		select {
+		case <-c.stopChan:
+			return shutdown()
+		case <-ctx.Done():
+			return shutdown()
+		case <-time.Tick(time.Minute):
+			log.Debug("up and running")
+		}
 	}
-	clients := clientConfigs{}
-	if _, err := toml.DecodeFile(configFileClient, &clients); err != nil {
-		return err
-	}
-	for _, client := range clients.Client {
-		c.clients[client.Identifier] = ciena.NewMCPClient(client.Endpoint, client.Username, client.Password, &c.database, &client)
-	}
-	return nil
+}
+
+func shutdown() error {
+	log.Info("shutting down controller")
+	coreLock.Lock()
+	defer coreLock.Unlock()
+	return stopHttpServer()
 }
diff --git a/nucleus/controller_test.go b/nucleus/controller_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..b04349038c6687b9349e518c7947b17eaed82659
--- /dev/null
+++ b/nucleus/controller_test.go
@@ -0,0 +1,71 @@
+package nucleus
+
+import (
+	"context"
+	"net/http"
+	"reflect"
+	"testing"
+	"time"
+)
+
+func TestRun(t *testing.T) {
+	type args struct {
+		request string
+	}
+	tests := []struct {
+		name string
+		args args
+		want interface{}
+	}{
+		{
+			name: "liveliness indicator",
+			args: args{request: apiEndpoint + "/livez"},
+			want: http.StatusOK,
+		},
+		{
+			name: "readyness indicator",
+			args: args{request: apiEndpoint + "/readyz"},
+			want: http.StatusOK,
+		},
+		{
+			name: "init",
+			args: args{request: apiEndpoint + "/api?q=init"},
+			want: http.StatusOK,
+		},
+	}
+	ctx, cancel := context.WithCancel(context.Background())
+	go func() {
+		if err := Run(ctx); err != nil {
+			t.Errorf("Run() error = %v", err)
+		}
+	}()
+	time.Sleep(time.Second)
+	t.Run("Controller Start HTTP API", func(t *testing.T) {
+		got, err := http.Get(tests[0].args.request)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		if !reflect.DeepEqual(got.StatusCode, tests[0].want) {
+			t.Errorf("Run() got: %v, want %v", got.StatusCode, tests[0].want)
+		}
+		got, err = http.Get(tests[0].args.request)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		if !reflect.DeepEqual(got.StatusCode, tests[1].want) {
+			t.Errorf("Run() got: %v, want %v", got.StatusCode, tests[1].want)
+		}
+		got, err = http.Get(tests[0].args.request)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+		if !reflect.DeepEqual(got.StatusCode, tests[2].want) {
+			t.Errorf("Run() got: %v, want %v", got.StatusCode, tests[2].want)
+		}
+	})
+
+	cancel()
+}
diff --git a/nucleus/device.go b/nucleus/device.go
new file mode 100644
index 0000000000000000000000000000000000000000..4318f72420a10e61aa36f1bc7680452e0f640ff9
--- /dev/null
+++ b/nucleus/device.go
@@ -0,0 +1,49 @@
+package nucleus
+
+import (
+	"github.com/google/uuid"
+	"github.com/openconfig/ygot/ygot"
+)
+
+// Device represents an Orchestrated Network Device (OND) which is managed by
+// nucleus
+type Device struct {
+	// UUID represents the Devices UUID
+	UUID uuid.UUID
+
+	// Device inherits properties of ygot.GoStruct
+	ygot.GoStruct
+
+	// SBI is the device's southbound interface implementation
+	SBI SouthboundInterface
+
+	// Transport is the device's Transport implementation
+	Transport Transport
+}
+
+// NewDevice creates a Device
+func NewDevice(sbi SouthboundInterface, opts TransportOptions) (*Device, error) {
+	var transport Transport
+	var err error
+	switch opts.(type) {
+	case *GnmiTransportOptions:
+		transport, err = NewGnmiTransport(opts.(*GnmiTransportOptions))
+		if err != nil {
+			return nil, err
+		}
+	default:
+		return nil, &ErrInvalidTransportOptions{opts}
+
+	}
+	return &Device{
+		UUID:      uuid.New(),
+		GoStruct:  sbi.Schema().Root,
+		SBI:       sbi,
+		Transport: transport,
+	}, nil
+}
+
+// ID returns the UUID of the Device
+func (d *Device) ID() uuid.UUID {
+	return d.UUID
+}
diff --git a/nucleus/device_test.go b/nucleus/device_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..0c6f118ccf4cbdff858f96003e6cf1dff86bc375
--- /dev/null
+++ b/nucleus/device_test.go
@@ -0,0 +1,104 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"github.com/google/uuid"
+	"github.com/openconfig/ygot/ygot"
+	"reflect"
+	"testing"
+)
+
+func TestDevice_Id(t *testing.T) {
+	type fields struct {
+		GoStruct  ygot.GoStruct
+		SBI       SouthboundInterface
+		Transport Transport
+		UUID      uuid.UUID
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   uuid.UUID
+	}{
+		{
+			name: "default",
+			fields: fields{
+				UUID: did,
+			},
+			want: did,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &Device{
+				GoStruct:  tt.fields.GoStruct,
+				SBI:       tt.fields.SBI,
+				Transport: tt.fields.Transport,
+				UUID:      tt.fields.UUID,
+			}
+			if got := d.ID(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("ID() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestNewDevice(t *testing.T) {
+	sbi := &OpenConfig{}
+	type args struct {
+		sbi  SouthboundInterface
+		opts TransportOptions
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *Device
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				sbi: sbi,
+				opts: &GnmiTransportOptions{
+					Config: gnmi.Config{
+						Addr:     "test:///",
+						Username: "test",
+						Password: "test",
+					},
+				},
+			},
+			want: &Device{
+				GoStruct: &openconfig.Device{},
+				SBI:      sbi,
+				UUID:     uuid.New(),
+				Transport: &Gnmi{
+					Options: &GnmiTransportOptions{
+						Config: gnmi.Config{
+							Addr:     "test:///",
+							Username: "test",
+							Password: "test",
+						},
+					},
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := NewDevice(tt.args.sbi, tt.args.opts)
+			if err != nil {
+				t.Error(err)
+			}
+			tt.want.Transport.(*Gnmi).client = got.Transport.(*Gnmi).client
+			tt.want.UUID = got.ID()
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NewDevice() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NewDevice() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/errors.go b/nucleus/errors.go
new file mode 100644
index 0000000000000000000000000000000000000000..8bd01fe67150cba93b9c6f2cb5710ae63383b11c
--- /dev/null
+++ b/nucleus/errors.go
@@ -0,0 +1,92 @@
+package nucleus
+
+import (
+	"fmt"
+	"reflect"
+)
+
+// ErrNilClient implements the Error interface and is called if a GNMI Client is nil.
+type ErrNilClient struct {
+}
+
+func (e *ErrNilClient) Error() string {
+	return fmt.Sprintf("client cannot be nil")
+}
+
+// ErrNil implements the Error interface and is called if a struct is nil.
+type ErrNil struct {
+}
+
+func (e *ErrNil) Error() string {
+	return fmt.Sprintf("struct cannot be nil")
+}
+
+// ErrNotFound implements the Error interface and is called if a specific ID
+// of a storable item could not be found.
+type ErrNotFound struct {
+	id interface{}
+}
+
+func (e *ErrNotFound) Error() string {
+	return fmt.Sprintf("%v not found", e.id)
+}
+
+// ErrAlreadyExists implements the Error interface and is called if a specific ID
+// of a storable item already exists.
+type ErrAlreadyExists struct {
+	item interface{}
+}
+
+func (e *ErrAlreadyExists) Error() string {
+	return fmt.Sprintf("%v already exists", e.item)
+}
+
+// ErrInvalidTypeAssertion implements the Error interface and is called if the
+// type of a storable item does not correspond to the expected type.
+type ErrInvalidTypeAssertion struct {
+	v interface{}
+	t interface{}
+}
+
+func (e ErrInvalidTypeAssertion) Error() string {
+	return fmt.Sprintf("%v does not implement %v", e.v, e.t)
+}
+
+// ErrUnsupportedPath implements the Error interface and is called if the
+// given path is not supported.
+type ErrUnsupportedPath struct {
+	p interface{}
+}
+
+func (e ErrUnsupportedPath) Error() string {
+	return fmt.Sprintf("path %v is not supported", e.p)
+}
+
+// ErrNotYetImplemented implements the Error interface and is called if a function
+// is not implemented yet.
+type ErrNotYetImplemented struct{}
+
+func (e ErrNotYetImplemented) Error() string {
+	return fmt.Sprintf("function not yet implemented")
+}
+
+// ErrInvalidParameters implements the Error interface and is called if the wrong
+// or no parameters have been provided.
+type ErrInvalidParameters struct {
+	f interface{}
+	r interface{}
+}
+
+func (e ErrInvalidParameters) Error() string {
+	return fmt.Sprintf("invalid parameters for %v: %v", e.f, e.r)
+}
+
+// ErrInvalidTransportOptions implements the Error interface and is called if the
+// wrong TransportOptions have been provided.
+type ErrInvalidTransportOptions struct {
+	t interface{}
+}
+
+func (e ErrInvalidTransportOptions) Error() string {
+	return fmt.Sprintf("invalid transport options: %v", reflect.TypeOf(e.t))
+}
diff --git a/nucleus/gnmi_transport.go b/nucleus/gnmi_transport.go
new file mode 100644
index 0000000000000000000000000000000000000000..3bbcc03c6146804d862af1932f5cac2a4a0fca86
--- /dev/null
+++ b/nucleus/gnmi_transport.go
@@ -0,0 +1,299 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"context"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/gnmi/proto/gnmi_ext"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+	"reflect"
+	"strings"
+)
+
+// CtxKeyType is a custom type to be used as key in a context.WithValue() or
+// context.Value() call. For more information see:
+// https://www.calhoun.io/pitfalls-of-context-values-and-how-to-avoid-or-mitigate-them/
+type CtxKeyType string
+
+const (
+	// CtxKeyOpts context key for gnmi.SubscribeOptions
+	CtxKeyOpts CtxKeyType = "opts"
+	// CtxKeyConfig is a context key for gnmi.Config
+	CtxKeyConfig = "config"
+)
+
+// Gnmi implements the Transport interface and provides an SBI with the
+// possibility to access a gNMI endpoint.
+type Gnmi struct {
+	SetNode   func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+	RespChan  chan *gpb.SubscribeResponse
+	Unmarshal func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error
+	Options   *GnmiTransportOptions
+	client    gpb.GNMIClient
+}
+
+// NewGnmiTransport takes a struct of GnmiTransportOptions and returns a Gnmi
+// transport based on the values of it.
+func NewGnmiTransport(opts *GnmiTransportOptions) (*Gnmi, error) {
+	c, err := gnmi.Dial(&opts.Config)
+	if err != nil {
+		return nil, err
+	}
+	log.WithFields(log.Fields{
+		"target":   opts.Addr,
+		"tls":      opts.TLS,
+		"encoding": opts.Encoding,
+	}).Info("building new gNMI transport")
+	return &Gnmi{
+		SetNode:  opts.SetNode,
+		RespChan: opts.RespChan,
+		Options:  opts,
+		client:   c,
+	}, nil
+}
+
+//SetOptions sets Gnmi Options
+func (g *Gnmi) SetOptions(to TransportOptions) {
+	g.Options = to.(*GnmiTransportOptions)
+}
+
+//GetOptions returns the Gnmi options
+func (g *Gnmi) GetOptions() interface{} {
+	return g.Options
+}
+
+// Get takes a slice of gnmi paths, splits them and calls get for each one of them.
+func (g *Gnmi) Get(ctx context.Context, params ...string) (interface{}, error) {
+	if g.client == nil {
+		return nil, &ErrNilClient{}
+	}
+	paths := gnmi.SplitPaths(params)
+	return g.get(ctx, paths, "")
+}
+
+// Set takes a slice of params. This slice must contain at least one operation.
+// It can contain an additional arbitrary amount of operations and extensions.
+func (g *Gnmi) Set(ctx context.Context, args ...interface{}) (interface{}, error) {
+	if g.client == nil {
+		return nil, &ErrNilClient{}
+	}
+	if len(args) == 0 {
+		return nil, &ErrInvalidParameters{
+			f: "gnmi.Set()",
+			r: "no parameters provided",
+		}
+	}
+
+	// Loop over args and create ops and exts
+	// Invalid args cause unhealable error
+	ops := make([]*gnmi.Operation, 0)
+	exts := make([]*gnmi_ext.Extension, 0)
+	for _, p := range args {
+		switch p.(type) {
+		case *gnmi.Operation:
+			op := p.(*gnmi.Operation)
+			if op.Target == "" {
+				op.Target = g.Options.Addr
+			}
+			ops = append(ops, op)
+		case *gnmi_ext.Extension:
+			exts = append(exts, p.(*gnmi_ext.Extension))
+		default:
+			return nil, &ErrInvalidParameters{
+				f: "gnmi.Set()",
+				r: "args contain invalid type",
+			}
+		}
+	}
+	if len(ops) == 0 {
+		return nil, &ErrInvalidParameters{
+			f: "gnmi.Set()",
+			r: "no operations provided",
+		}
+	}
+	return g.set(ctx, ops, exts...)
+}
+
+//Subscribe subscribes to a gNMI target
+func (g *Gnmi) Subscribe(ctx context.Context, params ...string) error {
+	if g.client == nil {
+		return &ErrNilClient{}
+	}
+	return g.subscribe(ctx)
+}
+
+// Type returns the gNMI transport type
+func (g *Gnmi) Type() string {
+	return "gnmi"
+}
+
+// ProcessResponse takes a gNMI response and serializes the contents to the root struct.
+func (g *Gnmi) ProcessResponse(resp interface{}, root interface{}, s *ytypes.Schema) error {
+	models := s.SchemaTree
+	r := resp.(*gpb.GetResponse)
+	rn := r.Notification
+	for _, msg := range rn {
+		for _, update := range msg.Update {
+			path := update.Path
+			fullPath := path
+			val, ok := update.Val.Value.(*gpb.TypedValue_JsonIetfVal)
+			if ok {
+				opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
+				if err := g.Unmarshal(val.JsonIetfVal, extraxtPathElements(fullPath), root, opts...); err != nil {
+					return err
+				}
+				return nil
+			}
+			// TODO(mk): Evaluate hardcoded model key
+			schema := models["Device"]
+			opts := []ytypes.SetNodeOpt{&ytypes.InitMissingElements{}, &ytypes.TolerateJSONInconsistencies{}}
+			if err := g.SetNode(schema, root, update.Path, update.Val, opts...); err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+func extraxtPathElements(path *gpb.Path) []string {
+	elems := make([]string, len(path.Elem))
+	for i, e := range path.Elem {
+		elems[i] = strings.Title(e.Name)
+	}
+	return elems
+}
+
+// Capabilities calls GNMI capabilities
+func (g *Gnmi) Capabilities(ctx context.Context) (interface{}, error) {
+	log.WithFields(log.Fields{
+		"target": g.Options.Addr,
+	}).Info("sending gNMI capabilities request")
+	ctx = gnmi.NewContext(ctx, &g.Options.Config)
+	ctx = context.WithValue(ctx, CtxKeyConfig, &g.Options.Config) //nolint
+	resp, err := g.client.Capabilities(ctx, &gpb.CapabilityRequest{})
+	if err != nil {
+		return nil, err
+	}
+	return resp, nil
+}
+
+// get calls GNMI get
+func (g *Gnmi) get(ctx context.Context, paths [][]string, origin string) (interface{}, error) {
+
+	ctx = gnmi.NewContext(ctx, &g.Options.Config)
+	ctx = context.WithValue(ctx, CtxKeyConfig, &g.Options.Config) //nolint
+	req, err := gnmi.NewGetRequest(ctx, paths, origin)
+	if err != nil {
+		return nil, err
+	}
+	return g.getWithRequest(ctx, req)
+}
+
+// getWithRequest takes a fully formed GetRequest, performs the Get,
+// and returns any response.
+func (g *Gnmi) getWithRequest(ctx context.Context, req *gpb.GetRequest) (interface{}, error) {
+	if req == nil {
+		return nil, &ErrNil{}
+	}
+	log.WithFields(log.Fields{
+		"target": g.Options.Addr,
+		"path":   req.Path,
+	}).Info("sending gNMI get request")
+
+	resp, err := g.client.Get(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp, nil
+}
+
+// Set calls GNMI set
+func (g *Gnmi) set(ctx context.Context, setOps []*gnmi.Operation,
+	exts ...*gnmi_ext.Extension) (*gpb.SetResponse, error) {
+	ctx = gnmi.NewContext(ctx, &g.Options.Config)
+	targets := make([]string, len(setOps))
+	paths := make([][]string, len(setOps))
+	values := make([]string, len(setOps))
+	for i, v := range setOps {
+		targets[i] = v.Target
+		paths[i] = v.Path
+		values[i] = v.Val
+	}
+	log.WithFields(log.Fields{
+		"targets": targets,
+		"paths":   paths,
+		"values":  values,
+	}).Info("sending gNMI set request")
+	return gnmi.Set(ctx, g.client, setOps, exts...)
+}
+
+// Subscribe calls GNMI subscribe
+func (g *Gnmi) subscribe(ctx context.Context) error {
+	ctx = gnmi.NewContext(ctx, &g.Options.Config)
+	opts, ok := ctx.Value(CtxKeyOpts).(*gnmi.SubscribeOptions)
+	if !ok {
+		return &ErrInvalidTypeAssertion{
+			v: reflect.TypeOf(ctx.Value(CtxKeyOpts)),
+			t: reflect.TypeOf(&gnmi.SubscribeOptions{}),
+		}
+	}
+	go func() {
+		log.WithFields(log.Fields{
+			"address":  opts.Target,
+			"paths":    opts.Paths,
+			"mode":     opts.Mode,
+			"interval": opts.SampleInterval,
+		}).Info("subscribed to gNMI target")
+		for {
+			resp := <-g.RespChan
+			if resp != nil {
+				if err := gnmi.LogSubscribeResponse(resp); err != nil {
+					log.Fatal(err)
+				}
+			}
+		}
+	}()
+	return gnmi.SubscribeErr(ctx, g.client, opts, g.RespChan)
+}
+
+// Close calls GNMI close
+func (g *Gnmi) Close() error {
+	return nil
+}
+
+// GnmiTransportOptions implements the TransportOptions interface.
+// GnmiTransportOptions contains all needed information to setup a Gnmi
+// transport and therefore inherits gnmi.Config.
+type GnmiTransportOptions struct {
+	// all needed gnmi transport parameters
+	gnmi.Config
+
+	SetNode func(schema *yang.Entry, root interface{}, path *gpb.Path,
+		val interface{}, opts ...ytypes.SetNodeOpt) error
+	Unmarshal func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error
+	RespChan  chan *gpb.SubscribeResponse
+}
+
+// GetAddress returns the address used by the transport to connect to a
+// gRPC endpoint.
+func (gto *GnmiTransportOptions) GetAddress() string {
+	return gto.Config.Addr
+}
+
+// GetUsername returns the username used by the transport to connect to a
+// gRPC endpoint.
+func (gto *GnmiTransportOptions) GetUsername() string {
+	return gto.Config.Username
+}
+
+// GetPassword returns the password used by the transport to connect to a
+// gRPC endpoint.
+func (gto *GnmiTransportOptions) GetPassword() string {
+	return gto.Config.Password
+}
+
+// IsTransportOption is needed to fulfill the requirements of the
+// TransportOptions interface. It does not need any further implementation.
+func (gto *GnmiTransportOptions) IsTransportOption() {}
diff --git a/nucleus/gnmi_transport_test.go b/nucleus/gnmi_transport_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..38270c8da5fe3f31f030c5010de2b980a8d8d127
--- /dev/null
+++ b/nucleus/gnmi_transport_test.go
@@ -0,0 +1,570 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/mocks"
+	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"context"
+	"errors"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/gnmi/proto/gnmi_ext"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ytypes"
+	"github.com/stretchr/testify/mock"
+	"reflect"
+	"testing"
+)
+
+// testSetupGnmi bootstraps tests for gnmi transport
+func testSetupGnmi() {
+	// TODO: Set sane defaults
+	gnmiConfig = &gnmi.Config{
+		Username: "test",
+		Password: "test",
+		Addr:     "localhost:13371",
+		Encoding: gpb.Encoding_PROTO,
+	}
+
+	startGnmiTarget = make(chan string)
+	stopGnmiTarget = make(chan bool)
+	go targetRunner()
+}
+
+func TestGnmi_Capabilities(t *testing.T) {
+	transport := mockTransport()
+	capabilityResponse := &gpb.CapabilityResponse{
+		SupportedModels:    nil,
+		SupportedEncodings: []gpb.Encoding{gpb.Encoding_PROTO, gpb.Encoding_JSON_IETF, gpb.Encoding_JSON},
+		GNMIVersion:        "0.6.0",
+		Extension:          nil,
+	}
+
+	capabilityRequest := &gpb.CapabilityRequest{}
+
+	transport.client.(*mocks.GNMIClient).
+		On("NewContext", mockContext, mock.Anything).
+		Return(mockContext)
+	transport.client.(*mocks.GNMIClient).
+		On("Capabilities", mockContext, capabilityRequest).
+		Return(capabilityResponse, nil)
+
+	type fields struct {
+		transport *Gnmi
+	}
+	type args struct {
+		endpoint    string
+		runEndpoint bool
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    *gpb.CapabilityResponse
+		wantErr bool
+	}{
+		{
+			name:   "mock",
+			fields: fields{transport: &transport},
+			args: args{
+				endpoint:    gnmiConfig.Addr,
+				runEndpoint: false,
+			},
+			want:    capabilityResponse,
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if tt.args.runEndpoint {
+				startGnmiTarget <- tt.args.endpoint
+			}
+
+			got, err := tt.fields.transport.Capabilities(context.Background())
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Capabilities() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Get() got = %v, want %v", got, tt.want)
+			}
+			if tt.args.runEndpoint {
+				stopGnmiTarget <- true
+			}
+		})
+	}
+}
+
+func TestGnmi_Close(t *testing.T) {
+	type fields struct {
+		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+		RespChan chan *gpb.SubscribeResponse
+		config   *gnmi.Config
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		wantErr bool
+	}{
+		{name: "dummy", fields: fields{}, wantErr: false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g := &Gnmi{
+				SetNode:  tt.fields.SetNode,
+				RespChan: tt.fields.RespChan,
+			}
+			if err := g.Close(); (err != nil) != tt.wantErr {
+				t.Errorf("Close() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestGnmi_Get(t *testing.T) {
+	transport := mockTransport()
+	getRequest := &gpb.GetRequest{
+		Prefix:    nil,
+		Path:      nil,
+		Type:      0,
+		Encoding:  0,
+		UseModels: nil,
+		Extension: nil,
+	}
+
+	getResponse := &gpb.GetResponse{
+		Notification: nil,
+		Error:        nil,
+		Extension:    nil,
+	}
+
+	transport.client.(*mocks.GNMIClient).
+		On("NewContext", mockContext, mock.Anything).
+		Return(mockContext)
+	transport.client.(*mocks.GNMIClient).
+		On("NewGetRequest", mockContext, mock.Anything, mock.Anything).
+		Return(getRequest, nil)
+	transport.client.(*mocks.GNMIClient).
+		On("Get", mockContext, mock.Anything).
+		Return(getResponse, nil)
+
+	type fields struct {
+		transport *Gnmi
+	}
+	type args struct {
+		params      []string
+		runEndpoint bool
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name:   "uninitialised",
+			fields: fields{&Gnmi{}},
+			args: args{
+				params: nil,
+			},
+			want:    nil,
+			wantErr: true,
+		},
+		{
+			name:    "mock",
+			fields:  fields{transport: &transport},
+			args:    args{},
+			want:    getResponse,
+			wantErr: false,
+		},
+		{
+			name:   "endpoint",
+			fields: fields{transport: &transport},
+			args: args{
+				runEndpoint: true,
+			},
+			want:    getResponse,
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if tt.args.runEndpoint {
+				startGnmiTarget <- tt.fields.transport.Options.Addr
+			}
+			got, err := tt.fields.transport.Get(context.Background(), tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Get() got = %v, want %v", got, tt.want)
+			}
+			if tt.args.runEndpoint {
+				stopGnmiTarget <- true
+			}
+		})
+	}
+}
+
+func TestGnmi_ProcessResponse(t *testing.T) {
+	type fields struct {
+		Sbi SouthboundInterface
+	}
+	type args struct {
+		path string
+		root interface{}
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		{
+			name:   "Interfaces Interface",
+			fields: fields{Sbi: &OpenConfig{}},
+			args: args{
+				path: "../test/proto/resp-interfaces-interface-arista-ceos",
+				root: &openconfig.Device{},
+			},
+			wantErr: true,
+		},
+		{
+			name:   "Interfaces Wildcard",
+			fields: fields{Sbi: &OpenConfig{}},
+			args: args{
+				path: "../test/proto/resp-interfaces-wildcard",
+				root: &openconfig.Device{},
+			},
+			wantErr: false,
+		},
+		{
+			name:   "Root",
+			fields: fields{Sbi: &OpenConfig{}},
+			args: args{
+				path: "../test/proto/resp-full-node-arista-ceos",
+				root: &openconfig.Device{},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g := &Gnmi{
+				SetNode:   tt.fields.Sbi.SetNode(),
+				Unmarshal: tt.fields.Sbi.(*OpenConfig).Unmarshal(),
+			}
+			s := tt.fields.Sbi.Schema()
+			resp := gnmiMessages[tt.args.path]
+			if err := g.ProcessResponse(resp, tt.args.root, s); (err != nil) != tt.wantErr {
+				t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestGnmi_Set(t *testing.T) {
+	type fields struct {
+		transport *Gnmi
+	}
+	type args struct {
+		params      []interface{}
+		runEndpoint bool
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name:   "uninitialised",
+			fields: fields{&Gnmi{}},
+			args: args{
+				params: nil,
+			},
+			want:    nil,
+			wantErr: true,
+		},
+		// TODO: Positive test cases
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := tt.fields.transport.Set(context.Background(), tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Set() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestGnmi_Subscribe(t *testing.T) {
+	type fields struct {
+		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+		RespChan chan *gpb.SubscribeResponse
+		config   *gnmi.Config
+	}
+	type args struct {
+		ctx    context.Context
+		params []string
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		{name: "nil client", fields: fields{}, args: args{}, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g := &Gnmi{}
+			if err := g.Subscribe(tt.args.ctx, tt.args.params...); (err != nil) != tt.wantErr {
+				t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestGnmi_Type(t *testing.T) {
+	type fields struct {
+		SetNode  func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+		RespChan chan *gpb.SubscribeResponse
+		config   *gnmi.Config
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   string
+	}{
+		{name: "dummy", fields: fields{}, want: "gnmi"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g := &Gnmi{
+				SetNode:  tt.fields.SetNode,
+				RespChan: tt.fields.RespChan,
+			}
+			if got := g.Type(); got != tt.want {
+				t.Errorf("Type() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestGnmi_getWithRequest(t *testing.T) {
+	transport := mockTransport()
+	reqFullNode := gnmiMessages["../test/proto/req-full-node"].(*gpb.GetRequest)
+	reqInterfacesWildcard := gnmiMessages["../test/proto/req-interfaces-wildcard"].(*gpb.GetRequest)
+	respFullNode := gnmiMessages["../test/proto/resp-full-node"].(*gpb.GetResponse)
+	respInterfacesWildcard := gnmiMessages["../test/proto/resp-interfaces-wildcard"].(*gpb.GetResponse)
+
+	transport.client.(*mocks.GNMIClient).
+		On("Get", mockContext, reqFullNode).
+		Return(respFullNode, nil)
+
+	transport.client.(*mocks.GNMIClient).
+		On("Get", mockContext, reqInterfacesWildcard).
+		Return(respInterfacesWildcard, nil)
+
+	transport.client.(*mocks.GNMIClient).
+		On("Get", mockContext, mock.Anything).
+		Return(nil, errors.New("expected mock gnmi error"))
+
+	type fields struct {
+		transport *Gnmi
+	}
+	type args struct {
+		request     *gpb.GetRequest
+		runEndpoint bool
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name:   "getFullNode",
+			fields: fields{transport: &transport},
+			args: args{
+				request: reqFullNode,
+			},
+			want:    respFullNode,
+			wantErr: false,
+		},
+		{
+			name:   "getInterfacesWildcard",
+			fields: fields{transport: &transport},
+			args: args{
+				request: reqInterfacesWildcard,
+			},
+			want:    respInterfacesWildcard,
+			wantErr: false,
+		},
+		{
+			name:   "invalid request",
+			fields: fields{transport: &transport},
+			args: args{
+				request:     nil,
+				runEndpoint: false,
+			},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := tt.fields.transport.getWithRequest(context.Background(), tt.args.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("getWithRequest() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("getWithRequest() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestNewGnmiTransport(t *testing.T) {
+	type args struct {
+		opts *GnmiTransportOptions
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    *Gnmi
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{opts: &GnmiTransportOptions{
+				Config: gnmi.Config{
+					Username: "test",
+					Password: "test",
+					Addr:     "localhost:13371",
+					Encoding: gpb.Encoding_PROTO,
+				},
+			}},
+			want: &Gnmi{
+				Options: &GnmiTransportOptions{
+					Config: gnmi.Config{
+						Username: "test",
+						Password: "test",
+						Addr:     "localhost:13371",
+						Encoding: gpb.Encoding_PROTO,
+					},
+				},
+				client: nil,
+			},
+			wantErr: false,
+		},
+		{
+			name:    "unsupported compression",
+			args:    args{opts: &GnmiTransportOptions{Config: gnmi.Config{Compression: "brotli"}}},
+			want:    nil,
+			wantErr: true,
+		},
+		{
+			name:    "certificate error no key file",
+			args:    args{opts: &GnmiTransportOptions{Config: gnmi.Config{TLS: true, CertFile: "invalid", KeyFile: ""}}},
+			want:    nil,
+			wantErr: true,
+		},
+		{
+			name:    "certificate error no ca file",
+			args:    args{opts: &GnmiTransportOptions{Config: gnmi.Config{TLS: true, CAFile: "invalid"}}},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if tt.name == "default" {
+				startGnmiTarget <- gnmiConfig.Addr
+			}
+			got, err := NewGnmiTransport(tt.args.opts)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NewGnmiTransport() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if tt.name == "default" && got != nil {
+				tt.want.client = got.client
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NewGnmiTransport() got = %v, want %v", got, tt.want)
+			}
+			if tt.name == "default" {
+				stopGnmiTarget <- true
+			}
+		})
+	}
+}
+
+func TestGnmi_set(t *testing.T) {
+	transport := mockTransport()
+	mockResponse := &gpb.SetResponse{}
+
+	transport.client.(*mocks.GNMIClient).
+		On("NewContext", mockContext, mock.Anything).
+		Return(mockContext)
+
+	transport.client.(*mocks.GNMIClient).
+		On("Set", mockContext, mock.Anything, mock.Anything).
+		Return(mockResponse, nil)
+
+	type fields struct {
+		transport *Gnmi
+	}
+	type args struct {
+		ctx    context.Context
+		setOps []*gnmi.Operation
+		exts   []*gnmi_ext.Extension
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		args   args
+		want   *gpb.SetResponse
+
+		wantErr bool
+	}{
+		{
+			name:   "default",
+			fields: fields{transport: &transport},
+			args: args{
+				ctx: context.Background(),
+				setOps: []*gnmi.Operation{
+					{
+						Type: "update",
+						Path: []string{"interfaces", "interface", "name"},
+						Val:  "test0",
+					},
+				},
+				exts: nil,
+			},
+			want:    &gpb.SetResponse{},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := tt.fields.transport.set(tt.args.ctx, tt.args.setOps, tt.args.exts...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("set() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("set() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/http.go b/nucleus/http.go
new file mode 100644
index 0000000000000000000000000000000000000000..c4419fb7906b1b0d094725cc122db3c47ee12c68
--- /dev/null
+++ b/nucleus/http.go
@@ -0,0 +1,194 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"context"
+	"fmt"
+	"github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	log "github.com/sirupsen/logrus"
+	"net/http"
+	"net/url"
+	"time"
+)
+
+func stopHttpServer() error {
+	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+	defer cancel()
+	log.Info("shutting down http server")
+	return c.httpServer.Shutdown(ctx)
+}
+
+func registerHttpHandler() {
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Println("Recovered in f", r)
+		}
+	}()
+	http.HandleFunc("/api", httpHandler)
+	http.HandleFunc("/livez", healthCheck)
+	http.HandleFunc("/readyz", readynessCheck)
+}
+
+// deprecated
+func httpAPI() error {
+	registerHttpHandler()
+	c.httpServer = &http.Server{Addr: ":8080"}
+	go func() {
+		log.Info(c.httpServer.ListenAndServe())
+	}()
+	return nil
+}
+
+func healthCheck(writer http.ResponseWriter, request *http.Request) {
+	writer.WriteHeader(http.StatusOK)
+}
+
+func readynessCheck(writer http.ResponseWriter, request *http.Request) {
+	writer.WriteHeader(http.StatusOK)
+}
+
+// nolint
+func httpHandler(writer http.ResponseWriter, request *http.Request) {
+	log.WithFields(log.Fields{
+		"request": request,
+	}).Debug("incoming request")
+
+	query, err := url.ParseQuery(request.URL.RawQuery)
+	if err != nil {
+		log.Error(err)
+		writer.WriteHeader(http.StatusBadRequest)
+		return
+	}
+
+	id, err := uuid.Parse(query.Get("uuid"))
+	if err != nil {
+		log.Error(err)
+	}
+
+	pid, err := uuid.Parse(query.Get("pnd"))
+	if err != nil {
+		log.Error(err)
+	}
+
+	sid, err := uuid.Parse(query.Get("sbi"))
+	if err != nil {
+		log.Error(err)
+	}
+
+	var pnd PrincipalNetworkDomain
+	var sbi SouthboundInterface
+	if query.Get("q") != "init" && query.Get("q") != "getIDs" {
+		pnd, err = c.pndc.get(pid)
+		if err != nil {
+			log.Error(err)
+			writer.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+		sbic := pnd.GetSBIs()
+		sbi, err = sbic.(*sbiStore).get(sid)
+		if err != nil {
+			log.WithFields(log.Fields{
+				"requested uuid":  sid,
+				"available uuids": sbic.(*sbiStore).UUIDs(),
+			}).Error(err)
+			writer.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+	}
+
+	switch query.Get("q") {
+	case "addDevice":
+		d, err := NewDevice(sbi, &GnmiTransportOptions{
+			Config: gnmi.Config{
+				Addr:     query.Get("address"),
+				Password: query.Get("password"),
+				Username: query.Get("username"),
+				Encoding: gpb.Encoding_JSON_IETF,
+			},
+			SetNode:   sbi.SetNode(),
+			Unmarshal: sbi.(*OpenConfig).Unmarshal(),
+			RespChan:  make(chan *gpb.SubscribeResponse),
+		})
+		err = pnd.AddDevice(d)
+		if err != nil {
+			writer.WriteHeader(http.StatusInternalServerError)
+			log.Error(err)
+			return
+		}
+		writer.WriteHeader(http.StatusCreated)
+		fmt.Fprintf(writer, "device added\n")
+		fmt.Fprintf(writer, "UUID: %v\n", d.UUID)
+	case "request":
+		err = pnd.Request(id, query.Get("path"))
+		if err != nil {
+			switch err.(type) {
+			case *ErrNotFound:
+				writer.WriteHeader(http.StatusNotFound)
+			default:
+				writer.WriteHeader(http.StatusInternalServerError)
+			}
+			log.Error(err)
+			return
+		}
+		writer.WriteHeader(http.StatusOK)
+	case "requestAll":
+		err = pnd.RequestAll(query.Get("path"))
+		if err != nil {
+			switch err.(type) {
+			case *ErrNotFound:
+				writer.WriteHeader(http.StatusNotFound)
+			default:
+				writer.WriteHeader(http.StatusInternalServerError)
+			}
+			log.Error(err)
+			return
+		}
+		writer.WriteHeader(http.StatusOK)
+	case "getDevice":
+		device, err := pnd.MarshalDevice(id)
+		if err != nil {
+			switch err.(type) {
+			case *ErrNotFound:
+				writer.WriteHeader(http.StatusNotFound)
+			default:
+				writer.WriteHeader(http.StatusInternalServerError)
+			}
+			log.Error(err)
+			return
+		}
+		writer.Header().Set("Content-Type", "application/json")
+		fmt.Fprintf(writer, "%v", device)
+	case "getIDs":
+		writeIDs := func(typ string, ids []uuid.UUID) {
+			fmt.Fprintf(writer, "%v:\n", typ)
+			for i, id := range ids {
+				fmt.Fprintf(writer, "%v: %v\n", i+1, id)
+			}
+		}
+		writeIDs("PNDs", c.pndc.UUIDs())
+		writeIDs("SBIs", c.sbic.UUIDs())
+		if pnd != nil {
+			writeIDs("Devices", pnd.(*pndImplementation).devices.UUIDs())
+		}
+	case "init":
+		writeIDs := func(typ string, ids []uuid.UUID) {
+			for _, id := range ids {
+				fmt.Fprintf(writer, "%v", id)
+			}
+		}
+		writeIDs("PNDs", c.pndc.UUIDs())
+		writeIDs("SBIs", c.sbic.UUIDs())
+	case "set":
+		resp, err := pnd.(*pndImplementation).Set(id, query.Get("path"), query.Get("value"))
+		if err != nil {
+			writer.WriteHeader(http.StatusInternalServerError)
+			log.Error(err)
+			return
+		}
+		writer.WriteHeader(http.StatusOK)
+		fmt.Fprintln(writer, resp)
+	default:
+		writer.WriteHeader(http.StatusBadRequest)
+	}
+}
diff --git a/nucleus/http_test.go b/nucleus/http_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..9efa72110a1fe89cf1507424d147e7faac6fd71b
--- /dev/null
+++ b/nucleus/http_test.go
@@ -0,0 +1,171 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/mocks"
+	"errors"
+	"github.com/google/uuid"
+	log "github.com/sirupsen/logrus"
+	"github.com/stretchr/testify/mock"
+	"net/http"
+	"testing"
+)
+
+func testSetupHTTP() {
+	sbi = &OpenConfig{id: defaultSbiID}
+	sbi.Schema()
+	var err error
+	pnd, err = NewPND("test", "test pnd", defaultPndID, sbi)
+	if err != nil {
+		log.Fatal(err)
+	}
+	d = mockDevice()
+	tr := d.Transport.(*mocks.Transport)
+	mockError := errors.New("mock error")
+	tr.On("Get", mockContext, "/system/config/hostname").Return(mock.Anything, nil)
+	tr.On("Get", mockContext, "error").Return(mock.Anything, mockError)
+	tr.On("Set", mockContext, mock.Anything).Return(mock.Anything, nil)
+	tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(nil)
+	if err := pnd.AddDevice(&d); err != nil {
+		log.Fatal(err)
+	}
+	args = "&uuid=" + mdid.String() + "&pnd=" + defaultPndID.String() + "&sbi=" + defaultSbiID.String()
+	argsNotFound = "&uuid=" + uuid.New().String() + "&pnd=" + defaultPndID.String() + "&sbi=" + defaultSbiID.String()
+	if err := c.sbic.add(sbi); err != nil {
+		log.Fatal(err)
+	}
+	if err := c.pndc.add(pnd); err != nil {
+		log.Fatal(err)
+	}
+}
+
+func Test_httpApi(t *testing.T) {
+	if testing.Short() {
+		t.Skip("this test is executed separately")
+	}
+	tests := []struct {
+		name    string
+		request string
+		want    *http.Response
+		wantErr bool
+	}{
+		{
+			name:    "liveliness indicator",
+			request: apiEndpoint + "/livez",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "readyness indicator",
+			request: apiEndpoint + "/readyz",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "init",
+			request: apiEndpoint + "/api?q=init",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "get-ids",
+			request: apiEndpoint + "/api?q=getIDs",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "add-device",
+			request: apiEndpoint + "/api?q=addDevice" + args,
+			want:    &http.Response{StatusCode: http.StatusCreated},
+			wantErr: false,
+		},
+		{
+			name:    "request",
+			request: apiEndpoint + "/api?q=request" + args + "&path=/system/config/hostname",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "request not found",
+			request: apiEndpoint + "/api?q=request" + argsNotFound + "&path=/system/config/hostname",
+			want:    &http.Response{StatusCode: http.StatusNotFound},
+			wantErr: false,
+		},
+		{
+			name:    "request internal server error",
+			request: apiEndpoint + "/api?q=request" + args + "&path=error",
+			want:    &http.Response{StatusCode: http.StatusInternalServerError},
+			wantErr: false,
+		},
+		{
+			name:    "request-all",
+			request: apiEndpoint + "/api?q=requestAll" + args + "&path=/system/config/hostname",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "request-all internal server error",
+			request: apiEndpoint + "/api?q=requestAll" + args + "&path=error",
+			want:    &http.Response{StatusCode: http.StatusInternalServerError},
+			wantErr: false,
+		},
+
+		{
+			name:    "get-device",
+			request: apiEndpoint + "/api?q=getDevice" + args,
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "get-device not found",
+			request: apiEndpoint + "/api?q=getDevice" + argsNotFound,
+			want:    &http.Response{StatusCode: http.StatusNotFound},
+			wantErr: false,
+		},
+		{
+			name:    "set",
+			request: apiEndpoint + "/api?q=set" + args + "&path=/system/config/hostname&value=ceos3000",
+			want:    &http.Response{StatusCode: http.StatusOK},
+			wantErr: false,
+		},
+		{
+			name:    "internal server errror: wrong pnd",
+			request: apiEndpoint + "/api?pnd=" + uuid.New().String(),
+			want:    &http.Response{StatusCode: http.StatusInternalServerError},
+			wantErr: false,
+		},
+		{
+			name:    "internal server errror: wrong sbi",
+			request: apiEndpoint + "/api?sbi=" + uuid.New().String(),
+			want:    &http.Response{StatusCode: http.StatusInternalServerError},
+			wantErr: false,
+		},
+	}
+	coreLock.Lock()
+	if err := httpAPI(); err != nil {
+		t.Errorf("httpApi() error = %v", err)
+		return
+	}
+	coreLock.Unlock()
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := http.Get(tt.request)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("httpApi() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got.StatusCode != tt.want.StatusCode {
+				t.Errorf("httpApi() got: %v, want %v", got.StatusCode, tt.want.StatusCode)
+			}
+			if tt.name == "add-device" {
+				for k := range pnd.(*pndImplementation).devices.store {
+					if k != mdid {
+						if err := pnd.RemoveDevice(k); err != nil {
+							t.Error(err)
+							return
+						}
+					}
+				}
+			}
+		})
+	}
+}
diff --git a/nucleus/initialise_test.go b/nucleus/initialise_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..6c90b054e44d009e03542821ced09f46cd65bb49
--- /dev/null
+++ b/nucleus/initialise_test.go
@@ -0,0 +1,158 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/mocks"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
+	"code.fbi.h-da.de/cocsn/gosdn/test"
+	"context"
+	"github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	log "github.com/sirupsen/logrus"
+	"github.com/stretchr/testify/mock"
+	pb "google.golang.org/protobuf/proto"
+	"os"
+	"testing"
+)
+
+const apiEndpoint = "http://localhost:8080"
+
+// UUIDs for test cases
+var did uuid.UUID
+var mdid uuid.UUID
+var defaultSbiID uuid.UUID
+var defaultPndID uuid.UUID
+var ocUUID uuid.UUID
+var iid uuid.UUID
+var altIid uuid.UUID
+
+var sbi SouthboundInterface
+var pnd PrincipalNetworkDomain
+var gnmiMessages map[string]pb.Message
+var gnmiConfig *gnmi.Config
+var d Device
+
+var startGnmiTarget chan string
+var stopGnmiTarget chan bool
+var args string
+var argsNotFound string
+
+var mockContext = mock.MatchedBy(func(ctx context.Context) bool { return true })
+
+// TestMain bootstraps all tests. Humongous beast
+// TODO: Move somewhere more sensible
+func TestMain(m *testing.M) {
+	log.SetReportCaller(true)
+
+	if os.Getenv("GOSDN_LOG") == "nolog" {
+		log.SetLevel(log.PanicLevel)
+	}
+
+	gnmiMessages = map[string]pb.Message{
+		"../test/proto/cap-resp-arista-ceos":                  &gpb.CapabilityResponse{},
+		"../test/proto/req-full-node":                         &gpb.GetRequest{},
+		"../test/proto/req-full-node-arista-ceos":             &gpb.GetRequest{},
+		"../test/proto/req-interfaces-arista-ceos":            &gpb.GetRequest{},
+		"../test/proto/req-interfaces-interface-arista-ceos":  &gpb.GetRequest{},
+		"../test/proto/req-interfaces-wildcard":               &gpb.GetRequest{},
+		"../test/proto/resp-full-node":                        &gpb.GetResponse{},
+		"../test/proto/resp-full-node-arista-ceos":            &gpb.GetResponse{},
+		"../test/proto/resp-interfaces-arista-ceos":           &gpb.GetResponse{},
+		"../test/proto/resp-interfaces-interface-arista-ceos": &gpb.GetResponse{},
+		"../test/proto/resp-interfaces-wildcard":              &gpb.GetResponse{},
+		"../test/proto/resp-set-system-config-hostname":       &gpb.SetResponse{},
+	}
+	for k, v := range gnmiMessages {
+		if err := proto.Read(k, v); err != nil {
+			log.Fatalf("error parsing %v: %v", k, err)
+		}
+	}
+	readTestUUIDs()
+
+	testSetupGnmi()
+	testSetupHTTP()
+	os.Exit(m.Run())
+}
+
+func targetRunner() {
+	for {
+		addr := <-startGnmiTarget
+		if err := test.GnmiTarget(stopGnmiTarget, addr); err != nil {
+			log.Fatal(err)
+		}
+	}
+}
+
+func mockTransport() Gnmi {
+	return Gnmi{
+		SetNode:  nil,
+		RespChan: make(chan *gpb.SubscribeResponse),
+		Options:  newGnmiTransportOptions(),
+		client:   &mocks.GNMIClient{},
+	}
+}
+
+func newGnmiTransportOptions() *GnmiTransportOptions {
+	return &GnmiTransportOptions{
+		Config: gnmi.Config{
+			Username: "test",
+			Password: "test",
+			Addr:     "localhost:13371",
+			Encoding: gpb.Encoding_PROTO,
+		},
+		SetNode:  nil,
+		RespChan: make(chan *gpb.SubscribeResponse),
+	}
+}
+
+func readTestUUIDs() {
+	var err error
+	did, err = uuid.Parse("4d8246f8-e884-41d6-87f5-c2c784df9e44")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	mdid, err = uuid.Parse("688a264e-5f85-40f8-bd13-afc42fcd5c7a")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	defaultSbiID, err = uuid.Parse("b70c8425-68c7-4d4b-bb5e-5586572bd64b")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	defaultPndID, err = uuid.Parse("b4016412-eec5-45a1-aa29-f59915357bad")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	ocUUID, err = uuid.Parse("5e252b70-38f2-4c99-a0bf-1b16af4d7e67")
+	if err != nil {
+		log.Fatal(err)
+	}
+	iid, err = uuid.Parse("8495a8ac-a1e8-418e-b787-10f5878b2690")
+	altIid, err = uuid.Parse("edc5de93-2d15-4586-b2a7-fb1bc770986b")
+	if err != nil {
+		log.Fatal(err)
+	}
+}
+
+func mockDevice() Device {
+	return Device{
+		UUID:      mdid,
+		GoStruct:  nil,
+		SBI:       &OpenConfig{},
+		Transport: &mocks.Transport{},
+	}
+}
+
+func newPnd() pndImplementation {
+	return pndImplementation{
+		name:        "default",
+		description: "default test pnd",
+		sbic:        sbiStore{store{}},
+		devices:     deviceStore{store{}},
+		id:          defaultPndID,
+	}
+}
diff --git a/nucleus/interfaces/client.go b/nucleus/interfaces/client.go
deleted file mode 100644
index 4d0b9e1ceaf68a23f8089fb0703efd219546a217..0000000000000000000000000000000000000000
--- a/nucleus/interfaces/client.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package interfaces
-
-// Client provides an interface for
-// SBI protocol clients
-type Client interface {
-	GetConfig() ClientConfig
-}
diff --git a/nucleus/interfaces/clientConfig.go b/nucleus/interfaces/clientConfig.go
deleted file mode 100644
index 5a2782e10fb6503eabff8db25aec83af35ac1960..0000000000000000000000000000000000000000
--- a/nucleus/interfaces/clientConfig.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package interfaces
-
-// ClientConfig contains SBI client
-// configuration parameters
-type ClientConfig struct {
-	Identifier string `toml:"identifier"`
-	Endpoint   string `toml:"endpoint"`
-	Username   string `toml:"username"`
-	Password   string `toml:"password"`
-}
diff --git a/nucleus/nucleus-core.go b/nucleus/nucleus-core.go
deleted file mode 100644
index 0276a4ad80b52fc325373b7c8e551512e2c098f7..0000000000000000000000000000000000000000
--- a/nucleus/nucleus-core.go
+++ /dev/null
@@ -1,32 +0,0 @@
-package nucleus
-
-import (
-	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
-	"time"
-)
-
-//StartAndRun is used to start the core of the controller and any auxiliary services.
-func StartAndRun(socket, filename string, IsRunningChannel chan bool) {
-	log.Info("This is the network superintendent...")
-	log.Info("Starting my ducks")
-
-	// Init the Core
-	core := Core{
-		clients:  make(map[string]interfaces.Client),
-		database: database.Database{},
-	}
-	core.Init(socket, filename, "", IsRunningChannel)
-	// Start the GRCP CLI
-	go getCLIGoing(&core)
-	go core.Shutdown()
-
-	log.Info("and ready for take off")
-
-	//Just to produce some signs of vitality...
-	for {
-		time.Sleep(10 * time.Second)
-		log.Debug("Still alive...")
-	}
-}
diff --git a/nucleus/principalNetworkDomain.go b/nucleus/principalNetworkDomain.go
new file mode 100644
index 0000000000000000000000000000000000000000..ebb372081a3636a2e0629200c9b56822d11981ae
--- /dev/null
+++ b/nucleus/principalNetworkDomain.go
@@ -0,0 +1,213 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"context"
+	log "github.com/sirupsen/logrus"
+
+	"encoding/json"
+	"github.com/google/uuid"
+)
+
+// PrincipalNetworkDomain provides an
+// interface for PND implementations
+type PrincipalNetworkDomain interface {
+	Destroy() error
+	AddSbi(interface{}) error
+	RemoveSbi(uuid.UUID) error
+	AddDevice(interface{}) error
+	RemoveDevice(uuid.UUID) error
+	Request(uuid.UUID, string) error
+	RequestAll(string) error
+	GetName() string
+	GetDescription() string
+	MarshalDevice(uuid.UUID) (string, error)
+	ContainsDevice(uuid.UUID) bool
+	GetSBIs() interface{}
+	ID() uuid.UUID
+}
+
+type pndImplementation struct {
+	name        string
+	description string
+	sbic        sbiStore
+	devices     deviceStore
+	id          uuid.UUID
+}
+
+// NewPND creates a Principle Network Domain
+func NewPND(name, description string, id uuid.UUID, sbi SouthboundInterface) (PrincipalNetworkDomain, error) {
+	pnd := &pndImplementation{
+		name:        name,
+		description: description,
+		sbic:        sbiStore{store{}},
+		devices:     deviceStore{store{}},
+		id:          id,
+	}
+	if err := pnd.sbic.add(sbi); err != nil {
+		return nil, &ErrAlreadyExists{item: sbi}
+	}
+	return pnd, nil
+}
+
+func (pnd *pndImplementation) ID() uuid.UUID {
+	return pnd.id
+}
+
+// GetName returns the name of the PND
+func (pnd *pndImplementation) GetName() string {
+	return pnd.name
+}
+
+// ContainsDevice checks if the given device uuid is registered for this PND
+func (pnd *pndImplementation) ContainsDevice(id uuid.UUID) bool {
+	return pnd.devices.exists(id)
+}
+
+// GetDescription returns the current description of the PND
+func (pnd *pndImplementation) GetDescription() string {
+	return pnd.description
+}
+
+// GetSBIs returns the registered SBIs
+func (pnd *pndImplementation) GetSBIs() interface{} {
+	return &pnd.sbic
+}
+
+// Destroy destroys the PND
+func (pnd *pndImplementation) Destroy() error {
+	return destroy()
+}
+
+// AddSbi adds a SBI to the PND which will be supported
+func (pnd *pndImplementation) AddSbi(sbi interface{}) error {
+	s, ok := sbi.(SouthboundInterface)
+	if !ok {
+		return &ErrInvalidTypeAssertion{
+			v: sbi,
+			t: "Device",
+		}
+	}
+	return pnd.addSbi(s)
+}
+
+// AddSbi removes a SBI from the PND
+// TODO: this should to recursivly through
+// devices and remove the devices using
+// this SBI
+func (pnd *pndImplementation) RemoveSbi(id uuid.UUID) error {
+	return pnd.removeSbi(id)
+}
+
+//AddDevice adds a new device to the PND
+func (pnd *pndImplementation) AddDevice(device interface{}) error {
+	d, ok := device.(*Device)
+	if !ok {
+		return &ErrInvalidTypeAssertion{
+			v: device,
+			t: "Device",
+		}
+	}
+	return pnd.addDevice(d)
+}
+
+// RemoveDevice removes a device from the PND
+func (pnd *pndImplementation) RemoveDevice(uuid uuid.UUID) error {
+	return pnd.removeDevice(uuid)
+}
+
+// Actual implementation, bind to struct if
+// neccessary
+func destroy() error {
+	return nil
+}
+
+func (pnd *pndImplementation) addSbi(sbi SouthboundInterface) error {
+	return pnd.sbic.add(sbi)
+}
+
+func (pnd *pndImplementation) removeSbi(id uuid.UUID) error {
+	return pnd.sbic.delete(id)
+}
+
+func (pnd *pndImplementation) addDevice(device *Device) error {
+	return pnd.devices.add(device)
+}
+
+func (pnd *pndImplementation) getDevice(id uuid.UUID) (*Device, error) {
+	return pnd.devices.get(id)
+}
+
+func (pnd *pndImplementation) removeDevice(id uuid.UUID) error {
+	return pnd.devices.delete(id)
+}
+
+func (pnd *pndImplementation) MarshalDevice(uuid uuid.UUID) (string, error) {
+	d, err := pnd.getDevice(uuid)
+	if err != nil {
+		return "", err
+	}
+	jsonTree, err := json.MarshalIndent(d.GoStruct, "", "\t")
+	if err != nil {
+		return "", err
+	}
+	log.WithFields(log.Fields{
+		"pnd":    pnd.id,
+		"device": uuid,
+	}).Info("marshalled device")
+	return string(jsonTree), nil
+}
+
+// Request sends a get request to a specific device
+func (pnd *pndImplementation) Request(uuid uuid.UUID, path string) error {
+	d, err := pnd.getDevice(uuid)
+	if err != nil {
+		return err
+	}
+	ctx := context.Background()
+	res, err := d.Transport.Get(ctx, path)
+	if err != nil {
+		return err
+	}
+	err = d.Transport.ProcessResponse(res, d.GoStruct, d.SBI.Schema())
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// RequestAll sends a request for all registered devices
+func (pnd *pndImplementation) RequestAll(path string) error {
+	for _, k := range pnd.devices.UUIDs() {
+		if err := pnd.Request(k, path); err != nil {
+			return err
+		}
+	}
+	log.WithFields(log.Fields{
+		"pnd":  pnd.id,
+		"path": path,
+	}).Info("sent request to all devices")
+	return nil
+}
+
+// Set sets the value to the given device path
+// TODO: Design commit/confirm mechanism
+func (pnd *pndImplementation) Set(uuid uuid.UUID, path string, value string) (interface{}, error) {
+	d, err := pnd.getDevice(uuid)
+	if err != nil {
+		return nil, err
+	}
+	ctx := context.Background()
+
+	// TODO: Move to transport dependent func
+	opts := []interface{}{
+		&gnmi.Operation{
+			Type:   "update",
+			Origin: "",
+			Target: "",
+			Path:   gnmi.SplitPath(path),
+			Val:    value,
+		},
+	}
+	return d.Transport.Set(ctx, opts...)
+}
diff --git a/nucleus/principalNetworkDomain_test.go b/nucleus/principalNetworkDomain_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..f02f840bc948d4887983a4beb532808d9e8dc2c7
--- /dev/null
+++ b/nucleus/principalNetworkDomain_test.go
@@ -0,0 +1,524 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/mocks"
+	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"errors"
+	"github.com/google/uuid"
+	"github.com/stretchr/testify/mock"
+	"reflect"
+	"testing"
+)
+
+func TestNewPND(t *testing.T) {
+	pnd := newPnd()
+	if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
+		t.Error(err)
+	}
+	type args struct {
+		name        string
+		description string
+		sbi         SouthboundInterface
+		pid         uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    PrincipalNetworkDomain
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				name:        "default",
+				description: "default test pnd",
+				sbi:         &OpenConfig{id: defaultSbiID},
+				pid:         defaultPndID,
+			},
+			want:    &pnd,
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := NewPND(tt.args.name, tt.args.description, tt.args.pid, tt.args.sbi)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("NewPND() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("NewPND() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_destroy(t *testing.T) {
+	tests := []struct {
+		name    string
+		wantErr bool
+	}{
+		{name: "dummy", wantErr: false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := destroy(); (err != nil) != tt.wantErr {
+				t.Errorf("destroy() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_AddDevice(t *testing.T) {
+	type args struct {
+		device interface{}
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				device: &Device{
+					UUID: did,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "already exists",
+			args: args{
+				device: &Device{
+					UUID: did,
+				},
+			},
+			wantErr: true,
+		},
+		{
+			name: "fails wrong type",
+			args: args{device: &pndImplementation{
+				id: did,
+			}},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if tt.name == "already exists" {
+				pnd.devices.store[did] = &Device{UUID: did}
+			}
+			err := pnd.AddDevice(tt.args.device)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("AddDevice() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if tt.name != "fails wrong type" {
+				if err == nil {
+					_, ok := pnd.devices.store[did]
+					if !ok {
+						t.Errorf("AddDevice() Device %v not in device store %v",
+							tt.args.device, pnd.devices)
+					}
+					if err := pnd.devices.delete(did); err != nil {
+						t.Error(err)
+					}
+				}
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_AddSbi(t *testing.T) {
+	type args struct {
+		sbi interface{}
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				sbi: &OpenConfig{
+					id: defaultSbiID,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "already exists",
+			args: args{
+				sbi: &OpenConfig{
+					id: defaultSbiID,
+				},
+			},
+			wantErr: true,
+		},
+		{
+			name: "fails wrong type",
+			args: args{
+				sbi: &pndImplementation{
+					id: defaultSbiID,
+				},
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if tt.name == "already exists" {
+				pnd.sbic.store[defaultSbiID] = tt.args.sbi.(*OpenConfig)
+			}
+			err := pnd.AddSbi(tt.args.sbi)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("AddSbi() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if tt.name != "fails wrong type" {
+				if err == nil {
+					_, ok := pnd.sbic.store[defaultSbiID]
+					if !ok {
+						t.Errorf("AddSbi() SBI %v not in device store %v",
+							tt.args.sbi, pnd.GetSBIs())
+					}
+					if err := pnd.sbic.delete(defaultSbiID); err != nil {
+						t.Error(err)
+					}
+				}
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_ContainsDevice(t *testing.T) {
+	type args struct {
+		uuid   uuid.UUID
+		device *Device
+	}
+	tests := []struct {
+		name string
+		args args
+		want bool
+	}{
+		{name: "default", args: args{
+			uuid:   did,
+			device: &Device{UUID: did},
+		}, want: true},
+		{name: "fails", args: args{
+			uuid:   uuid.New(),
+			device: &Device{UUID: did},
+		}, want: false},
+		{name: "fails empty", args: args{
+			uuid:   uuid.New(),
+			device: &Device{UUID: did},
+		}, want: false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if tt.name != "fails empty" {
+				if err := pnd.devices.add(tt.args.device); err != nil {
+					t.Error(err)
+				}
+			}
+			if got := pnd.ContainsDevice(tt.args.uuid); got != tt.want {
+				t.Errorf("ContainsDevice() = %v, want %v", got, tt.want)
+			}
+			if err := pnd.devices.delete(did); err != nil && tt.name != "fails empty" {
+				t.Error(err)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_Destroy(t *testing.T) {
+	type fields struct {
+		name        string
+		description string
+		sbi         sbiStore
+		devices     deviceStore
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		wantErr bool
+	}{
+		{name: "dummy", fields: fields{}, wantErr: false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := &pndImplementation{
+				name:        tt.fields.name,
+				description: tt.fields.description,
+				sbic:        tt.fields.sbi,
+				devices:     tt.fields.devices,
+			}
+			if err := pnd.Destroy(); (err != nil) != tt.wantErr {
+				t.Errorf("Destroy() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_GetDescription(t *testing.T) {
+	tests := []struct {
+		name string
+		want string
+	}{
+		{name: "default", want: "default test pnd"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if got := pnd.GetDescription(); got != tt.want {
+				t.Errorf("GetDescription() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_GetName(t *testing.T) {
+	tests := []struct {
+		name string
+		want string
+	}{
+		{name: "default", want: "default"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if got := pnd.GetName(); got != tt.want {
+				t.Errorf("GetName() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_GetSBIs(t *testing.T) {
+	pnd := newPnd()
+	tests := []struct {
+		name string
+		want *sbiStore
+	}{
+		{name: "default", want: &pnd.sbic},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := pnd.GetSBIs(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("GetSBIs() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_MarshalDevice(t *testing.T) {
+	type args struct {
+		uuid uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    string
+		wantErr bool
+	}{
+		{
+			name:    "default",
+			args:    args{did},
+			want:    "{\n\t\"Acl\": null,\n\t\"Bgp\": null,\n\t\"Components\": null,\n\t\"Interfaces\": null,\n\t\"LocalRoutes\": null,\n\t\"Messages\": null,\n\t\"NetworkInstances\": null,\n\t\"RoutingPolicy\": null,\n\t\"System\": null\n}",
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			d := &Device{
+				UUID:      tt.args.uuid,
+				GoStruct:  &openconfig.Device{},
+				SBI:       nil,
+				Transport: nil,
+			}
+			if err := pnd.addDevice(d); err != nil {
+				t.Error(err)
+			}
+			got, err := pnd.MarshalDevice(tt.args.uuid)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("MarshalDevice() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if got != tt.want {
+				t.Errorf("MarshalDevice() got = %v, want %v", got, tt.want)
+			}
+			if err := pnd.devices.delete(did); err != nil {
+				t.Error(err)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_RemoveDevice(t *testing.T) {
+	type args struct {
+		uuid uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{name: "default", args: args{uuid: did}, wantErr: false},
+		{name: "fails", args: args{uuid: uuid.New()}, wantErr: true},
+		{name: "fails empty", args: args{uuid: did}, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := newPnd()
+			if tt.name != "fails empty" {
+				d := &Device{UUID: did}
+				if err := pnd.addDevice(d); err != nil {
+					t.Error(err)
+				}
+			}
+			if err := pnd.RemoveDevice(tt.args.uuid); (err != nil) != tt.wantErr {
+				t.Errorf("RemoveDevice() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if pnd.devices.exists(did) && tt.name == "default" {
+				t.Errorf("RemoveDevice() device still in device store %v", pnd.devices)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_RemoveSbi(t *testing.T) {
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{name: "default", args: args{id: defaultSbiID}, wantErr: false},
+		{name: "fails", args: args{id: uuid.New()}, wantErr: true},
+		{name: "fails empty", args: args{id: defaultSbiID}, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			pnd := &pndImplementation{
+				name:        "test-remove-sbi",
+				description: "test-remove-sbi",
+				sbic:        sbiStore{store{}},
+				devices:     deviceStore{store{}},
+				id:          defaultPndID,
+			}
+			if tt.name != "fails empty" {
+				if err := pnd.addSbi(&OpenConfig{id: defaultSbiID}); err != nil {
+					t.Error(err)
+				}
+			}
+			if err := pnd.RemoveSbi(tt.args.id); (err != nil) != tt.wantErr {
+				t.Errorf("RemoveSbi() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if pnd.sbic.exists(tt.args.id) {
+				t.Errorf("RemoveDevice() SBI still in SBI store %v", pnd.sbic)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_Request(t *testing.T) {
+	type args struct {
+		uuid uuid.UUID
+		path string
+		rErr error
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				uuid: mdid,
+				path: "",
+				rErr: nil,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error",
+			args: args{
+				uuid: did,
+				path: "",
+				rErr: errors.New("deliberate test fail"),
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			deviceWithMockTransport := mockDevice()
+			pnd := newPnd()
+			tr := deviceWithMockTransport.Transport.(*mocks.Transport)
+			tr.On("Get", mockContext, mock.Anything).Return(mock.Anything, tt.args.rErr)
+			tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
+			_ = pnd.addDevice(&deviceWithMockTransport)
+			if err := pnd.Request(tt.args.uuid, tt.args.path); (err != nil) != tt.wantErr {
+				t.Errorf("Request() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if err := pnd.devices.delete(mdid); err != nil {
+				t.Error(err)
+			}
+		})
+	}
+}
+
+func Test_pndImplementation_RequestAll(t *testing.T) {
+	type args struct {
+		uuid uuid.UUID
+		path string
+		rErr error
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				uuid: mdid,
+				path: "",
+				rErr: nil,
+			},
+			wantErr: false,
+		},
+		{
+			name: "error",
+			args: args{
+				uuid: did,
+				path: "",
+				rErr: errors.New("deliberate test fail"),
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			deviceWithMockTransport := mockDevice()
+			pnd := newPnd()
+			tr := deviceWithMockTransport.Transport.(*mocks.Transport)
+			tr.On("Get", mockContext, mock.Anything).Return(mock.Anything, tt.args.rErr)
+			tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(tt.args.rErr)
+			_ = pnd.addDevice(&deviceWithMockTransport)
+			if err := pnd.RequestAll(tt.args.path); (err != nil) != tt.wantErr {
+				t.Errorf("RequestAll() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if err := pnd.devices.delete(mdid); err != nil {
+				t.Error(err)
+			}
+		})
+	}
+}
diff --git a/nucleus/restconf_transport.go b/nucleus/restconf_transport.go
new file mode 100644
index 0000000000000000000000000000000000000000..0dd477196745a83fda3b8460e1c5755b377748a1
--- /dev/null
+++ b/nucleus/restconf_transport.go
@@ -0,0 +1,36 @@
+package nucleus
+
+import (
+	"context"
+	"github.com/openconfig/ygot/ytypes"
+)
+
+// Restconf implements the Transport interface and provides an SBI with the
+// possibility to access a Restconf endpoint.
+type Restconf struct {
+}
+
+//Get not implemented yet
+func (r Restconf) Get(ctx context.Context, params ...string) (interface{}, error) {
+	return nil, &ErrNotYetImplemented{}
+}
+
+//Set not implemented yet
+func (r Restconf) Set(ctx context.Context, params ...string) (interface{}, error) {
+	return nil, &ErrNotYetImplemented{}
+}
+
+// Subscribe not implemented yet
+func (r Restconf) Subscribe(ctx context.Context, params ...string) error {
+	return &ErrNotYetImplemented{}
+}
+
+// Type returns the RESTCONF transport type
+func (r Restconf) Type() string {
+	return "restconf"
+}
+
+// ProcessResponse not implemented yet
+func (r Restconf) ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error {
+	return &ErrNotYetImplemented{}
+}
diff --git a/nucleus/restconf_transport_test.go b/nucleus/restconf_transport_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..5f1eb1e352f2cb8214686c5215eea419c465dcd4
--- /dev/null
+++ b/nucleus/restconf_transport_test.go
@@ -0,0 +1,126 @@
+package nucleus
+
+import (
+	"context"
+	"github.com/openconfig/ygot/ytypes"
+	"reflect"
+	"testing"
+)
+
+func TestRestconf_Get(t *testing.T) {
+	type args struct {
+		ctx    context.Context
+		params []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{name: "not implemented", args: args{}, want: nil, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			r := Restconf{}
+			got, err := r.Get(tt.args.ctx, tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestRestconf_ProcessResponse(t *testing.T) {
+	type args struct {
+		resp   interface{}
+		root   interface{}
+		models *ytypes.Schema
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{name: "not implemented", args: args{}, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			r := Restconf{}
+			if err := r.ProcessResponse(tt.args.resp, tt.args.root, tt.args.models); (err != nil) != tt.wantErr {
+				t.Errorf("ProcessResponse() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestRestconf_Set(t *testing.T) {
+	type args struct {
+		ctx    context.Context
+		params []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{name: "not implemented", args: args{}, want: nil, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			r := Restconf{}
+			got, err := r.Set(tt.args.ctx, tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Set() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestRestconf_Subscribe(t *testing.T) {
+	type args struct {
+		ctx    context.Context
+		params []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{name: "not implemented", args: args{}, wantErr: true},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			r := Restconf{}
+			if err := r.Subscribe(tt.args.ctx, tt.args.params...); (err != nil) != tt.wantErr {
+				t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestRestconf_Type(t *testing.T) {
+	tests := []struct {
+		name string
+		want string
+	}{
+		{name: "not implemented", want: "restconf"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			r := Restconf{}
+			if got := r.Type(); got != tt.want {
+				t.Errorf("Type() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/southbound.go b/nucleus/southbound.go
new file mode 100644
index 0000000000000000000000000000000000000000..831e5a92b3a1501ace46fcd3bbdf0fb2eb5ece70
--- /dev/null
+++ b/nucleus/southbound.go
@@ -0,0 +1,153 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/util"
+	"github.com/openconfig/ygot/ygot"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+	"reflect"
+)
+
+// SouthboundInterface provides an
+// interface for SBI implementations
+type SouthboundInterface interface {
+	// deprecated
+	SbiIdentifier() string
+
+	// SetNode injects SBI specific model
+	// representation to the transport.
+	// Needed for type assertion.
+	SetNode() func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error
+	Schema() *ytypes.Schema
+	ID() uuid.UUID
+}
+
+// Tapi is the implementation of an TAPI SBI.
+type Tapi struct {
+}
+
+// OpenConfig is the implementation of an OpenConfig SBI.
+// The struct holds the YANG schema and a function that
+// returns an SBI specific SetNode function.
+type OpenConfig struct {
+	schema *ytypes.Schema
+	id     uuid.UUID
+}
+
+// SbiIdentifier returns the string representation of
+// the SBI
+// deprecated
+func (oc *OpenConfig) SbiIdentifier() string {
+	return "openconfig"
+}
+
+// Schema returns a ygot generated openconfig Schema as ytypes.Schema
+func (oc *OpenConfig) Schema() *ytypes.Schema {
+	schema, err := openconfig.Schema()
+	oc.schema = schema
+	if err != nil {
+		log.Fatal(err)
+	}
+	return schema
+}
+
+// SetNode injects OpenConfig specific model
+// representation to the transport.
+// Needed for type assertion.
+func (oc *OpenConfig) SetNode() func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error {
+	return func(schema *yang.Entry, root interface{}, path *gpb.Path, val interface{}, opts ...ytypes.SetNodeOpt) error {
+		if err := ytypes.SetNode(schema, root.(*openconfig.Device), path, val, opts...); err != nil {
+			return err
+		}
+		return nil
+	}
+}
+
+// Unmarshal injects OpenConfig specific model
+// representation to the transport.
+// Needed for type assertion.
+func (oc *OpenConfig) Unmarshal() func([]byte, []string, interface{}, ...ytypes.UnmarshalOpt) error {
+	return unmarshal
+}
+
+// unmarshal parses a root or 1st level gNMI response to a go struct
+// Named return to return appropriate recover error
+func unmarshal(bytes []byte, fields []string, goStruct interface{}, opt ...ytypes.UnmarshalOpt) (err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			err = r.(error)
+		}
+	}()
+	switch l := len(fields); l {
+	case 0:
+		return openconfig.Unmarshal(bytes, goStruct.(*openconfig.Device), opt...)
+	case 1:
+	default:
+		return &ErrUnsupportedPath{fields}
+	}
+	var c ygot.GoStruct
+	var field string
+
+	// Load SBI definition
+	d := openconfig.Device{}
+	c, field, err = iter(&d, fields)
+	if err != nil {
+		return
+	}
+	if err = openconfig.Unmarshal(bytes, c, opt...); err != nil {
+		return
+	}
+	reflect.ValueOf(goStruct.(*openconfig.Device)).Elem().FieldByName(field).Set(reflect.ValueOf(c))
+	return nil
+}
+
+// iter walks down the provided paths and initializes the ygot.GoStruct. It only works for
+// the root level. Named returns to return appropriate recover error
+// TODO(mk): Fix deeper layers
+func iter(a ygot.GoStruct, fields []string) (b ygot.GoStruct, f string, err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			err = r.(error)
+		}
+	}()
+	var c ygot.GoStruct
+	var configStruct reflect.Value
+	f = fields[0]
+	s := reflect.ValueOf(a).Elem()
+	h := s.FieldByName(f)
+	configStruct = reflect.New(h.Type())
+
+	// Pointer of field needs to be initialized.
+	// Very convoluted russian doll trick
+	// https://stackoverflow.com/a/57469950/4378176
+	// https://golang.org/src/encoding/json/decode.go?s#L474
+	// TODO(mk): Prettify
+	p2 := configStruct.Elem()
+	// If we have KeyHelperGoStruct we need make and modify map instead of plain struct
+	if p2.Kind() == reflect.Map {
+		p2.Set(reflect.MakeMap(p2.Type()))
+		configStruct.Elem().Set(p2)
+		if err := util.InsertIntoMapStructField(a, f, "", p2); err != nil {
+			panic(err)
+		}
+	} else {
+		configStruct.Elem().Set(reflect.New(p2.Type().Elem()))
+		b = configStruct.Elem().Interface().(ygot.GoStruct)
+	}
+	if len(fields) > 1 {
+		c, _, _ = iter(b, fields[1:])
+	} else {
+		return
+	}
+	reflect.ValueOf(b).Elem().FieldByName(f).Set(reflect.ValueOf(c))
+	return
+}
+
+// ID returns the ID of the OpenConfig SBI
+func (oc *OpenConfig) ID() uuid.UUID {
+	return oc.id
+}
diff --git a/nucleus/southbound_test.go b/nucleus/southbound_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..ab46901446e0cac93464c4aa111436953a51436a
--- /dev/null
+++ b/nucleus/southbound_test.go
@@ -0,0 +1,174 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
+	"code.fbi.h-da.de/cocsn/yang-models/generated/openconfig"
+	"github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/ygot/ytypes"
+	"reflect"
+	"testing"
+)
+
+func TestOpenConfig_Id(t *testing.T) {
+	type fields struct {
+		transport Transport
+		schema    *ytypes.Schema
+		id        uuid.UUID
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   uuid.UUID
+	}{
+		{
+			name: "default",
+			fields: fields{
+				schema: nil,
+				id:     ocUUID,
+			},
+			want: ocUUID,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oc := &OpenConfig{
+				schema: tt.fields.schema,
+				id:     tt.fields.id,
+			}
+			if got := oc.ID(); !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("ID() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestOpenConfig_SbiIdentifier(t *testing.T) {
+	type fields struct {
+		schema *ytypes.Schema
+		id     uuid.UUID
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   string
+	}{
+		{name: "default", fields: fields{}, want: "openconfig"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oc := &OpenConfig{
+				schema: tt.fields.schema,
+				id:     tt.fields.id,
+			}
+			if got := oc.SbiIdentifier(); got != tt.want {
+				t.Errorf("SbiIdentifier() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestOpenConfig_Schema(t *testing.T) {
+	schema, err := openconfig.Schema()
+	if err != nil {
+		t.Error(err)
+	}
+	type fields struct {
+		schema *ytypes.Schema
+		id     uuid.UUID
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		want   *ytypes.Schema
+	}{
+		{name: "default", fields: fields{}, want: schema},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			oc := &OpenConfig{
+				schema: tt.fields.schema,
+				id:     tt.fields.id,
+			}
+			got := oc.Schema().SchemaTree
+			if !reflect.DeepEqual(got, tt.want.SchemaTree) {
+				t.Errorf("Schema() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_unmarshal(t *testing.T) {
+	type args struct {
+		path     string
+		goStruct interface{}
+		opt      []ytypes.UnmarshalOpt
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "fail",
+			args: args{
+				goStruct: &openconfig.Device{},
+				path:     "../test/proto/resp-interfaces-interface-arista-ceos",
+			},
+			wantErr: true,
+		},
+		{
+			name: "root w/opts",
+			args: args{
+				path:     "../test/proto/resp-full-node-arista-ceos",
+				goStruct: &openconfig.Device{},
+				opt:      []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}},
+			},
+			wantErr: false,
+		},
+		{
+			name: "root w/o opts",
+			args: args{
+				path:     "../test/proto/resp-full-node-arista-ceos",
+				goStruct: &openconfig.Device{},
+				opt:      nil,
+			},
+			wantErr: true,
+		},
+		{
+			name: "interfaces w/opts",
+			args: args{
+				path:     "../test/proto/resp-interfaces-arista-ceos",
+				goStruct: &openconfig.Device{},
+				opt:      []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}},
+			},
+			wantErr: false,
+		},
+		{
+			name: "interfaces w/o opts",
+			args: args{
+				path:     "../test/proto/resp-interfaces-arista-ceos",
+				goStruct: &openconfig.Device{},
+				opt:      nil,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			resp := &gpb.GetResponse{}
+			err := proto.Read(tt.args.path, resp)
+			if err != nil {
+				t.Error(err)
+			}
+			fields := extraxtPathElements(resp.Notification[0].Update[0].Path)
+			bytes := resp.Notification[0].Update[0].Val.GetJsonIetfVal()
+			if err := unmarshal(bytes, fields, tt.args.goStruct, tt.args.opt...); (err != nil) != tt.wantErr {
+				t.Errorf("unmarshal() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if tt.args.goStruct.(*openconfig.Device).Interfaces == nil && tt.args.opt != nil {
+				t.Errorf("unmarshal() error: field Interfaces must not be nil")
+			}
+		})
+	}
+}
diff --git a/nucleus/store.go b/nucleus/store.go
new file mode 100644
index 0000000000000000000000000000000000000000..0563a5a30533467809380ac25d949bfc4b578e68
--- /dev/null
+++ b/nucleus/store.go
@@ -0,0 +1,141 @@
+package nucleus
+
+import (
+	"github.com/google/uuid"
+	log "github.com/sirupsen/logrus"
+	"reflect"
+	"sync"
+)
+
+var storeLock sync.RWMutex
+
+// Storable provides an interface for the controller's storage architecture.
+type Storable interface {
+	ID() uuid.UUID
+}
+
+type store map[uuid.UUID]Storable
+
+func (s store) exists(id uuid.UUID) bool {
+	storeLock.RLock()
+	defer storeLock.RUnlock()
+	_, ok := s[id]
+	return ok
+}
+
+func (s store) add(item Storable) error {
+	if s.exists(item.ID()) {
+		return &ErrAlreadyExists{item: item}
+	}
+	storeLock.Lock()
+	s[item.ID()] = item
+	storeLock.Unlock()
+	log.WithFields(log.Fields{
+		"type": reflect.TypeOf(item),
+		"uuid": item.ID(),
+	}).Debug("storable was added")
+	return nil
+}
+
+func (s store) get(id uuid.UUID) (Storable, error) {
+	if !s.exists(id) {
+		return nil, &ErrNotFound{id: id}
+	}
+	log.WithFields(log.Fields{
+		"uuid": id,
+	}).Debug("storable was accessed")
+	storeLock.RLock()
+	defer storeLock.RUnlock()
+	return s[id], nil
+}
+
+func (s store) delete(id uuid.UUID) error {
+	if !s.exists(id) {
+		return &ErrNotFound{id: id}
+	}
+	storeLock.Lock()
+	delete(s, id)
+	storeLock.Unlock()
+	log.WithFields(log.Fields{
+		"uuid": id,
+	}).Debug("storable was deleted")
+	return nil
+}
+
+func (s store) UUIDs() []uuid.UUID {
+	storeLock.RLock()
+	defer storeLock.RUnlock()
+	keys := make([]uuid.UUID, len(s))
+	i := 0
+	for k := range s {
+		keys[i] = k
+		i++
+	}
+	return keys
+}
+
+type sbiStore struct {
+	store
+}
+
+func (s sbiStore) get(id uuid.UUID) (SouthboundInterface, error) {
+	item, err := s.store.get(id)
+	if err != nil {
+		return nil, err
+	}
+	sbi, ok := item.(SouthboundInterface)
+	if !ok {
+		return nil, &ErrInvalidTypeAssertion{
+			v: sbi,
+			t: "SouthboundInterface",
+		}
+	}
+	log.WithFields(log.Fields{
+		"uuid": id,
+	}).Debug("southbound interface was accessed")
+	return sbi, nil
+}
+
+type pndStore struct {
+	store
+}
+
+func (s pndStore) get(id uuid.UUID) (PrincipalNetworkDomain, error) {
+	item, err := s.store.get(id)
+	if err != nil {
+		return nil, err
+	}
+	pnd, ok := item.(PrincipalNetworkDomain)
+	if !ok {
+		return nil, &ErrInvalidTypeAssertion{
+			v: pnd,
+			t: "PrincipalNetworkDomain",
+		}
+	}
+	log.WithFields(log.Fields{
+		"uuid": id,
+	}).Debug("principal network domain was accessed")
+	return pnd, nil
+}
+
+type deviceStore struct {
+	store
+}
+
+func (s deviceStore) get(id uuid.UUID) (*Device, error) {
+	item, err := s.store.get(id)
+	if err != nil {
+		return nil, err
+	}
+	device, ok := item.(*Device)
+	if !ok {
+		return nil, &ErrInvalidTypeAssertion{
+			v: device,
+			t: "Device",
+		}
+	}
+	log.WithFields(log.Fields{
+		"uuid": id,
+	}).Debug("device was accessed")
+	return device, nil
+}
diff --git a/nucleus/store_test.go b/nucleus/store_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..bc9e2ab00f0e1ac4e31ccc5f616b954da6dc2528
--- /dev/null
+++ b/nucleus/store_test.go
@@ -0,0 +1,437 @@
+package nucleus
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/mocks"
+	"github.com/google/uuid"
+	"reflect"
+	"sort"
+	"testing"
+)
+
+func Test_store_add(t *testing.T) {
+	type args struct {
+		item Storable
+	}
+	tests := []struct {
+		name    string
+		s       store
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			s:    store{},
+			args: args{
+				item: &mocks.Storable{},
+			},
+		},
+		{
+			name: "already exists",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args: args{
+				item: &mocks.Storable{},
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			tt.args.item.(*mocks.Storable).On("ID").Return(iid)
+			switch tt.name {
+			case "already exixts":
+				_ = tt.s.add(tt.args.item)
+			default:
+			}
+			if err := tt.s.add(tt.args.item); (err != nil) != tt.wantErr {
+				t.Errorf("add() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func Test_store_delete(t *testing.T) {
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		s       store
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args:    args{id: iid},
+			wantErr: false,
+		},
+		{
+			name:    "not found empty",
+			s:       store{},
+			args:    args{id: iid},
+			wantErr: true,
+		},
+		{
+			name: "not found",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args:    args{id: altIid},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := tt.s.delete(tt.args.id); (err != nil) != tt.wantErr {
+				t.Errorf("delete() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			if tt.name == "default" {
+				item, ok := tt.s[iid]
+				if ok {
+					t.Errorf("delete() item %v still in store %v", item, tt.s)
+				}
+			}
+		})
+	}
+}
+
+func Test_store_exists(t *testing.T) {
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name string
+		s    store
+		args args
+		want bool
+	}{
+		{
+			name: "default",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args: args{id: iid},
+			want: true,
+		},
+		{
+			name: "not found empty",
+			s:    store{},
+			args: args{id: iid},
+			want: false,
+		},
+		{
+			name: "not found",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args: args{id: altIid},
+			want: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := tt.s.exists(tt.args.id); got != tt.want {
+				t.Errorf("exists() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_store_get(t *testing.T) {
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		s       store
+		args    args
+		want    Storable
+		wantErr bool
+	}{
+		{
+			name: "exists",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args:    args{id: iid},
+			want:    &mocks.Storable{},
+			wantErr: false,
+		},
+		{
+			name: "not found",
+			s: store{
+				iid: &mocks.Storable{},
+			},
+			args:    args{id: altIid},
+			want:    nil,
+			wantErr: true,
+		},
+		{
+			name:    "not found empty",
+			s:       store{},
+			args:    args{id: iid},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := tt.s.get(tt.args.id)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_store_UUIDs(t *testing.T) {
+	tests := []struct {
+		name string
+		s    store
+		want []uuid.UUID
+	}{
+		{
+			name: "default",
+			s: store{
+				iid:    &mocks.Storable{},
+				altIid: &mocks.Storable{},
+			},
+			want: []uuid.UUID{iid, altIid},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			sort.Slice(tt.want, func(i, j int) bool {
+				return tt.want[i].String() < tt.want[j].String()
+			})
+			got := tt.s.UUIDs()
+			sort.Slice(got, func(i, j int) bool {
+				return got[i].String() < got[j].String()
+			})
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("UUIDs() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_sbiStore_get(t *testing.T) {
+	type fields struct {
+		store store
+	}
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    SouthboundInterface
+		wantErr bool
+	}{
+		{
+			name: "exists",
+			fields: fields{
+				store: store{
+					defaultSbiID: &OpenConfig{id: defaultSbiID},
+				},
+			},
+			args:    args{id: defaultSbiID},
+			want:    &OpenConfig{id: defaultSbiID},
+			wantErr: false,
+		},
+		{
+			name: "fails",
+			fields: fields{
+				store: store{
+					defaultSbiID: &OpenConfig{id: defaultSbiID},
+				},
+			},
+			args:    args{id: iid},
+			wantErr: true,
+		},
+		{
+			name: "fails empty",
+			fields: fields{
+				store: store{},
+			},
+			args:    args{id: defaultSbiID},
+			wantErr: true,
+		},
+		{
+			name: "fails wrong type",
+			fields: fields{
+				store: store{
+					did: &Device{
+						UUID: did,
+					},
+				},
+			},
+			args:    args{id: did},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := sbiStore{
+				store: tt.fields.store,
+			}
+			got, err := s.get(tt.args.id)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_pndStore_get(t *testing.T) {
+	type fields struct {
+		store store
+	}
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    PrincipalNetworkDomain
+		wantErr bool
+	}{
+		{
+			name: "exists",
+			fields: fields{
+				store: store{
+					defaultPndID: &pndImplementation{id: defaultPndID},
+				},
+			},
+			args:    args{id: defaultPndID},
+			want:    &pndImplementation{id: defaultPndID},
+			wantErr: false,
+		},
+		{
+			name: "fails",
+			fields: fields{
+				store: store{
+					defaultPndID: &pndImplementation{id: defaultPndID},
+				},
+			},
+			args:    args{id: iid},
+			wantErr: true,
+		},
+		{
+			name: "fails empty",
+			fields: fields{
+				store: store{},
+			},
+			args:    args{id: defaultPndID},
+			wantErr: true,
+		},
+		{
+			name: "fails wrong type",
+			fields: fields{
+				store: store{
+					did: &Device{
+						UUID: did,
+					},
+				},
+			},
+			args:    args{id: did},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := pndStore{
+				store: tt.fields.store,
+			}
+			got, err := s.get(tt.args.id)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_deviceStore_get(t *testing.T) {
+	type fields struct {
+		store store
+	}
+	type args struct {
+		id uuid.UUID
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    *Device
+		wantErr bool
+	}{
+		{
+			name: "exists",
+			fields: fields{
+				store: store{
+					defaultPndID: &Device{UUID: did}}},
+			args: args{id: defaultPndID},
+			want: &Device{
+				UUID: did,
+			},
+			wantErr: false,
+		},
+		{
+			name: "fails",
+			fields: fields{
+				store: store{
+					defaultPndID: &Device{UUID: did}}},
+			args:    args{id: iid},
+			wantErr: true,
+		},
+		{
+			name: "fails empty",
+			fields: fields{
+				store: store{},
+			},
+			args:    args{id: defaultPndID},
+			wantErr: true,
+		},
+		{
+			name: "fails wrong type",
+			fields: fields{
+				store: store{
+					defaultPndID: &pndImplementation{id: defaultPndID}}},
+			args:    args{id: defaultPndID},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			s := deviceStore{
+				store: tt.fields.store,
+			}
+			got, err := s.get(tt.args.id)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/transport.go b/nucleus/transport.go
new file mode 100644
index 0000000000000000000000000000000000000000..36dda96300e226ac74de3682d86885e20332191a
--- /dev/null
+++ b/nucleus/transport.go
@@ -0,0 +1,41 @@
+package nucleus
+
+import (
+	"bytes"
+	"context"
+	"github.com/openconfig/ygot/ytypes"
+	"io"
+)
+
+// Transport provides an interface for
+// Transport implementations like RESTCONF
+// or gnmi
+type Transport interface {
+	Get(ctx context.Context, params ...string) (interface{}, error)
+	Set(ctx context.Context, params ...interface{}) (interface{}, error)
+	Subscribe(ctx context.Context, params ...string) error
+	Type() string
+	GetOptions() interface{}
+	ProcessResponse(resp interface{}, root interface{}, models *ytypes.Schema) error
+}
+
+// YANGConsumer is a auxillary type to redirect the response
+// of an RESTCONF call to a ygot YANG unmarshaler
+type YANGConsumer struct {
+	Data *bytes.Buffer
+}
+
+// Consume reads the received data into a byte buffer
+func (yc YANGConsumer) Consume(reader io.Reader, _ interface{}) error {
+	_, err := yc.Data.ReadFrom(reader)
+	return err
+}
+
+// TransportOptions provides an interface for TransportOptions implementations
+// for Transports like RESTCONF or gNMI
+type TransportOptions interface {
+	GetAddress() string
+	GetUsername() string
+	GetPassword() string
+	IsTransportOption()
+}
diff --git a/nucleus/transport_test.go b/nucleus/transport_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..0fa4ffa903a1f894325aaf5211341e19a2df754a
--- /dev/null
+++ b/nucleus/transport_test.go
@@ -0,0 +1 @@
+package nucleus
diff --git a/nucleus/util/path/path_traversal.go b/nucleus/util/path/path_traversal.go
new file mode 100644
index 0000000000000000000000000000000000000000..ada6dbcb1a3439efbcb5b834ec952789e72825e8
--- /dev/null
+++ b/nucleus/util/path/path_traversal.go
@@ -0,0 +1,122 @@
+package path
+
+import (
+	"fmt"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+	"strings"
+)
+
+const delim = "/"
+
+// Element represents a node in a path containing its name and possible child nodes
+type Element struct {
+	Children []*Element
+	Name     string
+}
+
+// Print prints the path element to stdout. It calls printElement recursively
+func (p *Element) Print() {
+	printElement(0, p)
+}
+
+func printElement(indent int, pe *Element) {
+	for i := 0; i < indent; i++ {
+		fmt.Print("    ")
+	}
+	fmt.Println(pe.Name)
+	if len(pe.Children) > 0 {
+		for _, p := range pe.Children {
+			printElement(indent+1, p)
+		}
+	}
+}
+
+// ParseSchema takes a YANG schema and parses it into paths
+func ParseSchema(schema *ytypes.Schema, root string) (map[string]*Element, error) {
+	paths := make(map[string]*Element)
+	tree := schema.SchemaTree
+	for k, v := range tree {
+		if v.Parent != nil {
+			if v.Parent.Name == root {
+				path := processEntry(v)
+				paths[k] = path
+			}
+		}
+	}
+	return paths, nil
+}
+
+func processEntry(e *yang.Entry) *Element {
+	if e.Dir != nil {
+		elem := &Element{
+			Children: make([]*Element, len(e.Dir)),
+			Name:     e.Name,
+		}
+		i := 0
+		for _, v := range e.Dir {
+			elem.Children[i] = processEntry(v)
+			i++
+		}
+		return elem
+	}
+	leaf := &Element{
+		Name: e.Name,
+	}
+	return leaf
+}
+
+// Strings constructs a slice containg all possible root to leaf paths.
+// Calls stringBuilder internally
+func Strings(paths map[string]*Element) []string {
+	p := make([]string, 0)
+	ch := make(chan string)
+	stop := make(chan bool)
+	val := make(chan []string)
+	go appendix(ch, stop, val)
+	for _, v := range paths {
+		var b strings.Builder
+		stringBuilder(ch, &b, v)
+	}
+	stop <- true
+	p = <-val
+	return p
+}
+
+func appendix(c chan string, stop chan bool, pathChan chan []string) {
+	p := make([]string, 0)
+	var sig bool
+	for {
+		select {
+		case path := <-c:
+			p = append(p, path)
+			log.Debug(path)
+		case sig = <-stop:
+			log.Debugf("Signal received: %v", sig)
+
+		}
+		if sig {
+			break
+		}
+	}
+	pathChan <- p
+}
+
+func stringBuilder(ch chan string, b *strings.Builder, v *Element) {
+	if b.Len() == 0 {
+		b.WriteString(delim)
+	}
+	b.WriteString(v.Name)
+	if v.Children != nil {
+		b.WriteString(delim)
+		for _, c := range v.Children {
+			var bCpy strings.Builder
+			bCpy.WriteString(b.String())
+			stringBuilder(ch, &bCpy, c)
+		}
+	} else {
+		log.Debug("leaf")
+		ch <- b.String()
+	}
+}
diff --git a/nucleus/util/path/path_traversal_test.go b/nucleus/util/path/path_traversal_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..a12455361462f3ceaf606883820580a5d6e39ab9
--- /dev/null
+++ b/nucleus/util/path/path_traversal_test.go
@@ -0,0 +1,270 @@
+package path
+
+import (
+	model "code.fbi.h-da.de/cocsn/gosdn/test/yang"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ytypes"
+	log "github.com/sirupsen/logrus"
+	"os"
+	"reflect"
+	"sort"
+	"testing"
+)
+
+var schema *ytypes.Schema
+
+func TestMain(m *testing.M) {
+	testSetupPath()
+	os.Exit(m.Run())
+}
+
+func testSetupPath() {
+	var err error
+	schema, err = model.Schema()
+	if err != nil {
+		log.Fatal(err)
+	}
+}
+
+func TestParseSchema(t *testing.T) {
+	t.Skip("order of slices cannot be determined")
+	type args struct {
+		schema *ytypes.Schema
+		root   string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		want    map[string]*Element
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				schema: schema,
+				root:   "device",
+			},
+			want: map[string]*Element{
+				"Test_Container1": {
+					Children: []*Element{
+						{
+							Children: []*Element{
+								{
+									Children: nil,
+									Name:     "leaf-list1",
+								},
+								{
+									Children: nil,
+									Name:     "leaf1",
+								},
+								{
+									Children: nil,
+									Name:     "leaf2",
+								},
+							},
+							Name: "list1",
+						},
+					},
+					Name: "container1",
+				},
+				"Test_Container2": {
+					Children: []*Element{
+						{
+							Children: []*Element{
+								{
+									Children: nil,
+									Name:     "leaf-list1",
+								},
+								{
+									Children: nil,
+									Name:     "leaf1",
+								},
+								{
+									Children: nil,
+									Name:     "leaf2",
+								},
+							},
+							Name: "list1",
+						},
+					},
+					Name: "container2",
+				},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := ParseSchema(tt.args.schema, tt.args.root)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("ParseSchema() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			sort.Slice(tt.want["Test_Container1"].Children[0].Children[0].Children, func(i, j int) bool {
+				return i < j
+			})
+
+			sort.Slice(tt.want["Test_Container2"].Children[0].Children[0].Children, func(i, j int) bool {
+				return i < j
+			})
+
+			sort.Slice(got["Test_Container1"].Children[0].Children[0].Children, func(i, j int) bool {
+				return i < j
+			})
+
+			sort.Slice(got["Test_Container2"].Children[0].Children[0].Children, func(i, j int) bool {
+				return i < j
+			})
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("ParseSchema() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestStrings(t *testing.T) {
+	t.Skip("order of slices cannot be determined")
+	type args struct {
+		paths map[string]*Element
+	}
+	tests := []struct {
+		name string
+		args args
+		want []string
+	}{
+		{
+			name: "default",
+			args: args{
+				paths: map[string]*Element{
+					"Test_Container1": {
+						Children: []*Element{
+							{
+								Children: []*Element{
+									{
+										Children: nil,
+										Name:     "leaf-list1",
+									},
+									{
+										Children: nil,
+										Name:     "leaf1",
+									},
+									{
+										Children: nil,
+										Name:     "leaf2",
+									},
+								},
+								Name: "list1",
+							},
+						},
+						Name: "container1",
+					},
+					"Test_Container2": {
+						Children: []*Element{
+							{
+								Children: []*Element{
+									{
+										Children: nil,
+										Name:     "leaf-list1",
+									},
+									{
+										Children: nil,
+										Name:     "leaf1",
+									},
+									{
+										Children: nil,
+										Name:     "leaf2",
+									},
+								},
+								Name: "list1",
+							},
+						},
+						Name: "container2",
+					},
+				},
+			},
+			want: []string{
+				"/container1/list1/leaf-list1",
+				"/container1/list1/leaf1",
+				"/container1/list1/leaf2",
+				"/container2/list1/leaf-list1",
+				"/container2/list1/leaf1",
+				"/container2/list1/leaf2",
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got := Strings(tt.args.paths)
+			sort.Slice(tt.want, func(i, j int) bool {
+				return i < j
+			})
+			sort.Slice(got, func(i, j int) bool {
+				return i < j
+			})
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Strings() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func Test_processEntry(t *testing.T) {
+	t.Skip("order of slices cannot be determined")
+	type args struct {
+		e *yang.Entry
+	}
+	tests := []struct {
+		name string
+		args args
+		want *Element
+	}{
+		{
+			name: "leaf",
+			args: args{e: schema.SchemaTree["Test_Container1_List1"].Dir["leaf1"]},
+			want: &Element{
+				Children: nil,
+				Name:     "leaf1",
+			},
+		},
+		{
+			name: "intermediate",
+			args: args{schema.SchemaTree["Test_Container1"]},
+			want: &Element{
+				Children: []*Element{
+					{
+						Children: []*Element{
+							{
+								Children: nil,
+								Name:     "leaf-list1",
+							},
+							{
+								Children: nil,
+								Name:     "leaf1",
+							},
+							{
+								Children: nil,
+								Name:     "leaf2",
+							},
+						},
+						Name: "list1",
+					},
+				},
+				Name: "container1",
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got := processEntry(tt.args.e)
+			sort.Slice(tt.want.Children, func(i, j int) bool {
+				return i < j
+			})
+			sort.Slice(got.Children, func(i, j int) bool {
+				return i < j
+			})
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("processEntry() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/util/proto/cap-resp-arista-ceos_test b/nucleus/util/proto/cap-resp-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..009569457324faf59d7bf00bb1915f2f3ccc2ec2
--- /dev/null
+++ b/nucleus/util/proto/cap-resp-arista-ceos_test
@@ -0,0 +1,298 @@
+
+<
+arista-exp-eos-vxlan$Arista Networks <http://arista.com/>
+B
+ietf-netconf2IETF NETCONF (Network Configuration) Working Group
+<
+arista-rpol-augments$Arista Networks <http://arista.com/>
+C
+arista-exp-eos-igmpsnooping$Arista Networks <http://arista.com/>
+8
+openconfig-vlan-typesOpenConfig working group3.1.0
+?
+openconfig-system-managementOpenConfig working group0.3.0
+8
+arista-eos-types$Arista Networks <http://arista.com/>
+<
+openconfig-openflow-typesOpenConfig working group0.1.2
+7
+openconfig-aaa-typesOpenConfig working group0.4.1
+9
+openconfig-srte-policyOpenConfig working group0.2.1
+9
+openconfig-relay-agentOpenConfig working group0.1.1
+C
+openconfig-hercules-qos!OpenConfig Hercules Working Group0.1.0
+1
+openconfig-extensionsOpenConfig working group
+/
+arista-mpls-deviationsArista Networks, Inc.
+<
+arista-vlan-augments$Arista Networks <http://arista.com/>
+:
+openconfig-platform-cpuOpenConfig working group0.1.1
+<
+openconfig-routing-policyOpenConfig working group3.1.1
+=
+openconfig-isis-lsdb-typesOpenConfig working group0.4.2
+3
+openconfig-if-ipOpenConfig working group3.0.0
+;
+arista-pim-augments$Arista Networks <http://arista.com/>
+4
+openconfig-if-poeOpenConfig working group0.1.1
+-
+arista-isis-augmentsArista Networks, Inc.
+8
+openconfig-ospf-typesOpenConfig working group0.1.3
+/
+arista-intf-deviationsArista Networks, Inc.
+5
+openconfig-mpls-srOpenConfig working group3.0.1
+:
+openconfig-packet-matchOpenConfig working group1.1.1
+8
+openconfig-inet-typesOpenConfig working group0.3.3
+9
+openconfig-if-ethernetOpenConfig working group2.8.1
+5
+openconfig-pf-srteOpenConfig working group0.2.0
+2
+openconfig-mplsOpenConfig working group3.1.0
+#
+
+arista-cliArista Networks, Inc.
+=
+openconfig-system-terminalOpenConfig working group0.3.1
+:
+openconfig-platform-psuOpenConfig working group0.2.1
+8
+openconfig-yang-typesOpenConfig working group0.2.1
+8
+openconfig-lldp-typesOpenConfig working group0.1.1
+7
+openconfig-if-tunnelOpenConfig working group0.1.1
+6
+openconfig-messagesOpenConfig working group0.0.1
+B
+openconfig-platform-transceiverOpenConfig working group0.7.1
+1
+openconfig-pimOpenConfig working group0.2.0
+@
+openconfig-packet-match-typesOpenConfig working group1.0.2
+C
+ openconfig-segment-routing-typesOpenConfig working group0.2.0
+:
+openconfig-policy-typesOpenConfig working group3.1.1
+/
+arista-lldp-deviationsArista Networks, Inc.
+B
+openconfig-network-instance-l3OpenConfig working group0.11.1
+E
+arista-exp-eos-qos-acl-config$Arista Networks <http://arista.com/>
+5
+openconfig-licenseOpenConfig working group0.2.0
+:
+openconfig-platform-fanOpenConfig working group0.1.1
+/
+arista-system-augmentsArista Networks, Inc.
+2
+openconfig-isisOpenConfig working group0.6.0
+H
+/arista-network-instance-notsupported-deviationsArista Networks, Inc.
+B
+)arista-interfaces-notsupported-deviationsArista Networks, Inc.
+<
+arista-mpls-augments$Arista Networks <http://arista.com/>
+3
+arista-openflow-deviationsArista Networks, Inc.
+7
+openconfig-platformOpenConfig working group0.12.2
+D
+arista-exp-eos-varp-net-inst$Arista Networks <http://arista.com/>
+9
+openconfig-ospf-policyOpenConfig working group0.1.3
+6
+openconfig-if-typesOpenConfig working group0.2.1
+:
+arista-exp-eos-qos$Arista Networks <http://arista.com/>
+2
+openconfig-igmpOpenConfig working group0.2.0
+)
+arista-gnoi-certArista Networks, Inc.
+/
+arista-isis-deviationsArista Networks, Inc.
+4
+openconfig-systemOpenConfig working group0.9.1
+>
+arista-vlan-deviations$Arista Networks <http://arista.com/>
+#
+vlan-translationArista Networks
+;
+openconfig-local-routingOpenConfig working group1.1.0
+@
+arista-exp-eos-varp-intf$Arista Networks <http://arista.com/>
+;
+arista-exp-eos-mlag$Arista Networks <http://arista.com/>
+8
+openconfig-igmp-typesOpenConfig working group0.1.1
+1
+openconfig-aftOpenConfig working group0.4.1
+-
+arista-srte-augmentsArista Networks, Inc.
+E
+arista-relay-agent-deviations$Arista Networks <http://arista.com/>
+7
+openconfig-mpls-rsvpOpenConfig working group3.0.2
+1
+openconfig-aaaOpenConfig working group0.4.3
+6
+arista-exp-eos$Arista Networks <http://arista.com/>
+H
+openconfig-hercules-platform!OpenConfig Hercules Working Group0.2.0
+.
+arista-acl-deviationsArista Networks, Inc.
+/
+arista-lacp-deviationsArista Networks, Inc.
+?
+ietf-interfaces,IETF NETMOD (Network Modeling) Working Group
+.
+arista-bgp-deviationsArista Networks, Inc.
+<
+openconfig-platform-typesOpenConfig working group1.0.0
+;
+"arista-acl-notsupported-deviationsArista Networks, Inc.
+3
+openconfig-typesOpenConfig working group0.6.0
+M
+ietf-yang-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group
+1
+openconfig-qosOpenConfig working group0.2.3
+.
+arista-bfd-deviationsArista Networks, Inc.
+@
+'arista-messages-notsupported-deviationsArista Networks, Inc.
+9
+openconfig-alarm-typesOpenConfig working group0.2.1
+<
+#arista-exp-eos-l2protocolforwardingArista Networks, Inc.
+6
+openconfig-openflowOpenConfig working group0.1.2
+>
+%arista-system-notsupported-deviationsArista Networks, Inc.
+7
+openconfig-pim-typesOpenConfig working group0.1.1
+2
+openconfig-vlanOpenConfig working group3.2.0
+F
+-arista-routing-policy-notsupported-deviationsArista Networks, Inc.
+7
+openconfig-aft-typesOpenConfig Working Group0.3.4
+,
+arista-aft-augmentsArista Networks, Inc.
+<
+arista-lacp-augments$Arista Networks <http://arista.com/>
+1
+openconfig-bfdOpenConfig working group0.2.1
+<
+openconfig-system-loggingOpenConfig working group0.3.1
+4
+openconfig-alarmsOpenConfig working group0.3.2
+8
+openconfig-isis-typesOpenConfig working group0.4.2
+?
+openconfig-platform-linecardOpenConfig working group0.1.2
+<
+#arista-lldp-notsupported-deviationsArista Networks, Inc.
+,
+arista-exp-eos-evpnArista Networks, Inc.
+5
+openconfig-rib-bgpOpenConfig working group0.7.0
+@
+'arista-platform-notsupported-deviationsArista Networks, Inc.
+@
+arista-exp-eos-multicast$Arista Networks <http://arista.com/>
+;
+"arista-bfd-notsupported-deviationsArista Networks, Inc.
+?
+openconfig-policy-forwardingOpenConfig working group0.2.1
+2
+openconfig-lacpOpenConfig working group1.1.1
+-
+arista-lldp-augmentsArista Networks, Inc.
+;
+arista-bfd-augments$Arista Networks <http://arista.com/>
+1
+openconfig-bgpOpenConfig working group6.0.0
+
+iana-if-typeIANA
+/
+arista-rpol-deviationsArista Networks, Inc.
+;
+openconfig-rib-bgp-typesOpenConfig working group0.5.0
+M
+ietf-inet-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group
+8
+openconfig-bgp-policyOpenConfig working group6.0.1
+<
+arista-intf-augments$Arista Networks <http://arista.com/>
+8
+arista-local-routing-deviationsArista Networks, Inc.
+8
+openconfig-interfacesOpenConfig working group2.4.3
+:
+openconfig-if-aggregateOpenConfig working group2.4.3
+/
+arista-srte-deviationsArista Networks, Inc.
+A
+arista-exp-eos-qos-config$Arista Networks <http://arista.com/>
+2
+openconfig-lldpOpenConfig working group0.2.1
+J
+openconfig-hercules-interfaces!OpenConfig Hercules Working Group0.2.0
+6
+openconfig-mpls-ldpOpenConfig working group3.0.2
+8
+openconfig-mpls-typesOpenConfig working group3.2.0
+M
+ietf-netconf-monitoring2IETF NETCONF (Network Configuration) Working Group
+7
+openconfig-bgp-typesOpenConfig working group5.2.0
+<
+#arista-lacp-notsupported-deviationsArista Networks, Inc.
+E
+,arista-local-routing-notsupported-deviationsArista Networks, Inc.
+,
+arista-bgp-augmentsArista Networks, Inc.
+2
+arista-netinst-deviationsArista Networks, Inc.
+;
+"arista-bgp-notsupported-deviationsArista Networks, Inc.
+D
+!openconfig-network-instance-typesOpenConfig working group0.8.2
+1
+openconfig-aclOpenConfig working group1.1.1
+7
+openconfig-qos-typesOpenConfig working group0.2.1
+5
+openconfig-procmonOpenConfig working group0.4.0
+,
+arista-qos-augmentsArista Networks, Inc.
+;
+openconfig-platform-portOpenConfig working group0.3.3
+4
+openconfig-ospfv2OpenConfig working group0.2.2
+1
+arista-system-deviationsArista Networks, Inc.
+>
+openconfig-transport-typesOpenConfig working group0.11.0
+?
+openconfig-network-instanceOpenConfig working group0.14.0
++
+arista-rpc-netconfArista Networks, Inc.
+=
+openconfig-segment-routingOpenConfig working group0.3.0
+;
+"arista-qos-notsupported-deviationsArista Networks, Inc.
+C
+arista-exp-eos-vxlan-config$Arista Networks <http://arista.com/>�0.7.0
\ No newline at end of file
diff --git a/nucleus/util/proto/message.go b/nucleus/util/proto/message.go
new file mode 100644
index 0000000000000000000000000000000000000000..673be2f9df590416dac904c518d0058a5d31ad40
--- /dev/null
+++ b/nucleus/util/proto/message.go
@@ -0,0 +1,41 @@
+package proto
+
+import (
+	"fmt"
+	"google.golang.org/protobuf/proto"
+	"io/ioutil"
+)
+
+/*
+Copycat source: https://dev.to/techschoolguru/go-generate-serialize-protobuf-message-4m7a
+*/
+
+// Write writes protocol buffer message to binary file
+func Write(message proto.Message, filename string) error {
+	data, err := proto.Marshal(message)
+	if err != nil {
+		return fmt.Errorf("cannot marshal proto message to binary: %w", err)
+	}
+
+	err = ioutil.WriteFile(filename, data, 0644)
+	if err != nil {
+		return fmt.Errorf("cannot write binary data to file: %w", err)
+	}
+
+	return nil
+}
+
+// Read reads a binary file (containing a marshaled protocol buffer message)
+// and unmarshals it back into a protocol buffer message
+func Read(filename string, message proto.Message) error {
+	data, err := ioutil.ReadFile(filename)
+	if err != nil {
+		return fmt.Errorf("cannot read binary data from file: %w", err)
+	}
+	err = proto.Unmarshal(data, message)
+	if err != nil {
+		return fmt.Errorf("cannot unmarshal binary to proto message: %w", err)
+	}
+
+	return nil
+}
diff --git a/nucleus/util/proto/message_test.go b/nucleus/util/proto/message_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..3f756d3aef8ad5c467a2572d793e374bb2802c30
--- /dev/null
+++ b/nucleus/util/proto/message_test.go
@@ -0,0 +1,130 @@
+package proto
+
+import (
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	pb "google.golang.org/protobuf/proto"
+	"os"
+	"reflect"
+	"strings"
+	"testing"
+)
+
+func TestMain(m *testing.M) {
+	gnmiPaths = map[string]pb.Message{
+		"../../../test/proto/cap-resp-arista-ceos":                  &gpb.CapabilityResponse{},
+		"../../../test/proto/req-full-node":                         &gpb.GetRequest{},
+		"../../../test/proto/req-full-node-arista-ceos":             &gpb.GetRequest{},
+		"../../../test/proto/req-interfaces-arista-ceos":            &gpb.GetRequest{},
+		"../../../test/proto/req-interfaces-interface-arista-ceos":  &gpb.GetRequest{},
+		"../../../test/proto/req-interfaces-wildcard":               &gpb.GetRequest{},
+		"../../../test/proto/resp-full-node":                        &gpb.GetResponse{},
+		"../../../test/proto/resp-full-node-arista-ceos":            &gpb.GetResponse{},
+		"../../../test/proto/resp-interfaces-arista-ceos":           &gpb.GetResponse{},
+		"../../../test/proto/resp-interfaces-interface-arista-ceos": &gpb.GetResponse{},
+		"../../../test/proto/resp-interfaces-wildcard":              &gpb.GetResponse{},
+		"../../../test/proto/resp-set-system-config-hostname":       &gpb.SetResponse{},
+	}
+	os.Exit(m.Run())
+}
+
+var gnmiPaths map[string]pb.Message
+
+func TestRead(t *testing.T) {
+	type args struct {
+		filename string
+		message  pb.Message
+	}
+	type test struct {
+		name    string
+		args    args
+		want    reflect.Type
+		wantErr bool
+	}
+	var tests []test
+	for k, v := range gnmiPaths {
+		name := strings.Split(k, "/")[5]
+		tests = append(tests, test{
+			name: name,
+			args: args{
+				filename: k,
+				message:  v,
+			},
+			want:    reflect.TypeOf(v),
+			wantErr: false,
+		})
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := Read(tt.args.filename, tt.args.message); (err != nil) != tt.wantErr {
+				t.Errorf("Read() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			got := reflect.TypeOf(tt.args.message)
+			if got != tt.want {
+				t.Errorf("Read() got Type %v, want Type %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestWrite(t *testing.T) {
+	for k, v := range gnmiPaths {
+		if err := Read(k, v); err != nil {
+			t.Error(err)
+		}
+	}
+	type args struct {
+		message  pb.Message
+		filename string
+	}
+	type test struct {
+		name    string
+		args    args
+		want    pb.Message
+		wantErr bool
+	}
+	var tests []test
+	for k, v := range gnmiPaths {
+		name := strings.Split(k, "/")[5]
+		tests = append(tests, test{
+			name: name,
+			args: args{
+				message:  v,
+				filename: name + "_test",
+			},
+			want:    v,
+			wantErr: false,
+		})
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := Write(tt.args.message, tt.args.filename); (err != nil) != tt.wantErr {
+				t.Errorf("Write() error = %v, wantErr %v", err, tt.wantErr)
+			}
+			var got pb.Message
+			switch tt.want.(type) {
+			case *gpb.GetResponse:
+				got = &gpb.GetResponse{}
+			case *gpb.GetRequest:
+				got = &gpb.GetRequest{}
+			case *gpb.SetResponse:
+				got = &gpb.SetResponse{}
+			case *gpb.SetRequest:
+				got = &gpb.SetRequest{}
+			case *gpb.CapabilityResponse:
+				got = &gpb.CapabilityResponse{}
+			default:
+				t.Error("no test case for message type")
+				return
+			}
+			err := Read(tt.args.filename, got)
+			if err != nil {
+				t.Error(err)
+			}
+			if reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Write() got %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/nucleus/util/proto/req-full-node-arista-ceos_test b/nucleus/util/proto/req-full-node-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..6223295e2984b8002ea5573e8fbbecb77ba9dc6d
Binary files /dev/null and b/nucleus/util/proto/req-full-node-arista-ceos_test differ
diff --git a/nucleus/util/proto/req-full-node_test b/nucleus/util/proto/req-full-node_test
new file mode 100644
index 0000000000000000000000000000000000000000..087f7d8275a07a95d6809081bab6ccecfa81a9f1
--- /dev/null
+++ b/nucleus/util/proto/req-full-node_test
@@ -0,0 +1,7 @@
+2
+
+interfaces
+	interface
+
+interfaces
+	interface(
\ No newline at end of file
diff --git a/nucleus/util/proto/req-interfaces-arista-ceos_test b/nucleus/util/proto/req-interfaces-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..e444e33aa6d44fc9ca4538f5a030df6c8d88a708
--- /dev/null
+++ b/nucleus/util/proto/req-interfaces-arista-ceos_test
@@ -0,0 +1,5 @@
+
+
+interfaces
+
+interfaces(
\ No newline at end of file
diff --git a/nucleus/util/proto/req-interfaces-interface-arista-ceos_test b/nucleus/util/proto/req-interfaces-interface-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..087f7d8275a07a95d6809081bab6ccecfa81a9f1
--- /dev/null
+++ b/nucleus/util/proto/req-interfaces-interface-arista-ceos_test
@@ -0,0 +1,7 @@
+2
+
+interfaces
+	interface
+
+interfaces
+	interface(
\ No newline at end of file
diff --git a/nucleus/util/proto/req-interfaces-wildcard_test b/nucleus/util/proto/req-interfaces-wildcard_test
new file mode 100644
index 0000000000000000000000000000000000000000..bd113697d2f21f1dbd7a3a881c6ab70cd4ec4644
--- /dev/null
+++ b/nucleus/util/proto/req-interfaces-wildcard_test
@@ -0,0 +1,12 @@
+c
+
+interfaces
+interface[name=*]
+state
+name
+
+interfaces
+	interface	
+name*
+state
+name(
\ No newline at end of file
diff --git a/nucleus/util/proto/resp-full-node-arista-ceos_test b/nucleus/util/proto/resp-full-node-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..9bcd16e666a683a570c5141eb01b4ed16ad52b8b
Binary files /dev/null and b/nucleus/util/proto/resp-full-node-arista-ceos_test differ
diff --git a/nucleus/util/proto/resp-full-node_test b/nucleus/util/proto/resp-full-node_test
new file mode 100644
index 0000000000000000000000000000000000000000..4614be84e811d8a96624192f082c97ec9edf76be
--- /dev/null
+++ b/nucleus/util/proto/resp-full-node_test
@@ -0,0 +1,7 @@
+
+�""�"
+0
+
+interfaces 
+	interface
+nameEthernet510�"Z�"{"openconfig-interfaces:config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:41","mac-address":"02:42:c0:a8:02:41","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_5GB","SPEED_25GB","SPEED_50GB","SPEED_100GB","SPEED_10MB","SPEED_100GB_2LANE","SPEED_100MB","SPEED_1GB","SPEED_2500MB","SPEED_400GB","SPEED_10GB","SPEED_40GB","SPEED_200GB_4LANE","SPEED_200GB_8LANE","SPEED_50GB_1LANE"]}},"openconfig-interfaces:hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"openconfig-interfaces:name":"Ethernet510","openconfig-interfaces:state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"294224","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1412","in-octets":"72226989","in-unicast-pkts":"642","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1612959137249521152","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-interfaces:subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":true,"mtu":1500},"state":{"dhcp-client":false,"enabled":true,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"addresses":{"address":[{"config":{"ip":"fdfd::ce05","prefix-length":64},"ip":"fdfd::ce05","state":{"ip":"fdfd::ce05","origin":"STATIC","prefix-length":64,"status":"PREFERRED"}}]},"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"neighbors":{"neighbor":[{"config":{"ip":"fdfd::1"},"ip":"fdfd::1","state":{"ip":"fdfd::1","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::7683:c2ff:fefe:86ad"},"ip":"fe80::7683:c2ff:fefe:86ad","state":{"ip":"fe80::7683:c2ff:fefe:86ad","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::c3:43ff:fec5:da0b"},"ip":"fe80::c3:43ff:fec5:da0b","state":{"ip":"fe80::c3:43ff:fec5:da0b","link-layer-address":"02:c3:43:c5:da:0b","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fdfd::28"},"ip":"fdfd::28","state":{"ip":"fdfd::28","link-layer-address":"02:c3:43:c5:da:0b","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::1"},"ip":"fe80::1","state":{"ip":"fe80::1","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}}]},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}
\ No newline at end of file
diff --git a/nucleus/util/proto/resp-interfaces-arista-ceos_test b/nucleus/util/proto/resp-interfaces-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..58e139172f4264b079f1f61ec7f27fe454129734
--- /dev/null
+++ b/nucleus/util/proto/resp-interfaces-arista-ceos_test
@@ -0,0 +1,5 @@
+
+�"�
+
+
+interfaces�Z�{"openconfig-interfaces:interface":[{"config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"name":"Ethernet510","state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}]}
\ No newline at end of file
diff --git a/nucleus/util/proto/resp-interfaces-interface-arista-ceos_test b/nucleus/util/proto/resp-interfaces-interface-arista-ceos_test
new file mode 100644
index 0000000000000000000000000000000000000000..05f0804b1153e5982ff5d5e4d4a32d9d6d6be7d0
--- /dev/null
+++ b/nucleus/util/proto/resp-interfaces-interface-arista-ceos_test
@@ -0,0 +1,7 @@
+
+�"�
+0
+
+interfaces 
+	interface
+nameEthernet510�Z�{"openconfig-interfaces:config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"openconfig-interfaces:hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"openconfig-interfaces:name":"Ethernet510","openconfig-interfaces:state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-interfaces:subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}
\ No newline at end of file
diff --git a/nucleus/util/proto/resp-interfaces-wildcard_test b/nucleus/util/proto/resp-interfaces-wildcard_test
new file mode 100644
index 0000000000000000000000000000000000000000..50cb9f4c7021af0340d92cde6f1320ffb066e68d
--- /dev/null
+++ b/nucleus/util/proto/resp-interfaces-wildcard_test
@@ -0,0 +1,10 @@
+
+T"R
+A
+
+interfaces 
+	interface
+nameEthernet510
+state
+name
+Ethernet510
\ No newline at end of file
diff --git a/nucleus/util/proto/resp-set-system-config-hostname_test b/nucleus/util/proto/resp-set-system-config-hostname_test
new file mode 100644
index 0000000000000000000000000000000000000000..c656ee5bb56b47d1e306627823c577d1b51d6988
--- /dev/null
+++ b/nucleus/util/proto/resp-set-system-config-hostname_test
@@ -0,0 +1,8 @@
+>:
+system
+config
+hostname
+system
+config
+
+hostname  �����ȶ
\ No newline at end of file
diff --git a/restconf/client/ciena/client.go b/restconf/client/ciena/client.go
deleted file mode 100644
index 072413d144f5b6db3944cd5984201cf9a02fc3d7..0000000000000000000000000000000000000000
--- a/restconf/client/ciena/client.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package ciena
-
-import (
-	"bytes"
-	"code.fbi.h-da.de/cocsn/gosdn/database"
-	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/util"
-	apiclient "code.fbi.h-da.de/cocsn/swagger/apis/mcp/client"
-	"crypto/tls"
-	"github.com/go-openapi/runtime"
-	httptransport "github.com/go-openapi/runtime/client"
-	"github.com/go-openapi/strfmt"
-	"net/http"
-)
-
-//MCPClient handles requests to a Ciena MCP RESTCONF endpoint
-type MCPClient struct {
-	transport *httptransport.Runtime
-	client    *apiclient.ServiceTopologyTAPI
-	database  *database.Database
-	buffer    *bytes.Buffer
-	config    *interfaces.ClientConfig
-}
-
-// GetConfig returns a ClientConfig struct containing
-// the current configuration stat of the Ciena SBI client
-func (c MCPClient) GetConfig() interfaces.ClientConfig {
-	return *c.config
-}
-
-//NewMCPClient creates a Ciena flavores TAPI client
-func NewMCPClient(endpoint, username, password string, database *database.Database, config *interfaces.ClientConfig) *MCPClient {
-	// create the transport
-	transport := httptransport.New(endpoint, "/", nil)
-	transport.Transport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
-	// create the API client, with the transport
-	basicAuth := httptransport.BasicAuth(username, password)
-	// authenticate client
-	transport.DefaultAuthentication = basicAuth
-	client := apiclient.New(transport, strfmt.Default)
-
-	buffer := new(bytes.Buffer)
-	transport.Consumers[runtime.JSONMime] = util.YANGConsumer{Data: buffer}
-
-	return &MCPClient{
-		transport: transport,
-		client:    client,
-		database:  database,
-		buffer:    buffer,
-		config:    config,
-	}
-}
-
-// GetConnections implements the TAPI Connectivity GetConnections call with a grain of
-// Ciena salt. The response is written to the client's buffer and passed to the database
-func (c *MCPClient) GetConnections() error {
-	defer c.buffer.Reset()
-	_, err := c.client.TapiConnectivityCore.GetTapiCoreContextConnection(nil)
-	c.database.StoreConnections(c.buffer.String())
-	log.Debug(c.buffer.Next(25))
-	return err
-}
-
-// GetLinks implements the TAPI Topology GetLinks call with a grain of
-// Ciena salt. The response is written to the client's buffer and passed to the database
-func (c *MCPClient) GetLinks() error {
-	defer c.buffer.Reset()
-	_, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyLink(nil)
-	c.database.StoreLinks(c.buffer.String())
-	log.Debug(c.buffer.Next(25))
-	return err
-}
-
-// GetNodes implements the TAPI Topology GetNodes call with a grain of
-// Ciena salt. The response is written to the client's buffer and passed to the database
-func (c *MCPClient) GetNodes() error {
-	defer c.buffer.Reset()
-	_, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyNode(nil)
-	c.database.StoreNodes(c.buffer.String())
-	log.Debug(c.buffer.Next(25))
-	return err
-}
-
-// GetNodeEdgePoints implements the TAPI Topology GetNodeEdgePoints call with a grain of
-// Ciena salt. The response is written to the client's buffer and passed to the database
-func (c *MCPClient) GetNodeEdgePoints() error {
-	defer c.buffer.Reset()
-	_, err := c.client.TapiTopologyCore.GetTapiCoreContextTopologyMcpBaseTopologyNodeEdgePoint(nil)
-	c.database.StoreNodeEdgePoints(c.buffer.String())
-	log.Debug(c.buffer.Next(25))
-	return err
-}
diff --git a/restconf/util/unmarshal.go b/restconf/util/unmarshal.go
deleted file mode 100644
index 9c85a8cb4d23329efe33cad50d86fa88463e4fa6..0000000000000000000000000000000000000000
--- a/restconf/util/unmarshal.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package util
-
-import (
-	"bytes"
-	"io"
-)
-
-// YANGConsumer is a auxillary type to redirect the response
-// of an RESTCONF call to a ygot YANG unmarshaler
-type YANGConsumer struct {
-	Data *bytes.Buffer
-}
-
-// Consume reads the received data into a byte buffer
-func (yc YANGConsumer) Consume(reader io.Reader, _ interface{}) error {
-	_, err := yc.Data.ReadFrom(reader)
-	return err
-}
diff --git a/test/arista-interface-response.json b/test/arista-interface-response.json
new file mode 100644
index 0000000000000000000000000000000000000000..392b21cd2158057613047b35794a42dddf1d35c4
--- /dev/null
+++ b/test/arista-interface-response.json
@@ -0,0 +1,238 @@
+[
+  {
+    "time": "1970-01-01T01:00:00+01:00",
+    "updates": [
+      {
+        "Path": "interfaces/interface[name=Ethernet510]",
+        "values": {
+          "interfaces/interface": {
+            "openconfig-if-ethernet:ethernet": {
+              "arista-intf-augments:pfc": {
+                "priorities": {
+                  "priority": [
+                    {
+                      "index": 0,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 0,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 1,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 1,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 2,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 2,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 3,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 3,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 4,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 4,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 5,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 5,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 6,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 6,
+                        "out-frames": "0"
+                      }
+                    },
+                    {
+                      "index": 7,
+                      "state": {
+                        "in-frames": "0",
+                        "index": 7,
+                        "out-frames": "0"
+                      }
+                    }
+                  ]
+                }
+              },
+              "config": {
+                "arista-intf-augments:fec-encoding": {
+                  "disabled": false,
+                  "fire-code": false,
+                  "reed-solomon": false,
+                  "reed-solomon544": false
+                },
+                "arista-intf-augments:sfp-1000base-t": false,
+                "mac-address": "00:00:00:00:00:00",
+                "openconfig-hercules-interfaces:forwarding-viable": true,
+                "port-speed": "SPEED_UNKNOWN"
+              },
+              "state": {
+                "arista-intf-augments:supported-speeds": [
+                  "SPEED_200GB_8LANE",
+                  "SPEED_100MB",
+                  "SPEED_1GB",
+                  "SPEED_10GB",
+                  "SPEED_400GB",
+                  "SPEED_40GB",
+                  "SPEED_2500MB",
+                  "SPEED_50GB",
+                  "SPEED_50GB_1LANE",
+                  "SPEED_25GB",
+                  "SPEED_100GB",
+                  "SPEED_100GB_2LANE",
+                  "SPEED_10MB",
+                  "SPEED_200GB_4LANE",
+                  "SPEED_5GB"
+                ],
+                "auto-negotiate": false,
+                "counters": {
+                  "in-crc-errors": "0",
+                  "in-fragment-frames": "0",
+                  "in-jabber-frames": "0",
+                  "in-mac-control-frames": "0",
+                  "in-mac-pause-frames": "0",
+                  "in-oversize-frames": "0",
+                  "out-mac-control-frames": "0",
+                  "out-mac-pause-frames": "0"
+                },
+                "duplex-mode": "FULL",
+                "enable-flow-control": false,
+                "hw-mac-address": "02:42:c0:a8:02:42",
+                "mac-address": "02:42:c0:a8:02:42",
+                "negotiated-port-speed": "SPEED_UNKNOWN",
+                "openconfig-hercules-interfaces:forwarding-viable": true,
+                "port-speed": "SPEED_UNKNOWN"
+              }
+            },
+            "openconfig-interfaces:config": {
+              "arista-intf-augments:load-interval": 300,
+              "description": "",
+              "enabled": true,
+              "loopback-mode": false,
+              "mtu": 0,
+              "name": "Ethernet510",
+              "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+              "type": "iana-if-type:ethernetCsmacd"
+            },
+            "openconfig-interfaces:hold-time": {
+              "config": {
+                "down": 0,
+                "up": 0
+              },
+              "state": {
+                "down": 0,
+                "up": 0
+              }
+            },
+            "openconfig-interfaces:name": "Ethernet510",
+            "openconfig-interfaces:state": {
+              "admin-status": "UP",
+              "arista-intf-augments:inactive": false,
+              "counters": {
+                "in-broadcast-pkts": "344691",
+                "in-discards": "0",
+                "in-errors": "0",
+                "in-fcs-errors": "0",
+                "in-multicast-pkts": "1",
+                "in-octets": "93260151",
+                "in-unicast-pkts": "0",
+                "out-broadcast-pkts": "0",
+                "out-discards": "0",
+                "out-errors": "0",
+                "out-multicast-pkts": "0",
+                "out-octets": "0",
+                "out-unicast-pkts": "0"
+              },
+              "description": "",
+              "enabled": true,
+              "ifindex": 510,
+              "last-change": "1614091948142304000",
+              "loopback-mode": false,
+              "mtu": 0,
+              "name": "Ethernet510",
+              "openconfig-platform-port:hardware-port": "Port510",
+              "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+              "oper-status": "UP",
+              "type": "iana-if-type:ethernetCsmacd"
+            },
+            "openconfig-interfaces:subinterfaces": {
+              "subinterface": [
+                {
+                  "config": {
+                    "description": "",
+                    "enabled": true,
+                    "index": 0
+                  },
+                  "index": 0,
+                  "openconfig-if-ip:ipv4": {
+                    "config": {
+                      "dhcp-client": false,
+                      "enabled": false,
+                      "mtu": 1500
+                    },
+                    "state": {
+                      "dhcp-client": false,
+                      "enabled": false,
+                      "mtu": 1500
+                    },
+                    "unnumbered": {
+                      "config": {
+                        "enabled": false
+                      },
+                      "state": {
+                        "enabled": false
+                      }
+                    }
+                  },
+                  "openconfig-if-ip:ipv6": {
+                    "config": {
+                      "dhcp-client": false,
+                      "enabled": false,
+                      "mtu": 1500
+                    },
+                    "state": {
+                      "dhcp-client": false,
+                      "enabled": false,
+                      "mtu": 1500
+                    }
+                  },
+                  "state": {
+                    "counters": {
+                      "in-fcs-errors": "0"
+                    },
+                    "description": "",
+                    "enabled": true,
+                    "index": 0
+                  }
+                }
+              ]
+            }
+          }
+        }
+      }
+    ]
+  }
+]
diff --git a/test/arista-interface-response2.json b/test/arista-interface-response2.json
new file mode 100644
index 0000000000000000000000000000000000000000..490099db940c125dfb69b3570764886a2f20a6e2
--- /dev/null
+++ b/test/arista-interface-response2.json
@@ -0,0 +1,242 @@
+[
+  {
+    "time": "1970-01-01T01:00:00+01:00",
+    "updates": [
+      {
+        "Path": "interfaces",
+        "values": {
+          "interfaces": {
+            "openconfig-interfaces:interface": [
+              {
+                "config": {
+                  "arista-intf-augments:load-interval": 300,
+                  "description": "",
+                  "enabled": true,
+                  "loopback-mode": false,
+                  "mtu": 0,
+                  "name": "Ethernet510",
+                  "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+                  "type": "iana-if-type:ethernetCsmacd"
+                },
+                "hold-time": {
+                  "config": {
+                    "down": 0,
+                    "up": 0
+                  },
+                  "state": {
+                    "down": 0,
+                    "up": 0
+                  }
+                },
+                "name": "Ethernet510",
+                "openconfig-if-ethernet:ethernet": {
+                  "arista-intf-augments:pfc": {
+                    "priorities": {
+                      "priority": [
+                        {
+                          "index": 0,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 0,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 1,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 1,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 2,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 2,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 3,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 3,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 4,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 4,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 5,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 5,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 6,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 6,
+                            "out-frames": "0"
+                          }
+                        },
+                        {
+                          "index": 7,
+                          "state": {
+                            "in-frames": "0",
+                            "index": 7,
+                            "out-frames": "0"
+                          }
+                        }
+                      ]
+                    }
+                  },
+                  "config": {
+                    "arista-intf-augments:fec-encoding": {
+                      "disabled": false,
+                      "fire-code": false,
+                      "reed-solomon": false,
+                      "reed-solomon544": false
+                    },
+                    "arista-intf-augments:sfp-1000base-t": false,
+                    "mac-address": "00:00:00:00:00:00",
+                    "openconfig-hercules-interfaces:forwarding-viable": true,
+                    "port-speed": "SPEED_UNKNOWN"
+                  },
+                  "state": {
+                    "arista-intf-augments:supported-speeds": [
+                      "SPEED_200GB_8LANE",
+                      "SPEED_100MB",
+                      "SPEED_1GB",
+                      "SPEED_10GB",
+                      "SPEED_400GB",
+                      "SPEED_40GB",
+                      "SPEED_2500MB",
+                      "SPEED_50GB",
+                      "SPEED_50GB_1LANE",
+                      "SPEED_25GB",
+                      "SPEED_100GB",
+                      "SPEED_100GB_2LANE",
+                      "SPEED_10MB",
+                      "SPEED_200GB_4LANE",
+                      "SPEED_5GB"
+                    ],
+                    "auto-negotiate": false,
+                    "counters": {
+                      "in-crc-errors": "0",
+                      "in-fragment-frames": "0",
+                      "in-jabber-frames": "0",
+                      "in-mac-control-frames": "0",
+                      "in-mac-pause-frames": "0",
+                      "in-oversize-frames": "0",
+                      "out-mac-control-frames": "0",
+                      "out-mac-pause-frames": "0"
+                    },
+                    "duplex-mode": "FULL",
+                    "enable-flow-control": false,
+                    "hw-mac-address": "02:42:c0:a8:02:42",
+                    "mac-address": "02:42:c0:a8:02:42",
+                    "negotiated-port-speed": "SPEED_UNKNOWN",
+                    "openconfig-hercules-interfaces:forwarding-viable": true,
+                    "port-speed": "SPEED_UNKNOWN"
+                  }
+                },
+                "state": {
+                  "admin-status": "UP",
+                  "arista-intf-augments:inactive": false,
+                  "counters": {
+                    "in-broadcast-pkts": "344691",
+                    "in-discards": "0",
+                    "in-errors": "0",
+                    "in-fcs-errors": "0",
+                    "in-multicast-pkts": "1",
+                    "in-octets": "93260151",
+                    "in-unicast-pkts": "0",
+                    "out-broadcast-pkts": "0",
+                    "out-discards": "0",
+                    "out-errors": "0",
+                    "out-multicast-pkts": "0",
+                    "out-octets": "0",
+                    "out-unicast-pkts": "0"
+                  },
+                  "description": "",
+                  "enabled": true,
+                  "ifindex": 510,
+                  "last-change": "1614091948142304000",
+                  "loopback-mode": false,
+                  "mtu": 0,
+                  "name": "Ethernet510",
+                  "openconfig-platform-port:hardware-port": "Port510",
+                  "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+                  "oper-status": "UP",
+                  "type": "iana-if-type:ethernetCsmacd"
+                },
+                "subinterfaces": {
+                  "subinterface": [
+                    {
+                      "config": {
+                        "description": "",
+                        "enabled": true,
+                        "index": 0
+                      },
+                      "index": 0,
+                      "openconfig-if-ip:ipv4": {
+                        "config": {
+                          "dhcp-client": false,
+                          "enabled": false,
+                          "mtu": 1500
+                        },
+                        "state": {
+                          "dhcp-client": false,
+                          "enabled": false,
+                          "mtu": 1500
+                        },
+                        "unnumbered": {
+                          "config": {
+                            "enabled": false
+                          },
+                          "state": {
+                            "enabled": false
+                          }
+                        }
+                      },
+                      "openconfig-if-ip:ipv6": {
+                        "config": {
+                          "dhcp-client": false,
+                          "enabled": false,
+                          "mtu": 1500
+                        },
+                        "state": {
+                          "dhcp-client": false,
+                          "enabled": false,
+                          "mtu": 1500
+                        }
+                      },
+                      "state": {
+                        "counters": {
+                          "in-fcs-errors": "0"
+                        },
+                        "description": "",
+                        "enabled": true,
+                        "index": 0
+                      }
+                    }
+                  ]
+                }
+              }
+            ]
+          }
+        }
+      }
+    ]
+  }
+]
diff --git a/test/arista-root-response.json b/test/arista-root-response.json
new file mode 100644
index 0000000000000000000000000000000000000000..ddbe90101c9aae11f0447100bbc32b593c5bf781
--- /dev/null
+++ b/test/arista-root-response.json
@@ -0,0 +1,6744 @@
+[
+  {
+    "time": "1970-01-01T01:00:00+01:00",
+    "updates": [
+      {
+        "Path": "",
+        "values": {
+          "": {
+            "arista-exp-eos:arista": {
+              "eos": {
+                "arista-exp-eos-igmpsnooping:bridging": {
+                  "igmpsnooping": {
+                    "config": {}
+                  }
+                },
+                "arista-exp-eos-mlag:mlag": {
+                  "config": {
+                    "dual-primary-action": "action-none",
+                    "enabled": true,
+                    "heartbeat-interval": 4000,
+                    "heartbeat-peer-address": {
+                      "address": "0.0.0.0",
+                      "vrf": ""
+                    },
+                    "lacp-standby": false,
+                    "reload-delay-mlag-configured": false
+                  }
+                },
+                "arista-exp-eos-multicast:routing": {
+                  "multicast": {
+                    "routeconfig": {
+                      "static": {
+                        "vrfConfig": [
+                          {
+                            "vrfName": "default"
+                          }
+                        ]
+                      }
+                    }
+                  }
+                },
+                "arista-exp-eos-qos:qos": {
+                  "arista-exp-eos-qos-acl-config:acl": {
+                    "input": {
+                      "cli": {
+                        "cmapType": [
+                          {
+                            "cmap": [
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-rsvp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-unicastarp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l2broadcast"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-multicastsnoop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mlag"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-igmp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3destmiss"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-acllog-sflow"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipunicast"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-default-snoop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-tc6to7"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mac-learn"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-vxlan-vtep-learn"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mvrp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3lpmoverflow"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3slowpath"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-cfm-snoop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-bgp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mod"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-vrrp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ldp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-linklocal"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-protocol-snoop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-cvx"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-PimPtp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipmc"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipbroadcast"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-acllog"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-iplocking"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-bfd-ptp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipv6nd"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-dot1x-mba"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipmcrsvd"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-arpresolver"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-cvx-heartbeat"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-bpdu"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-nat"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-drop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-vxlan-encapsulation"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ptp-snoop"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-sflow"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mpls-arp-suppress"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-lldp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3ttl0"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mpls-ttl01"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-lacp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-cfm"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3ttl1"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-tc3to5"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l2ucast"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mirroring"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mtu"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l3rsvd"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-dot1x-vxlan"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-bfd"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-glean"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-arp-inspect"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-l2rsvd"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-pim"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ipmcmiss"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-egress-acllog"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-selfip-tc6to7"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-selfip"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-ptp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-arp"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-OspfIsis"
+                              },
+                              {
+                                "matchCondition": "matchConditionAny",
+                                "name": "copp-system-mpls-label-miss"
+                              }
+                            ],
+                            "type": "mapControlPlane"
+                          },
+                          {
+                            "cmap": [
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "vrrp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "vrrp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "layer2-broadcast"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "layer2-broadcast"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "lldp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "lldp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "link-local-multicast"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "link-local-multicast"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "ospf"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "ospf"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "igmp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "igmp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "bpdu"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "bpdu"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "unicast-rpf-failure"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "unicast-rpf-failure"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "layer3-control"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "layer3-control"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "lacp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "lacp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "natTcpFlags"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "natTcpFlags"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "self-ip-all"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "self-ip-all"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "arp-needed"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "arp-needed"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "self-ip-high-priority"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "self-ip-high-priority"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "unicast-route-miss"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "unicast-route-miss"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "nat-miss"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "nat-miss"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "bfd"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "bfd"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "cfm"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "cfm"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "self-icmp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "self-icmp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "self-ip-low-priority"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "self-ip-low-priority"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "dhcp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "dhcp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "pim"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "pim"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "pvst"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "pvst"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "vxlan-vtep-learn"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "vxlan-vtep-learn"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "ttl-exception"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "ttl-exception"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "arp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "arp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "layer3-slow-path"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "layer3-slow-path"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "ip-broadcast"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "ip-broadcast"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "multicast-route-miss"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "multicast-route-miss"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "layer2-control"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "layer2-control"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mac-source-miss"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mac-source-miss"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mvrp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mvrp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mlag-control"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mlag-control"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mpls-route-miss"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mpls-route-miss"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mstp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mstp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "dot1xMBA"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "dot1xMBA"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "unicast-route-overflow"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "unicast-route-overflow"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "mlag-control-heartbeat"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "mlag-control-heartbeat"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "self-bgp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "self-bgp"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "ipv6-nd"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "ipv6-nd"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "vxlan-encapsulation"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "vxlan-encapsulation"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "cvx"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "cvx"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "routed-ip-options"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "routed-ip-options"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "isis"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "isis"
+                              },
+                              {
+                                "match": [
+                                  {
+                                    "option": "matchBuiltIn",
+                                    "strValue": "ptp"
+                                  }
+                                ],
+                                "matchCondition": "matchConditionAny",
+                                "name": "ptp"
+                              }
+                            ],
+                            "type": "mapPdp"
+                          },
+                          {
+                            "type": "mapQos"
+                          }
+                        ],
+                        "pmapType": [
+                          {
+                            "pmap": [
+                              {
+                                "classAction": [
+                                  {
+                                    "name": "copp-system-OspfIsis",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3lpmoverflow",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-linklocal",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-nat",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipmcmiss",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-drop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-cfm",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipmc",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mod",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-acllog",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-tc3to5",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-bpdu",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mirroring",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-bfd-ptp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mlag",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-cvx",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-vrrp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-igmp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-default-snoop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipbroadcast",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-bfd",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mpls-ttl01",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3destmiss",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-iplocking",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mac-learn",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3ttl1",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-arp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-cvx-heartbeat",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-egress-acllog",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-lacp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l2rsvd",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipmcrsvd",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-vxlan-encapsulation",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-dot1x-mba",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ptp-snoop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-cfm-snoop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-vxlan-vtep-learn",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l2broadcast",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mpls-arp-suppress",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-lldp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-glean",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipunicast",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-multicastsnoop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-pim",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-selfip-tc6to7",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-selfip",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-PimPtp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-arpresolver",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ptp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ldp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-acllog-sflow",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mtu",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-arp-inspect",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-rsvp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mvrp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-unicastarp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3slowpath",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-mpls-label-miss",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-bgp",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3ttl0",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-ipv6nd",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-sflow",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l3rsvd",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-dot1x-vxlan",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-l2ucast",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-tc6to7",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  },
+                                  {
+                                    "name": "copp-system-protocol-snoop",
+                                    "policer": {
+                                      "cmdVersion": 1
+                                    },
+                                    "policyAction": [
+                                      {
+                                        "actionType": "actionSetShape",
+                                        "rate": {}
+                                      },
+                                      {
+                                        "actionType": "actionSetBandwidth",
+                                        "rate": {}
+                                      }
+                                    ]
+                                  }
+                                ],
+                                "classActionDefault": {
+                                  "name": "copp-system-default",
+                                  "policer": {
+                                    "cmdVersion": 1
+                                  },
+                                  "policyAction": [
+                                    {
+                                      "actionType": "actionSetShape",
+                                      "rate": {}
+                                    },
+                                    {
+                                      "actionType": "actionSetBandwidth",
+                                      "rate": {}
+                                    }
+                                  ]
+                                },
+                                "classDefault": {
+                                  "match": [
+                                    {
+                                      "option": "matchIpAccessGroup"
+                                    }
+                                  ]
+                                },
+                                "coppStaticClassPrio": [
+                                  {
+                                    "index": 25
+                                  },
+                                  {
+                                    "index": 21
+                                  },
+                                  {
+                                    "index": 19
+                                  },
+                                  {
+                                    "index": 55
+                                  },
+                                  {
+                                    "index": 62
+                                  },
+                                  {
+                                    "index": 10
+                                  },
+                                  {
+                                    "index": 15
+                                  },
+                                  {
+                                    "index": 49
+                                  },
+                                  {
+                                    "index": 31
+                                  },
+                                  {
+                                    "index": 58
+                                  },
+                                  {
+                                    "index": 30
+                                  },
+                                  {
+                                    "index": 14
+                                  },
+                                  {
+                                    "index": 41
+                                  },
+                                  {
+                                    "index": 56
+                                  },
+                                  {
+                                    "index": 36
+                                  },
+                                  {
+                                    "index": 16
+                                  },
+                                  {
+                                    "index": 48
+                                  },
+                                  {
+                                    "index": 64
+                                  },
+                                  {
+                                    "index": 39
+                                  },
+                                  {
+                                    "index": 27
+                                  },
+                                  {
+                                    "index": 8
+                                  },
+                                  {
+                                    "index": 9
+                                  },
+                                  {
+                                    "index": 2
+                                  },
+                                  {
+                                    "index": 54
+                                  },
+                                  {
+                                    "index": 35
+                                  },
+                                  {
+                                    "index": 3
+                                  },
+                                  {
+                                    "index": 29
+                                  },
+                                  {
+                                    "index": 59
+                                  },
+                                  {
+                                    "index": 33
+                                  },
+                                  {
+                                    "index": 18
+                                  },
+                                  {
+                                    "index": 42
+                                  },
+                                  {
+                                    "index": 7
+                                  },
+                                  {
+                                    "index": 24
+                                  },
+                                  {
+                                    "index": 61
+                                  },
+                                  {
+                                    "index": 38
+                                  },
+                                  {
+                                    "index": 53
+                                  },
+                                  {
+                                    "index": 66
+                                  },
+                                  {
+                                    "index": 32
+                                  },
+                                  {
+                                    "index": 37
+                                  },
+                                  {
+                                    "index": 52
+                                  },
+                                  {
+                                    "index": 51
+                                  },
+                                  {
+                                    "index": 40
+                                  },
+                                  {
+                                    "index": 13
+                                  },
+                                  {
+                                    "index": 12
+                                  },
+                                  {
+                                    "index": 5
+                                  },
+                                  {
+                                    "index": 4
+                                  },
+                                  {
+                                    "index": 34
+                                  },
+                                  {
+                                    "index": 45
+                                  },
+                                  {
+                                    "index": 11
+                                  },
+                                  {
+                                    "index": 26
+                                  },
+                                  {
+                                    "index": 28
+                                  },
+                                  {
+                                    "index": 67
+                                  },
+                                  {
+                                    "index": 46
+                                  },
+                                  {
+                                    "index": 17
+                                  },
+                                  {
+                                    "index": 65
+                                  },
+                                  {
+                                    "index": 63
+                                  },
+                                  {
+                                    "index": 50
+                                  },
+                                  {
+                                    "index": 57
+                                  },
+                                  {
+                                    "index": 23
+                                  },
+                                  {
+                                    "index": 1
+                                  },
+                                  {
+                                    "index": 60
+                                  },
+                                  {
+                                    "index": 47
+                                  },
+                                  {
+                                    "index": 22
+                                  },
+                                  {
+                                    "index": 44
+                                  },
+                                  {
+                                    "index": 20
+                                  },
+                                  {
+                                    "index": 6
+                                  },
+                                  {
+                                    "index": 43
+                                  }
+                                ],
+                                "name": "copp-system-policy"
+                              }
+                            ],
+                            "type": "mapControlPlane"
+                          },
+                          {
+                            "type": "mapPdp"
+                          },
+                          {
+                            "type": "mapQos"
+                          }
+                        ]
+                      }
+                    }
+                  },
+                  "arista-exp-eos-qos-config:input": {
+                    "config": {
+                      "cli": {
+                        "servicePolicyConfig": [
+                          {
+                            "key-direction": "input",
+                            "key-pmapName": "copp-system-policy",
+                            "key-type": "mapControlPlane"
+                          }
+                        ]
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            "arista-gnoi-cert:certificates": {
+              "certificate": [
+                {
+                  "certificate-id": "ARISTA_DEFAULT_PROFILE",
+                  "config": {
+                    "certificate-id": "ARISTA_DEFAULT_PROFILE"
+                  },
+                  "status": {
+                    "not-after": 0,
+                    "not-before": 0,
+                    "pem-certificate": ""
+                  }
+                }
+              ]
+            },
+            "ietf-netconf-monitoring:netconf-state": {
+              "capabilities": {
+                "capability": [
+                  "http://arista.com/yang/cert/gnoi-cert?module=arista-gnoi-cert\u0026revision=2018-01-15",
+                  "http://arista.com/yang/cli?module=arista-cli\u0026revision=2020-02-11",
+                  "http://arista.com/yang/experimental/eos/eos-types?module=arista-eos-types\u0026revision=2016-10-14",
+                  "http://arista.com/yang/experimental/eos/evpn?module=arista-exp-eos-evpn\u0026revision=2020-07-31",
+                  "http://arista.com/yang/experimental/eos/l2protocolforwarding?module=arista-exp-eos-l2protocolforwarding\u0026revision=2020-04-16",
+                  "http://arista.com/yang/experimental/eos/qos/acl?module=arista-exp-eos-qos-acl-config\u0026revision=2019-11-12",
+                  "http://arista.com/yang/experimental/eos/qos/config?module=arista-exp-eos-qos-config\u0026revision=2017-09-26",
+                  "http://arista.com/yang/experimental/eos/qos?module=arista-exp-eos-qos\u0026revision=2017-09-26",
+                  "http://arista.com/yang/experimental/eos/varp/intf?module=arista-exp-eos-varp-intf\u0026revision=2020-01-06",
+                  "http://arista.com/yang/experimental/eos/varp/net-inst?module=arista-exp-eos-varp-net-inst\u0026revision=2019-05-22",
+                  "http://arista.com/yang/experimental/eos/vxlan/config?module=arista-exp-eos-vxlan-config\u0026revision=2018-08-01",
+                  "http://arista.com/yang/experimental/eos/vxlan?module=arista-exp-eos-vxlan\u0026revision=2018-08-01",
+                  "http://arista.com/yang/experimental/eos?module=arista-exp-eos\u0026revision=2016-11-09",
+                  "http://arista.com/yang/experimental/igmpsnooping?module=arista-exp-eos-igmpsnooping\u0026revision=2017-10-23",
+                  "http://arista.com/yang/experimental/multicast?module=arista-exp-eos-multicast\u0026revision=2017-10-20",
+                  "http://arista.com/yang/openconfig/acl/deviations?module=arista-acl-deviations\u0026revision=2020-01-07",
+                  "http://arista.com/yang/openconfig/acl/notsupported-deviations?module=arista-acl-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/aft/augments?module=arista-aft-augments\u0026revision=2019-10-01",
+                  "http://arista.com/yang/openconfig/bfd/augments?module=arista-bfd-augments\u0026revision=2020-01-06",
+                  "http://arista.com/yang/openconfig/bfd/deviations?module=arista-bfd-deviations\u0026revision=2018-08-08",
+                  "http://arista.com/yang/openconfig/bfd/notsupported-deviations?module=arista-bfd-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/bgp/augments?module=arista-bgp-augments\u0026revision=2020-05-27",
+                  "http://arista.com/yang/openconfig/bgp/deviations?module=arista-bgp-deviations\u0026revision=2020-05-27",
+                  "http://arista.com/yang/openconfig/bgp/notsupported-deviations?module=arista-bgp-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/interfaces/augments?module=arista-intf-augments\u0026revision=2020-05-13",
+                  "http://arista.com/yang/openconfig/interfaces/deviations?module=arista-intf-deviations\u0026revision=2020-04-02",
+                  "http://arista.com/yang/openconfig/interfaces/notsupported-deviations?module=arista-interfaces-notsupported-deviations\u0026revision=2020-03-27",
+                  "http://arista.com/yang/openconfig/isis/augments?module=arista-isis-augments\u0026revision=2020-03-18",
+                  "http://arista.com/yang/openconfig/isis/deviations?module=arista-isis-deviations\u0026revision=2019-05-14",
+                  "http://arista.com/yang/openconfig/lacp/augments?module=arista-lacp-augments\u0026revision=2017-09-14",
+                  "http://arista.com/yang/openconfig/lacp/deviations?module=arista-lacp-deviations\u0026revision=2017-09-07",
+                  "http://arista.com/yang/openconfig/lacp/notsupported-deviations?module=arista-lacp-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/lldp/augments?module=arista-lldp-augments\u0026revision=2018-03-06",
+                  "http://arista.com/yang/openconfig/lldp/deviations?module=arista-lldp-deviations\u0026revision=2018-04-02",
+                  "http://arista.com/yang/openconfig/lldp/notsupported-deviations?module=arista-lldp-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/local-routing/deviations?module=arista-local-routing-deviations\u0026revision=2017-11-22",
+                  "http://arista.com/yang/openconfig/local-routing/notsupported-deviations?module=arista-local-routing-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/messages/notsupported-deviations?module=arista-messages-notsupported-deviations\u0026revision=2020-02-04",
+                  "http://arista.com/yang/openconfig/mpls/augments?module=arista-mpls-augments\u0026revision=2017-12-21",
+                  "http://arista.com/yang/openconfig/mpls/deviations?module=arista-mpls-deviations\u0026revision=2018-03-19",
+                  "http://arista.com/yang/openconfig/network-instance/deviations?module=arista-vlan-deviations\u0026revision=2019-11-13",
+                  "http://arista.com/yang/openconfig/network-instance/notsupported-deviations?module=arista-network-instance-notsupported-deviations\u0026revision=2020-07-31",
+                  "http://arista.com/yang/openconfig/network-instance/vlan/augments?module=arista-vlan-augments\u0026revision=2020-01-06",
+                  "http://arista.com/yang/openconfig/network-instances/deviations?module=arista-netinst-deviations\u0026revision=2019-05-24",
+                  "http://arista.com/yang/openconfig/openflow/deviations?module=arista-openflow-deviations\u0026revision=2020-02-26",
+                  "http://arista.com/yang/openconfig/pim/augments?module=arista-pim-augments\u0026revision=2019-04-24",
+                  "http://arista.com/yang/openconfig/platform/notsupported-deviations?module=arista-platform-notsupported-deviations\u0026revision=2020-07-13",
+                  "http://arista.com/yang/openconfig/policy-forwarding/augments?module=arista-srte-augments\u0026revision=2020-01-28",
+                  "http://arista.com/yang/openconfig/policy-forwarding/augments?module=arista-srte-deviations\u0026revision=2020-03-03",
+                  "http://arista.com/yang/openconfig/policy/augments?module=arista-rpol-augments\u0026revision=2018-04-12",
+                  "http://arista.com/yang/openconfig/policy/deviations?module=arista-rpol-deviations\u0026revision=2016-02-01",
+                  "http://arista.com/yang/openconfig/qos/augments?module=arista-qos-augments\u0026revision=2020-06-05",
+                  "http://arista.com/yang/openconfig/qos/notsupported-deviations?module=arista-qos-notsupported-deviations\u0026revision=2020-06-10",
+                  "http://arista.com/yang/openconfig/relay-agent/deviations?module=arista-relay-agent-deviations\u0026revision=2016-11-21",
+                  "http://arista.com/yang/openconfig/routing-policy/notsupported-deviations?module=arista-routing-policy-notsupported-deviations\u0026revision=2020-02-07",
+                  "http://arista.com/yang/openconfig/system/augments?module=arista-system-augments\u0026revision=2020-03-09",
+                  "http://arista.com/yang/openconfig/system/deviations?module=arista-system-deviations\u0026revision=2020-01-21",
+                  "http://arista.com/yang/openconfig/system/notsupported-deviations?module=arista-system-notsupported-deviations\u0026revision=2020-03-26",
+                  "http://arista.com/yang/rpc/netconf?module=arista-rpc-netconf\u0026revision=2018-01-04",
+                  "http://arista.com/yang/vlan-translation?module=vlan-translation\u0026revision=2019-07-31",
+                  "http://openconfig.net/yang/aaa/types?module=openconfig-aaa-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/aaa?module=openconfig-aaa\u0026revision=2019-10-28",
+                  "http://openconfig.net/yang/aaa?module=openconfig-aaa-radius\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/aaa?module=openconfig-aaa-tacacs\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/acl?module=openconfig-acl\u0026revision=2019-11-27",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-common\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-ethernet\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-ipv4\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-ipv6\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-mpls\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/aft?module=openconfig-aft-pf\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/alarms/types?module=openconfig-alarm-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/alarms?module=openconfig-alarms\u0026revision=2019-07-09",
+                  "http://openconfig.net/yang/bfd?module=openconfig-bfd\u0026revision=2020-05-08",
+                  "http://openconfig.net/yang/bgp-policy?module=openconfig-bgp-policy\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/bgp-types?module=openconfig-bgp-errors\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/bgp-types?module=openconfig-bgp-types\u0026revision=2020-06-17",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-common\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-common-multiprotocol\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-common-structure\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-global\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-neighbor\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/bgp?module=openconfig-bgp-peer-group\u0026revision=2019-07-10",
+                  "http://openconfig.net/yang/fib-types?module=openconfig-aft-types\u0026revision=2019-11-07",
+                  "http://openconfig.net/yang/header-fields?module=openconfig-packet-match\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/hercules/interfaces?module=openconfig-hercules-interfaces\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-chassis\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-linecard\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-node\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/platform?module=openconfig-hercules-platform-port\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/hercules/qos?module=openconfig-hercules-qos\u0026revision=2018-06-01",
+                  "http://openconfig.net/yang/igmp/types?module=openconfig-igmp-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/igmp?module=openconfig-igmp\u0026revision=2019-07-09",
+                  "http://openconfig.net/yang/interfaces/aggregate?module=openconfig-if-aggregate\u0026revision=2020-05-01",
+                  "http://openconfig.net/yang/interfaces/ethernet?module=openconfig-if-ethernet\u0026revision=2020-05-06",
+                  "http://openconfig.net/yang/interfaces/ip?module=openconfig-if-ip\u0026revision=2019-01-08",
+                  "http://openconfig.net/yang/interfaces/tunnel?module=openconfig-if-tunnel\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/interfaces?module=openconfig-interfaces\u0026revision=2019-11-19",
+                  "http://openconfig.net/yang/isis-lsdb-types?module=openconfig-isis-lsdb-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/isis-types?module=openconfig-isis-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/lacp?module=openconfig-lacp\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/ldp?module=openconfig-mpls-ldp\u0026revision=2019-07-09",
+                  "http://openconfig.net/yang/license?module=openconfig-license\u0026revision=2020-04-22",
+                  "http://openconfig.net/yang/lldp/types?module=openconfig-lldp-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/lldp?module=openconfig-lldp\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/local-routing?module=openconfig-local-routing\u0026revision=2020-03-24",
+                  "http://openconfig.net/yang/messages?module=openconfig-messages\u0026revision=2018-08-13",
+                  "http://openconfig.net/yang/mpls-sr?module=openconfig-mpls-sr\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/mpls-types?module=openconfig-mpls-types\u0026revision=2020-02-04",
+                  "http://openconfig.net/yang/mpls?module=openconfig-mpls\u0026revision=2019-03-26",
+                  "http://openconfig.net/yang/mpls?module=openconfig-mpls-igp\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/mpls?module=openconfig-mpls-static\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/mpls?module=openconfig-mpls-te\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/network-instance-l3?module=openconfig-network-instance-l3\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/network-instance-types?module=openconfig-network-instance-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/network-instance?module=openconfig-network-instance\u0026revision=2020-06-20",
+                  "http://openconfig.net/yang/network-instance?module=openconfig-network-instance-l2\u0026revision=2020-06-20",
+                  "http://openconfig.net/yang/openconfig-ext?module=openconfig-extensions\u0026revision=2018-10-17",
+                  "http://openconfig.net/yang/openconfig-if-types?module=openconfig-if-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis\u0026revision=2020-03-24",
+                  "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis-lsp\u0026revision=2020-03-24",
+                  "http://openconfig.net/yang/openconfig-isis?module=openconfig-isis-routing\u0026revision=2020-03-24",
+                  "http://openconfig.net/yang/openconfig-types?module=openconfig-types\u0026revision=2019-04-16",
+                  "http://openconfig.net/yang/openflow/types?module=openconfig-openflow-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/openflow?module=openconfig-openflow\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/ospf-policy?module=openconfig-ospf-policy\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/ospf-types?module=openconfig-ospf-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-area\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-area-interface\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-common\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-global\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/ospfv2?module=openconfig-ospfv2-lsdb\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/packet-match-types?module=openconfig-packet-match-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/pim/types?module=openconfig-pim-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/pim?module=openconfig-pim\u0026revision=2019-07-09",
+                  "http://openconfig.net/yang/platform-types?module=openconfig-platform-types\u0026revision=2019-06-03",
+                  "http://openconfig.net/yang/platform/cpu?module=openconfig-platform-cpu\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/platform/fan?module=openconfig-platform-fan\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/platform/linecard?module=openconfig-platform-linecard\u0026revision=2020-05-10",
+                  "http://openconfig.net/yang/platform/port?module=openconfig-platform-port\u0026revision=2020-05-06",
+                  "http://openconfig.net/yang/platform/psu?module=openconfig-platform-psu\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/platform/transceiver?module=openconfig-platform-transceiver\u0026revision=2020-05-06",
+                  "http://openconfig.net/yang/platform?module=openconfig-platform\u0026revision=2019-04-16",
+                  "http://openconfig.net/yang/poe?module=openconfig-if-poe\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/policy-forwarding/sr-te?module=openconfig-pf-srte\u0026revision=2019-10-15",
+                  "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-forwarding-policies\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-interfaces\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/policy-forwarding?module=openconfig-pf-path-groups\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/policy-forwarding?module=openconfig-policy-forwarding\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/policy-types?module=openconfig-policy-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/qos-types?module=openconfig-qos-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/qos?module=openconfig-qos\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/qos?module=openconfig-qos-elements\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/qos?module=openconfig-qos-interfaces\u0026revision=2019-11-28",
+                  "http://openconfig.net/yang/relay-agent?module=openconfig-relay-agent\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/rib/bgp-types?module=openconfig-rib-bgp-types\u0026revision=2019-03-14",
+                  "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp\u0026revision=2019-10-15",
+                  "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-attributes\u0026revision=2019-10-15",
+                  "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-shared-attributes\u0026revision=2019-10-15",
+                  "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-table-attributes\u0026revision=2019-04-25",
+                  "http://openconfig.net/yang/rib/bgp?module=openconfig-rib-bgp-tables\u0026revision=2019-10-15",
+                  "http://openconfig.net/yang/routing-policy?module=openconfig-routing-policy\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/rsvp?module=openconfig-mpls-rsvp\u0026revision=2020-02-04",
+                  "http://openconfig.net/yang/segment-routing-types?module=openconfig-segment-routing-types\u0026revision=2020-02-04",
+                  "http://openconfig.net/yang/segment-routing/srte-policy?module=openconfig-srte-policy\u0026revision=2020-05-01",
+                  "http://openconfig.net/yang/sr?module=openconfig-segment-routing\u0026revision=2020-03-31",
+                  "http://openconfig.net/yang/system/logging?module=openconfig-system-logging\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/system/management?module=openconfig-system-management\u0026revision=2020-01-14",
+                  "http://openconfig.net/yang/system/procmon?module=openconfig-procmon\u0026revision=2019-03-15",
+                  "http://openconfig.net/yang/system/terminal?module=openconfig-system-terminal\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/system?module=openconfig-system\u0026revision=2020-03-25",
+                  "http://openconfig.net/yang/transport-types?module=openconfig-transport-types\u0026revision=2020-04-24",
+                  "http://openconfig.net/yang/types/inet?module=openconfig-inet-types\u0026revision=2019-04-25",
+                  "http://openconfig.net/yang/types/yang?module=openconfig-yang-types\u0026revision=2018-11-21",
+                  "http://openconfig.net/yang/vlan-types?module=openconfig-vlan-types\u0026revision=2019-01-31",
+                  "http://openconfig.net/yang/vlan?module=openconfig-vlan\u0026revision=2019-04-16",
+                  "urn:aristanetworks:yang:experimental:eos?module=arista-exp-eos-mlag\u0026revision=2017-11-29",
+                  "urn:ietf:params:netconf:base:1.0",
+                  "urn:ietf:params:netconf:base:1.1",
+                  "urn:ietf:params:netconf:capability:candidate:1.0",
+                  "urn:ietf:params:netconf:capability:writable-running:1.0",
+                  "urn:ietf:params:xml:ns:netconf:base:1.0",
+                  "urn:ietf:params:xml:ns:netconf:base:1.0?module=ietf-netconf\u0026revision=2011-06-01",
+                  "urn:ietf:params:xml:ns:yang:iana-if-type?module=iana-if-type\u0026revision=2017-01-19",
+                  "urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types\u0026revision=2013-07-15",
+                  "urn:ietf:params:xml:ns:yang:ietf-interfaces?module=ietf-interfaces\u0026revision=2018-02-20",
+                  "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring",
+                  "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring\u0026revision=2010-10-04",
+                  "urn:ietf:params:xml:ns:yang:ietf-yang-types?module=ietf-yang-types\u0026revision=2013-07-15"
+                ]
+              },
+              "datastores": {
+                "datastore": [
+                  {
+                    "name": "running"
+                  }
+                ]
+              },
+              "schemas": {
+                "schema": [
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pf-forwarding-policies",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-forwarding",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-cli",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/cli",
+                    "version": "2020-02-11"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-tunnel",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/interfaces/tunnel",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-network-instance-l3",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/network-instance-l3",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bgp-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bgp/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-platform",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/platform",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bfd-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bfd/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-extensions",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-ext",
+                    "version": "2018-10-17"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-relay-agent",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/relay-agent",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-te",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2-common",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-rsvp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rsvp",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp-shared-attributes",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp",
+                    "version": "2019-10-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-transport-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/transport-types",
+                    "version": "2020-04-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-isis-lsdb-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/isis-lsdb-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-openflow-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openflow/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-qos-acl-config",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/qos/acl",
+                    "version": "2019-11-12"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-poe",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/poe",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-messages",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/messages",
+                    "version": "2018-08-13"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-global",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-platform-chassis",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/platform",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bfd-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bfd/augments",
+                    "version": "2020-01-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "ietf-netconf",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:netconf:base:1.0",
+                    "version": "2011-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls-types",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-local-routing-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/local-routing/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bgp-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bgp/deviations",
+                    "version": "2020-05-27"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lacp-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lacp/deviations",
+                    "version": "2017-09-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2-area-interface",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-system-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/system/notsupported-deviations",
+                    "version": "2020-03-26"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-routing-policy",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/routing-policy",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-srte-policy",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/segment-routing/srte-policy",
+                    "version": "2020-05-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-acl-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/acl/deviations",
+                    "version": "2020-01-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-network-instance",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/network-instance",
+                    "version": "2020-06-20"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-isis-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/isis/augments",
+                    "version": "2020-03-18"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-static",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-system-terminal",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/system/terminal",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-multicast",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/multicast",
+                    "version": "2017-10-20"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-lacp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/lacp",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-interfaces",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/interfaces",
+                    "version": "2019-11-19"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "ietf-interfaces",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
+                    "version": "2018-02-20"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-policy-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-alarms",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/alarms",
+                    "version": "2019-07-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp-types",
+                    "version": "2019-03-14"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-varp-net-inst",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/varp/net-inst",
+                    "version": "2019-05-22"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aaa-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aaa/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-alarm-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/alarms/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-routing-policy-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/routing-policy/notsupported-deviations",
+                    "version": "2020-02-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-linecard",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/linecard",
+                    "version": "2020-05-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-gnoi-cert",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/cert/gnoi-cert",
+                    "version": "2018-01-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-lldp-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/lldp/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bfd-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bfd/deviations",
+                    "version": "2018-08-08"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aaa-tacacs",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aaa",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-neighbor",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-ethernet",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-network-instance-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/network-instance/notsupported-deviations",
+                    "version": "2020-07-31"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-system-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/system/augments",
+                    "version": "2020-03-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-qos",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/qos",
+                    "version": "2017-09-26"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-segment-routing",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/sr",
+                    "version": "2020-03-31"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-mlag",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:aristanetworks:yang:experimental:eos",
+                    "version": "2017-11-29"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "ietf-inet-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
+                    "version": "2013-07-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-system-logging",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/system/logging",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-rpol-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/policy/augments",
+                    "version": "2018-04-12"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2-lsdb",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pf-path-groups",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-forwarding",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-peer-group",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "ietf-yang-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
+                    "version": "2013-07-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-license",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/license",
+                    "version": "2020-04-22"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-aft-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/aft/augments",
+                    "version": "2019-10-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-yang-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/types/yang",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-acl-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/acl/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-common-multiprotocol",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-vlan-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/network-instance/deviations",
+                    "version": "2019-11-13"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lldp-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lldp/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-common",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-eos-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/eos-types",
+                    "version": "2016-10-14"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-varp-intf",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/varp/intf",
+                    "version": "2020-01-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-intf-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/interfaces/deviations",
+                    "version": "2020-04-02"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-mpls",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-igp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-errors",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lacp-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lacp/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-interfaces",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/interfaces",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-ldp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ldp",
+                    "version": "2019-07-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-pim-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/pim/augments",
+                    "version": "2019-04-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-mpls-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/mpls/augments",
+                    "version": "2017-12-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-types",
+                    "version": "2019-04-16"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-network-instance-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/network-instance-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-platform-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/platform/notsupported-deviations",
+                    "version": "2020-07-13"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-procmon",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/system/procmon",
+                    "version": "2019-03-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pf-srte",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-forwarding/sr-te",
+                    "version": "2019-10-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-packet-match",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/header-fields",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-relay-agent-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/relay-agent/deviations",
+                    "version": "2016-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-acl",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/acl",
+                    "version": "2019-11-27"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-policy-forwarding",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-forwarding",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2-global",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp-table-attributes",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp",
+                    "version": "2019-04-25"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-pf",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "iana-if-type",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
+                    "version": "2017-01-19"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-l2protocolforwarding",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/l2protocolforwarding",
+                    "version": "2020-04-16"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-lldp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/lldp",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-system-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/system/deviations",
+                    "version": "2020-01-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/fib-types",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-platform-linecard",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/platform",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-vlan-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/vlan-types",
+                    "version": "2019-01-31"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-local-routing",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/local-routing",
+                    "version": "2020-03-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-openflow-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/openflow/deviations",
+                    "version": "2020-02-26"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-vlan-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/network-instance/vlan/augments",
+                    "version": "2020-01-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aaa-radius",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aaa",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp-attributes",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp",
+                    "version": "2019-10-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-packet-match-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/packet-match-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lldp-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lldp/augments",
+                    "version": "2018-03-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-evpn",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/evpn",
+                    "version": "2020-07-31"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-qos",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/qos",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-local-routing-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/local-routing/deviations",
+                    "version": "2017-11-22"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-port",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/port",
+                    "version": "2020-05-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-if-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-interfaces-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/interfaces/notsupported-deviations",
+                    "version": "2020-03-27"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospfv2-area",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospfv2",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-ipv4",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-ip",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/interfaces/ip",
+                    "version": "2019-01-08"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-igmp-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/igmp/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-isis",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-isis",
+                    "version": "2020-03-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "vlan-translation",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/vlan-translation",
+                    "version": "2019-07-31"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-qos-interfaces",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/qos",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp-tables",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp",
+                    "version": "2019-10-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-psu",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/psu",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-qos-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/qos/augments",
+                    "version": "2020-06-05"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-isis-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/isis-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-bgp-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/bgp/augments",
+                    "version": "2020-05-27"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-qos-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/qos-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-segment-routing-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/segment-routing-types",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aft-ipv6",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aft",
+                    "version": "2019-11-07"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform",
+                    "version": "2019-04-16"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pim",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/pim",
+                    "version": "2019-07-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lldp-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lldp/deviations",
+                    "version": "2018-04-02"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls-sr",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls-sr",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospf-policy",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospf-policy",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-mpls",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/mpls",
+                    "version": "2019-03-26"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-platform-node",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/platform",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-messages-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/messages/notsupported-deviations",
+                    "version": "2020-02-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-policy",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp-policy",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-srte-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/policy-forwarding/augments",
+                    "version": "2020-03-03"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bfd",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bfd",
+                    "version": "2020-05-08"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-qos-elements",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/qos",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-common-structure",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-ospf-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/ospf-types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-rpol-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/policy/deviations",
+                    "version": "2016-02-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-transceiver",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/transceiver",
+                    "version": "2020-05-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-vxlan-config",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/vxlan/config",
+                    "version": "2018-08-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-qos-notsupported-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/qos/notsupported-deviations",
+                    "version": "2020-06-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-aaa",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/aaa",
+                    "version": "2019-10-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-isis-routing",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-isis",
+                    "version": "2020-03-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pf-interfaces",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/policy-forwarding",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-common",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp",
+                    "version": "2019-07-10"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-bgp-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/bgp-types",
+                    "version": "2020-06-17"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-lacp-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/lacp/augments",
+                    "version": "2017-09-14"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-system-management",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/system/management",
+                    "version": "2020-01-14"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-mpls-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/mpls/deviations",
+                    "version": "2018-03-19"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-qos",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/qos",
+                    "version": "2019-11-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform-types",
+                    "version": "2019-06-03"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-netinst-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/network-instances/deviations",
+                    "version": "2019-05-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-ethernet",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/interfaces/ethernet",
+                    "version": "2020-05-06"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-rib-bgp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/rib/bgp",
+                    "version": "2019-10-15"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-vxlan",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/vxlan",
+                    "version": "2018-08-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-isis-deviations",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/isis/deviations",
+                    "version": "2019-05-14"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-fan",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/fan",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-platform-cpu",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/platform/cpu",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "ietf-netconf-monitoring",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring",
+                    "version": "2010-10-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-hercules-platform-port",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/hercules/platform",
+                    "version": "2018-06-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-if-aggregate",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/interfaces/aggregate",
+                    "version": "2020-05-01"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-srte-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/policy-forwarding/augments",
+                    "version": "2020-01-28"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos",
+                    "version": "2016-11-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-igmp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/igmp",
+                    "version": "2019-07-09"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-inet-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/types/inet",
+                    "version": "2019-04-25"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-isis-lsp",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openconfig-isis",
+                    "version": "2020-03-24"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-qos-config",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/eos/qos/config",
+                    "version": "2017-09-26"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-system",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/system",
+                    "version": "2020-03-25"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-openflow",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/openflow",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-pim-types",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/pim/types",
+                    "version": "2018-11-21"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-network-instance-l2",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/network-instance",
+                    "version": "2020-06-20"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-rpc-netconf",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/rpc/netconf",
+                    "version": "2018-01-04"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-intf-augments",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/openconfig/interfaces/augments",
+                    "version": "2020-05-13"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "openconfig-vlan",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://openconfig.net/yang/vlan",
+                    "version": "2019-04-16"
+                  },
+                  {
+                    "format": "yang",
+                    "identifier": "arista-exp-eos-igmpsnooping",
+                    "location": [
+                      "NETCONF"
+                    ],
+                    "namespace": "http://arista.com/yang/experimental/igmpsnooping",
+                    "version": "2017-10-23"
+                  }
+                ]
+              },
+              "sessions": {
+                "session": []
+              },
+              "statistics": {
+                "dropped-sessions": 0,
+                "in-bad-hellos": 0,
+                "in-bad-rpcs": 0,
+                "in-rpcs": 0,
+                "in-sessions": 0,
+                "out-notifications": 0,
+                "out-rpc-errors": 0
+              }
+            },
+            "openconfig-acl:acl": {
+              "state": {
+                "counter-capability": "AGGREGATE_ONLY"
+              }
+            },
+            "openconfig-bfd:bfd": {
+              "arista-bfd-augments:config": {
+                "desired-minimum-tx-interval": 300,
+                "detection-multiplier": 3,
+                "enabled": true,
+                "local-address": [],
+                "multihop-desired-minimum-tx-interval": 300,
+                "multihop-detection-multiplier": 3,
+                "multihop-required-minimum-receive": 300,
+                "required-minimum-receive": 300,
+                "slow-timer": 2000
+              }
+            },
+            "openconfig-interfaces:interfaces": {
+              "interface": [
+                {
+                  "config": {
+                    "arista-intf-augments:load-interval": 300,
+                    "description": "",
+                    "enabled": true,
+                    "loopback-mode": false,
+                    "mtu": 0,
+                    "name": "Ethernet510",
+                    "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+                    "type": "iana-if-type:ethernetCsmacd"
+                  },
+                  "hold-time": {
+                    "config": {
+                      "down": 0,
+                      "up": 0
+                    },
+                    "state": {
+                      "down": 0,
+                      "up": 0
+                    }
+                  },
+                  "name": "Ethernet510",
+                  "openconfig-if-ethernet:ethernet": {
+                    "arista-intf-augments:pfc": {
+                      "priorities": {
+                        "priority": [
+                          {
+                            "index": 0,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 0,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 1,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 1,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 2,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 2,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 3,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 3,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 4,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 4,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 5,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 5,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 6,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 6,
+                              "out-frames": "0"
+                            }
+                          },
+                          {
+                            "index": 7,
+                            "state": {
+                              "in-frames": "0",
+                              "index": 7,
+                              "out-frames": "0"
+                            }
+                          }
+                        ]
+                      }
+                    },
+                    "config": {
+                      "arista-intf-augments:fec-encoding": {
+                        "disabled": false,
+                        "fire-code": false,
+                        "reed-solomon": false,
+                        "reed-solomon544": false
+                      },
+                      "arista-intf-augments:sfp-1000base-t": false,
+                      "mac-address": "00:00:00:00:00:00",
+                      "openconfig-hercules-interfaces:forwarding-viable": true,
+                      "port-speed": "SPEED_UNKNOWN"
+                    },
+                    "state": {
+                      "arista-intf-augments:supported-speeds": [
+                        "SPEED_200GB_8LANE",
+                        "SPEED_100MB",
+                        "SPEED_1GB",
+                        "SPEED_10GB",
+                        "SPEED_400GB",
+                        "SPEED_40GB",
+                        "SPEED_2500MB",
+                        "SPEED_50GB",
+                        "SPEED_50GB_1LANE",
+                        "SPEED_25GB",
+                        "SPEED_100GB",
+                        "SPEED_100GB_2LANE",
+                        "SPEED_10MB",
+                        "SPEED_200GB_4LANE",
+                        "SPEED_5GB"
+                      ],
+                      "auto-negotiate": false,
+                      "counters": {
+                        "in-crc-errors": "0",
+                        "in-fragment-frames": "0",
+                        "in-jabber-frames": "0",
+                        "in-mac-control-frames": "0",
+                        "in-mac-pause-frames": "0",
+                        "in-oversize-frames": "0",
+                        "out-mac-control-frames": "0",
+                        "out-mac-pause-frames": "0"
+                      },
+                      "duplex-mode": "FULL",
+                      "enable-flow-control": false,
+                      "hw-mac-address": "02:42:c0:a8:02:42",
+                      "mac-address": "02:42:c0:a8:02:42",
+                      "negotiated-port-speed": "SPEED_UNKNOWN",
+                      "openconfig-hercules-interfaces:forwarding-viable": true,
+                      "port-speed": "SPEED_UNKNOWN"
+                    }
+                  },
+                  "state": {
+                    "admin-status": "UP",
+                    "arista-intf-augments:inactive": false,
+                    "counters": {
+                      "in-broadcast-pkts": "344691",
+                      "in-discards": "0",
+                      "in-errors": "0",
+                      "in-fcs-errors": "0",
+                      "in-multicast-pkts": "1",
+                      "in-octets": "93260151",
+                      "in-unicast-pkts": "0",
+                      "out-broadcast-pkts": "0",
+                      "out-discards": "0",
+                      "out-errors": "0",
+                      "out-multicast-pkts": "0",
+                      "out-octets": "0",
+                      "out-unicast-pkts": "0"
+                    },
+                    "description": "",
+                    "enabled": true,
+                    "ifindex": 510,
+                    "last-change": "1614091948142304000",
+                    "loopback-mode": false,
+                    "mtu": 0,
+                    "name": "Ethernet510",
+                    "openconfig-platform-port:hardware-port": "Port510",
+                    "openconfig-vlan:tpid": "openconfig-vlan-types:TPID_0X8100",
+                    "oper-status": "UP",
+                    "type": "iana-if-type:ethernetCsmacd"
+                  },
+                  "subinterfaces": {
+                    "subinterface": [
+                      {
+                        "config": {
+                          "description": "",
+                          "enabled": true,
+                          "index": 0
+                        },
+                        "index": 0,
+                        "openconfig-if-ip:ipv4": {
+                          "config": {
+                            "dhcp-client": false,
+                            "enabled": false,
+                            "mtu": 1500
+                          },
+                          "state": {
+                            "dhcp-client": false,
+                            "enabled": false,
+                            "mtu": 1500
+                          },
+                          "unnumbered": {
+                            "config": {
+                              "enabled": false
+                            },
+                            "state": {
+                              "enabled": false
+                            }
+                          }
+                        },
+                        "openconfig-if-ip:ipv6": {
+                          "config": {
+                            "dhcp-client": false,
+                            "enabled": false,
+                            "mtu": 1500
+                          },
+                          "state": {
+                            "dhcp-client": false,
+                            "enabled": false,
+                            "mtu": 1500
+                          }
+                        },
+                        "state": {
+                          "counters": {
+                            "in-fcs-errors": "0"
+                          },
+                          "description": "",
+                          "enabled": true,
+                          "index": 0
+                        }
+                      }
+                    ]
+                  }
+                }
+              ]
+            },
+            "openconfig-lacp:lacp": {
+              "config": {
+                "system-priority": 32768
+              },
+              "state": {
+                "system-priority": 32768
+              }
+            },
+            "openconfig-lldp:lldp": {
+              "config": {
+                "arista-lldp-augments:management-address": {
+                  "interface": "",
+                  "network-instance": "default",
+                  "transmit-mode": "BEST"
+                },
+                "chassis-id": "02:42:c0:6c:64:78",
+                "chassis-id-type": "MAC_ADDRESS",
+                "enabled": true,
+                "hello-timer": "30",
+                "suppress-tlv-advertisement": [],
+                "system-description": "",
+                "system-name": "localhost"
+              },
+              "interfaces": {
+                "interface": [
+                  {
+                    "config": {
+                      "enabled": true,
+                      "name": "Ethernet510"
+                    },
+                    "name": "Ethernet510",
+                    "state": {
+                      "counters": {
+                        "frame-discard": "0",
+                        "frame-error-in": "0",
+                        "frame-in": "0",
+                        "frame-out": "26299",
+                        "tlv-discard": "0",
+                        "tlv-unknown": "0"
+                      },
+                      "enabled": true,
+                      "name": "Ethernet510"
+                    }
+                  }
+                ]
+              },
+              "state": {
+                "chassis-id": "02:42:c0:6c:64:78",
+                "chassis-id-type": "MAC_ADDRESS",
+                "enabled": true,
+                "hello-timer": "30",
+                "suppress-tlv-advertisement": [],
+                "system-description": "",
+                "system-name": "localhost"
+              }
+            },
+            "openconfig-network-instance:network-instances": {
+              "network-instance": [
+                {
+                  "arista-exp-eos-varp-net-inst:arista-varp": {
+                    "config": {
+                      "virtual-mac-address": "00:00:00:00:00:00"
+                    },
+                    "state": {
+                      "virtual-mac-address": "00:00:00:00:00:00"
+                    }
+                  },
+                  "config": {
+                    "enabled-address-families": [],
+                    "name": "default",
+                    "type": "openconfig-network-instance-types:DEFAULT_INSTANCE"
+                  },
+                  "inter-instance-policies": {
+                    "apply-policy": {
+                      "config": {
+                        "default-import-policy": "REJECT_ROUTE"
+                      }
+                    }
+                  },
+                  "mpls": {
+                    "global": {
+                      "config": {
+                        "null-label": "openconfig-mpls-types:IMPLICIT"
+                      },
+                      "reserved-label-blocks": {
+                        "reserved-label-block": [
+                          {
+                            "config": {
+                              "local-id": "isis-sr",
+                              "lower-bound": 900000,
+                              "upper-bound": 965535
+                            },
+                            "local-id": "isis-sr"
+                          },
+                          {
+                            "config": {
+                              "local-id": "bgp-sr",
+                              "lower-bound": 900000,
+                              "upper-bound": 965535
+                            },
+                            "local-id": "bgp-sr"
+                          },
+                          {
+                            "config": {
+                              "local-id": "srlb",
+                              "lower-bound": 965536,
+                              "upper-bound": 1031071
+                            },
+                            "local-id": "srlb"
+                          },
+                          {
+                            "config": {
+                              "local-id": "l2evpn",
+                              "lower-bound": 1036288,
+                              "upper-bound": 1048575
+                            },
+                            "local-id": "l2evpn"
+                          },
+                          {
+                            "config": {
+                              "local-id": "dynamic",
+                              "lower-bound": 100000,
+                              "upper-bound": 362143
+                            },
+                            "local-id": "dynamic"
+                          },
+                          {
+                            "config": {
+                              "local-id": "static",
+                              "lower-bound": 16,
+                              "upper-bound": 99999
+                            },
+                            "local-id": "static"
+                          }
+                        ]
+                      }
+                    }
+                  },
+                  "name": "default",
+                  "protocols": {
+                    "protocol": [
+                      {
+                        "config": {
+                          "identifier": "openconfig-policy-types:DIRECTLY_CONNECTED",
+                          "name": "DIRECTLY_CONNECTED"
+                        },
+                        "identifier": "openconfig-policy-types:DIRECTLY_CONNECTED",
+                        "name": "DIRECTLY_CONNECTED"
+                      },
+                      {
+                        "config": {
+                          "identifier": "openconfig-policy-types:STATIC",
+                          "name": "STATIC"
+                        },
+                        "identifier": "openconfig-policy-types:STATIC",
+                        "name": "STATIC",
+                        "static-routes": {
+                          "static": [
+                            {
+                              "config": {
+                                "prefix": "::/0"
+                              },
+                              "next-hops": {
+                                "next-hop": [
+                                  {
+                                    "config": {
+                                      "index": "AUTO_1_fdfd--1",
+                                      "metric": 1,
+                                      "next-hop": "fdfd::1"
+                                    },
+                                    "index": "AUTO_1_fdfd--1"
+                                  }
+                                ]
+                              },
+                              "prefix": "::/0"
+                            },
+                            {
+                              "config": {
+                                "prefix": "0.0.0.0/0"
+                              },
+                              "next-hops": {
+                                "next-hop": [
+                                  {
+                                    "config": {
+                                      "index": "AUTO_1_192-168-2-1",
+                                      "metric": 1,
+                                      "next-hop": "192.168.2.1"
+                                    },
+                                    "index": "AUTO_1_192-168-2-1"
+                                  }
+                                ]
+                              },
+                              "prefix": "0.0.0.0/0"
+                            }
+                          ]
+                        }
+                      },
+                      {
+                        "bgp": {
+                          "global": {
+                            "afi-safis": {
+                              "afi-safi": [
+                                {
+                                  "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST",
+                                  "config": {
+                                    "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST"
+                                  },
+                                  "state": {
+                                    "afi-safi-name": "openconfig-bgp-types:IPV6_UNICAST"
+                                  }
+                                },
+                                {
+                                  "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST",
+                                  "config": {
+                                    "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST"
+                                  },
+                                  "state": {
+                                    "afi-safi-name": "openconfig-bgp-types:IPV4_UNICAST"
+                                  }
+                                }
+                              ]
+                            },
+                            "use-multiple-paths": {
+                              "config": {
+                                "enabled": true
+                              },
+                              "state": {
+                                "enabled": true
+                              }
+                            }
+                          }
+                        },
+                        "config": {
+                          "identifier": "openconfig-policy-types:BGP",
+                          "name": "BGP"
+                        },
+                        "identifier": "openconfig-policy-types:BGP",
+                        "name": "BGP"
+                      },
+                      {
+                        "config": {
+                          "identifier": "openconfig-policy-types:PIM",
+                          "name": "PIM"
+                        },
+                        "identifier": "openconfig-policy-types:PIM",
+                        "name": "PIM",
+                        "state": {
+                          "identifier": "openconfig-policy-types:PIM",
+                          "name": "PIM"
+                        }
+                      }
+                    ]
+                  },
+                  "segment-routing": {
+                    "srgbs": {
+                      "srgb": [
+                        {
+                          "config": {
+                            "dataplane-type": "MPLS",
+                            "local-id": "isis-sr",
+                            "mpls-label-blocks": [
+                              "isis-sr"
+                            ]
+                          },
+                          "local-id": "isis-sr"
+                        }
+                      ]
+                    },
+                    "srlbs": {
+                      "srlb": [
+                        {
+                          "config": {
+                            "dataplane-type": "MPLS",
+                            "local-id": "srlb",
+                            "mpls-label-block": "srlb"
+                          },
+                          "local-id": "srlb"
+                        }
+                      ]
+                    }
+                  },
+                  "tables": {
+                    "table": [
+                      {
+                        "address-family": "openconfig-types:IPV4",
+                        "config": {
+                          "address-family": "openconfig-types:IPV4",
+                          "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED"
+                        },
+                        "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED"
+                      },
+                      {
+                        "address-family": "openconfig-types:IPV6",
+                        "config": {
+                          "address-family": "openconfig-types:IPV6",
+                          "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED"
+                        },
+                        "protocol": "openconfig-policy-types:DIRECTLY_CONNECTED"
+                      },
+                      {
+                        "address-family": "openconfig-types:IPV4",
+                        "config": {
+                          "address-family": "openconfig-types:IPV4",
+                          "protocol": "openconfig-policy-types:STATIC"
+                        },
+                        "protocol": "openconfig-policy-types:STATIC"
+                      },
+                      {
+                        "address-family": "openconfig-types:IPV6",
+                        "config": {
+                          "address-family": "openconfig-types:IPV6",
+                          "protocol": "openconfig-policy-types:STATIC"
+                        },
+                        "protocol": "openconfig-policy-types:STATIC"
+                      }
+                    ]
+                  },
+                  "vlans": {
+                    "vlan": [
+                      {
+                        "config": {
+                          "arista-vlan-augments:mac-learning": true,
+                          "name": "default",
+                          "status": "ACTIVE",
+                          "vlan-id": 1
+                        },
+                        "members": {
+                          "member": [
+                            {
+                              "state": {
+                                "interface": "Ethernet510"
+                              }
+                            }
+                          ]
+                        },
+                        "state": {
+                          "arista-vlan-augments:mac-learning": true,
+                          "name": "default",
+                          "status": "ACTIVE",
+                          "vlan-id": 1
+                        },
+                        "vlan-id": 1
+                      }
+                    ]
+                  }
+                }
+              ]
+            },
+            "openconfig-platform:components": {
+              "component": [
+                {
+                  "config": {
+                    "name": "CPU1"
+                  },
+                  "cpu": {
+                    "openconfig-platform-cpu:utilization": {
+                      "state": {
+                        "avg": 0,
+                        "instant": 0,
+                        "interval": "1000000000000",
+                        "max": 11,
+                        "max-time": "3220922909253935104",
+                        "min": 0,
+                        "min-time": "3220922969253274112"
+                      }
+                    }
+                  },
+                  "name": "CPU1",
+                  "state": {
+                    "type": "openconfig-platform-types:CPU"
+                  }
+                },
+                {
+                  "config": {
+                    "name": "CPU2"
+                  },
+                  "cpu": {
+                    "openconfig-platform-cpu:utilization": {
+                      "state": {
+                        "avg": 0,
+                        "instant": 1,
+                        "interval": "1000000000000",
+                        "max": 3,
+                        "max-time": "3220921819260574208",
+                        "min": 0,
+                        "min-time": "3220922939256949248"
+                      }
+                    }
+                  },
+                  "name": "CPU2",
+                  "state": {
+                    "type": "openconfig-platform-types:CPU"
+                  }
+                },
+                {
+                  "config": {
+                    "name": "CPU3"
+                  },
+                  "cpu": {
+                    "openconfig-platform-cpu:utilization": {
+                      "state": {
+                        "avg": 0,
+                        "instant": 0,
+                        "interval": "1000000000000",
+                        "max": 11,
+                        "max-time": "3220922009258855936",
+                        "min": 0,
+                        "min-time": "3220922969253549568"
+                      }
+                    }
+                  },
+                  "name": "CPU3",
+                  "state": {
+                    "type": "openconfig-platform-types:CPU"
+                  }
+                },
+                {
+                  "config": {
+                    "name": "CPU0"
+                  },
+                  "cpu": {
+                    "openconfig-platform-cpu:utilization": {
+                      "state": {
+                        "avg": 0,
+                        "instant": 0,
+                        "interval": "1000000000000",
+                        "max": 3,
+                        "max-time": "3220922909253848064",
+                        "min": 0,
+                        "min-time": "3220922969253206528"
+                      }
+                    }
+                  },
+                  "name": "CPU0",
+                  "state": {
+                    "type": "openconfig-platform-types:CPU"
+                  }
+                },
+                {
+                  "config": {
+                    "name": "Chassis"
+                  },
+                  "name": "Chassis",
+                  "state": {
+                    "memory": {
+                      "available": "4127031296",
+                      "utilized": "3911405568"
+                    },
+                    "name": "Chassis",
+                    "type": "openconfig-platform-types:CHASSIS"
+                  }
+                },
+                {
+                  "config": {
+                    "name": "Port510"
+                  },
+                  "name": "Port510",
+                  "state": {
+                    "name": "Port510"
+                  }
+                }
+              ]
+            },
+            "openconfig-routing-policy:routing-policy": {
+              "defined-sets": {
+                "prefix-sets": {
+                  "prefix-set": []
+                }
+              },
+              "policy-definitions": {
+                "policy-definition": []
+              }
+            },
+            "openconfig-system:system": {
+              "aaa": {
+                "arista-system-augments:global": {
+                  "radius": {
+                    "config": {
+                      "retransmit-attempts": 3,
+                      "timeout": 5
+                    },
+                    "state": {
+                      "retransmit-attempts": 3,
+                      "timeout": 5
+                    }
+                  },
+                  "tacacs": {
+                    "config": {
+                      "timeout": 5
+                    },
+                    "state": {
+                      "timeout": 5
+                    }
+                  }
+                },
+                "authentication": {
+                  "config": {
+                    "authentication-method": [
+                      "openconfig-aaa-types:LOCAL"
+                    ]
+                  },
+                  "state": {
+                    "authentication-method": [
+                      "openconfig-aaa-types:LOCAL"
+                    ]
+                  },
+                  "users": {
+                    "user": [
+                      {
+                        "config": {
+                          "password-hashed": "$6$TA00T9txFfm8ez7I$CPgZxMSvbkc3IODR3h.5dnel2K5N3dcuZ6qmwd8u8HDaMhViG9YSbHQaDeH7cQYV4zWz.5eOsjreQZac9LkgO/",
+                          "role": "openconfig-aaa-types:SYSTEM_ROLE_ADMIN",
+                          "username": "admin"
+                        },
+                        "state": {
+                          "password-hashed": "$6$TA00T9txFfm8ez7I$CPgZxMSvbkc3IODR3h.5dnel2K5N3dcuZ6qmwd8u8HDaMhViG9YSbHQaDeH7cQYV4zWz.5eOsjreQZac9LkgO/",
+                          "role": "openconfig-aaa-types:SYSTEM_ROLE_ADMIN",
+                          "username": "admin"
+                        },
+                        "username": "admin"
+                      }
+                    ]
+                  }
+                }
+              },
+              "arista-system-augments:fhrp": {
+                "config": {
+                  "accept-mode": "DISABLED"
+                }
+              },
+              "config": {},
+              "dns": {
+                "config": {
+                  "arista-system-augments:network-instance": "default"
+                },
+                "state": {
+                  "arista-system-augments:network-instance": "default"
+                }
+              },
+              "grpc-server": {
+                "config": {
+                  "certificate-id": "",
+                  "enable": true,
+                  "port": 6030,
+                  "transport-security": false
+                },
+                "state": {
+                  "certificate-id": "",
+                  "enable": true,
+                  "port": 6030,
+                  "transport-security": false
+                }
+              },
+              "memory": {
+                "state": {
+                  "physical": "4127031296",
+                  "reserved": "3911405568"
+                }
+              },
+              "ntp": {
+                "config": {
+                  "enable-ntp-auth": false,
+                  "enabled": false
+                },
+                "state": {
+                  "enable-ntp-auth": false,
+                  "enabled": false
+                }
+              },
+              "openconfig-openflow:openflow": {
+                "agent": {
+                  "config": {
+                    "inactivity-probe": "10"
+                  },
+                  "state": {
+                    "inactivity-probe": "10"
+                  }
+                }
+              },
+              "processes": {
+                "process": [
+                  {
+                    "pid": "966",
+                    "state": {
+                      "args": [
+                        "--agenttitle=McastCommon6 --dlopen procmgr /usr/bin/McastCommon6"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1650688",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "966",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "1001",
+                    "state": {
+                      "args": [
+                        "--agenttitle=SharedSecretProfile --dlopen procmgr /usr/bin/SharedSecretProfile"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1601536",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "1001",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "297",
+                    "state": {
+                      "args": [
+                        "-n"
+                      ],
+                      "cpu-usage-system": "761",
+                      "cpu-usage-user": "114",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2633728",
+                      "memory-utilization": 0,
+                      "name": "crond",
+                      "pid": "297",
+                      "start-time": "1622215617635663872"
+                    }
+                  },
+                  {
+                    "pid": "960",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "151115",
+                      "cpu-usage-user": "54927",
+                      "cpu-utilization": 0,
+                      "memory-usage": "69464064",
+                      "memory-utilization": 1,
+                      "name": "AgentMonitor",
+                      "pid": "960",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "364",
+                    "state": {
+                      "args": [
+                        "--dedup --compress --priority Sysdb --maxFiles 1000 /var/tmp/Fossil /mnt/flash/Fossil"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "8",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1802240",
+                      "memory-utilization": 0,
+                      "name": "SaveFossil",
+                      "pid": "364",
+                      "start-time": "1622215617635663872"
+                    }
+                  },
+                  {
+                    "pid": "956",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "956",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "167",
+                    "state": {
+                      "args": [
+                        "-f"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2166784",
+                      "memory-utilization": 0,
+                      "name": "lvmetad",
+                      "pid": "167",
+                      "start-time": "1622215614635663872"
+                    }
+                  },
+                  {
+                    "pid": "972",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Arp --dlopen procmgr /usr/bin/Arp"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1617920",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "972",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "933",
+                    "state": {
+                      "args": [
+                        "--agenttitle=PortSec --dlopen procmgr /usr/bin/PortSec"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1634304",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "933",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "924",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "20568",
+                      "cpu-usage-user": "4995",
+                      "cpu-utilization": 0,
+                      "memory-usage": "107622400",
+                      "memory-utilization": 2,
+                      "name": "SuperServer",
+                      "pid": "924",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "941",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "941",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "940",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "4552",
+                      "cpu-usage-user": "11063",
+                      "cpu-utilization": 0,
+                      "memory-usage": "91471872",
+                      "memory-utilization": 2,
+                      "name": "Lag",
+                      "pid": "940",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "938",
+                    "state": {
+                      "args": [
+                        "--agenttitle=StpTxRx --dlopen procmgr /usr/bin/StpTxRx"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1638400",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "938",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "224",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1346",
+                      "cpu-usage-user": "264",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1458176",
+                      "memory-utilization": 0,
+                      "name": "ProcMonitor",
+                      "pid": "224",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "970",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "970",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "997",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "997",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "951",
+                    "state": {
+                      "args": [
+                        "--agenttitle=StpTopology --dlopen procmgr /usr/bin/StpTopology"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1638400",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "951",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "974",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1303",
+                      "cpu-usage-user": "2836",
+                      "cpu-utilization": 0,
+                      "memory-usage": "82403328",
+                      "memory-utilization": 1,
+                      "name": "McastCommon6",
+                      "pid": "974",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "929",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Lag --dlopen procmgr /usr/bin/Lag"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1642496",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "929",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "1003",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1918",
+                      "cpu-usage-user": "4022",
+                      "cpu-utilization": 0,
+                      "memory-usage": "99753984",
+                      "memory-utilization": 2,
+                      "name": "IgmpSnooping",
+                      "pid": "1003",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "497",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "9497",
+                      "cpu-usage-user": "2576",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2473984",
+                      "memory-utilization": 0,
+                      "name": "SlabMonitor",
+                      "pid": "497",
+                      "start-time": "1622215644635663872"
+                    }
+                  },
+                  {
+                    "pid": "1004",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "1004",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "968",
+                    "state": {
+                      "args": [
+                        "--agenttitle=LacpTxAgent --dlopen procmgr /usr/bin/LacpTxAgent"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1638400",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "968",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "936",
+                    "state": {
+                      "args": [
+                        "--agenttitle=EventMgr --dlopen procmgr /usr/bin/EventMgr"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1736704",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "936",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "946",
+                    "state": {
+                      "args": [
+                        "--agenttitle=FibServices --dlopen procmgr /usr/bin/FibServices"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1716224",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "946",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "935",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "935",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "977",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "977",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "597",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "24815",
+                      "cpu-usage-user": "28918",
+                      "cpu-utilization": 0,
+                      "memory-usage": "153731072",
+                      "memory-utilization": 3,
+                      "name": "Sysdb",
+                      "pid": "597",
+                      "start-time": "1622215646635663872"
+                    }
+                  },
+                  {
+                    "pid": "672",
+                    "state": {
+                      "args": [
+                        "       /usr/bin/Cli"
+                      ],
+                      "cpu-usage-system": "1050",
+                      "cpu-usage-user": "1606",
+                      "cpu-utilization": 0,
+                      "memory-usage": "13520896",
+                      "memory-utilization": 0,
+                      "name": "CliShell",
+                      "pid": "672",
+                      "start-time": "1622215648635663872"
+                    }
+                  },
+                  {
+                    "pid": "949",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "949",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "980",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "6315",
+                      "cpu-usage-user": "16098",
+                      "cpu-utilization": 0,
+                      "memory-usage": "76705792",
+                      "memory-utilization": 1,
+                      "name": "Stp",
+                      "pid": "980",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "748",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2838528",
+                      "memory-utilization": 0,
+                      "name": "bash",
+                      "pid": "748",
+                      "start-time": "1622215658635663872"
+                    }
+                  },
+                  {
+                    "pid": "947",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1661",
+                      "cpu-usage-user": "4080",
+                      "cpu-utilization": 0,
+                      "memory-usage": "100040704",
+                      "memory-utilization": 2,
+                      "name": "Ira",
+                      "pid": "947",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "927",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2095",
+                      "cpu-usage-user": "4769",
+                      "cpu-utilization": 0,
+                      "memory-usage": "82345984",
+                      "memory-utilization": 1,
+                      "name": "Lldp",
+                      "pid": "927",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "926",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "926",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "993",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Ebra --dlopen procmgr /usr/bin/Ebra"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1564672",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "993",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "967",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2258",
+                      "cpu-usage-user": "2317",
+                      "cpu-utilization": 0,
+                      "memory-usage": "79106048",
+                      "memory-utilization": 1,
+                      "name": "Tunnel",
+                      "pid": "967",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "983",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1468",
+                      "cpu-usage-user": "3094",
+                      "cpu-utilization": 0,
+                      "memory-usage": "83124224",
+                      "memory-utilization": 2,
+                      "name": "LacpTxAgent",
+                      "pid": "983",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "995",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2180",
+                      "cpu-usage-user": "3209",
+                      "cpu-utilization": 0,
+                      "memory-usage": "79425536",
+                      "memory-utilization": 1,
+                      "name": "Qos",
+                      "pid": "995",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "954",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Tunnel --dlopen procmgr /usr/bin/Tunnel"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1642496",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "954",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "391",
+                    "state": {
+                      "args": [
+                        "-m -r -e modify -e create -e delete -e attrib -e move ."
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1576960",
+                      "memory-utilization": 0,
+                      "name": "inotifywait",
+                      "pid": "391",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "969",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "6349",
+                      "cpu-usage-user": "17003",
+                      "cpu-utilization": 0,
+                      "memory-usage": "99954688",
+                      "memory-utilization": 2,
+                      "name": "Acl",
+                      "pid": "969",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "964",
+                    "state": {
+                      "args": [
+                        "--agenttitle=KernelNetworkInfo --dlopen procmgr /usr/bin/KernelNetworkInfo"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1544192",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "964",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "998",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2018",
+                      "cpu-usage-user": "4711",
+                      "cpu-utilization": 0,
+                      "memory-usage": "92426240",
+                      "memory-utilization": 2,
+                      "name": "Ebra",
+                      "pid": "998",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "962",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "962",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "958",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "958",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "1002",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1881",
+                      "cpu-usage-user": "3990",
+                      "cpu-utilization": 0,
+                      "memory-usage": "91709440",
+                      "memory-utilization": 2,
+                      "name": "KernelFib",
+                      "pid": "1002",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "950",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1604",
+                      "cpu-usage-user": "2701",
+                      "cpu-utilization": 0,
+                      "memory-usage": "92332032",
+                      "memory-utilization": 2,
+                      "name": "Aaa",
+                      "pid": "950",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "418",
+                    "state": {
+                      "args": [
+                        "/usr/sbin/core_annotate_util daemon"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2588672",
+                      "memory-utilization": 0,
+                      "name": "core_annotate_u",
+                      "pid": "418",
+                      "start-time": "1622215625635663872"
+                    }
+                  },
+                  {
+                    "pid": "963",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Stp --dlopen procmgr /usr/bin/Stp"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1613824",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "963",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "434",
+                    "state": {
+                      "args": [
+                        "-e modify /var/lib/rpm"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "569344",
+                      "memory-utilization": 0,
+                      "name": "inotifywait",
+                      "pid": "434",
+                      "start-time": "1622215625635663872"
+                    }
+                  },
+                  {
+                    "pid": "981",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2124",
+                      "cpu-usage-user": "4414",
+                      "cpu-utilization": 0,
+                      "memory-usage": "98656256",
+                      "memory-utilization": 2,
+                      "name": "Arp",
+                      "pid": "981",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "939",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "939",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "942",
+                    "state": {
+                      "args": [
+                        "--agenttitle=AgentMonitor --dlopen procmgr /usr/bin/AgentMonitor"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1593344",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "942",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "975",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "975",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "979",
+                    "state": {
+                      "args": [
+                        "--agenttitle=ReloadCauseAgent --dlopen procmgr /usr/bin/ReloadCauseAgent"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1650688",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "979",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "477",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "57053184",
+                      "memory-utilization": 1,
+                      "name": "ProcMgr-master",
+                      "pid": "477",
+                      "start-time": "1622215644635663872"
+                    }
+                  },
+                  {
+                    "pid": "984",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Qos --dlopen procmgr /usr/bin/Qos"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1638400",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "984",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "948",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "14678",
+                      "cpu-usage-user": "2950",
+                      "cpu-utilization": 0,
+                      "memory-usage": "84791296",
+                      "memory-utilization": 2,
+                      "name": "EventMgr",
+                      "pid": "948",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "971",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "971",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "994",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "994",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "934",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Ira --dlopen procmgr /usr/bin/Ira"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1642496",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "934",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "368",
+                    "state": {
+                      "args": [
+                        "-m -r -e modify -e create -e delete -e attrib -e move ."
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "610304",
+                      "memory-utilization": 0,
+                      "name": "inotifywait",
+                      "pid": "368",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "1008",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "42879814",
+                      "cpu-usage-user": "35050036",
+                      "cpu-utilization": 0,
+                      "memory-usage": "123768832",
+                      "memory-utilization": 2,
+                      "name": "Etba",
+                      "pid": "1008",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "1005",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1781",
+                      "cpu-usage-user": "1923",
+                      "cpu-utilization": 0,
+                      "memory-usage": "69140480",
+                      "memory-utilization": 1,
+                      "name": "SharedSecretPro",
+                      "pid": "1005",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "982",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "982",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "264",
+                    "state": {
+                      "args": [
+                        "-stayalive -pidfile /var/run/xinetd.pid"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2289664",
+                      "memory-utilization": 0,
+                      "name": "xinetd",
+                      "pid": "264",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "216",
+                    "state": {
+                      "args": [
+                        "--ignorenodev --daemon --foreground"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1667072",
+                      "memory-utilization": 0,
+                      "name": "mcelog",
+                      "pid": "216",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "921",
+                    "state": {
+                      "args": [
+                        "--agenttitle=McastCommon --dlopen procmgr /usr/bin/McastCommon"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1630208",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "921",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "991",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "991",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "943",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2005",
+                      "cpu-usage-user": "2261",
+                      "cpu-utilization": 0,
+                      "memory-usage": "77414400",
+                      "memory-utilization": 1,
+                      "name": "PortSec",
+                      "pid": "943",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "367",
+                    "state": {
+                      "args": [
+                        "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/local.new . \u0026\u0026 mv /mnt/flash/persist/local.new /mnt/flash/persist/local || logger -t SetupPersist Failed to update /mnt/flash/persist/local --daemon --logfile=/var/log/inotifyrun-local.log --pidfile=/var/run/inotifyrun-local.pid /persist/local"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "5214208",
+                      "memory-utilization": 0,
+                      "name": "python",
+                      "pid": "367",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "452",
+                    "state": {
+                      "args": [
+                        "  -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "36",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "12582912",
+                      "memory-utilization": 0,
+                      "name": "netnsd-server",
+                      "pid": "452",
+                      "start-time": "1622215643635663872"
+                    }
+                  },
+                  {
+                    "pid": "992",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "2232",
+                      "cpu-usage-user": "2673",
+                      "cpu-utilization": 0,
+                      "memory-usage": "80261120",
+                      "memory-utilization": 1,
+                      "name": "L2Rib",
+                      "pid": "992",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "479",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "83165",
+                      "cpu-usage-user": "258040",
+                      "cpu-utilization": 0,
+                      "memory-usage": "21934080",
+                      "memory-utilization": 0,
+                      "name": "ProcMgr-worker",
+                      "pid": "479",
+                      "start-time": "1622215644635663872"
+                    }
+                  },
+                  {
+                    "pid": "999",
+                    "state": {
+                      "args": [
+                        "--agenttitle=KernelFib --dlopen procmgr /usr/bin/KernelFib"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1634304",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "999",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "959",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1346",
+                      "cpu-usage-user": "2865",
+                      "cpu-utilization": 0,
+                      "memory-usage": "79597568",
+                      "memory-utilization": 1,
+                      "name": "StpTopology",
+                      "pid": "959",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "987",
+                    "state": {
+                      "args": [
+                        "--agenttitle=TopoAgent --dlopen procmgr /usr/bin/TopoAgent --scheduled"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1634304",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "987",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "955",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1821",
+                      "cpu-usage-user": "2064",
+                      "cpu-utilization": 0,
+                      "memory-usage": "77361152",
+                      "memory-utilization": 1,
+                      "name": "FibServices",
+                      "pid": "955",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "925",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1318",
+                      "cpu-usage-user": "2777",
+                      "cpu-utilization": 0,
+                      "memory-usage": "79773696",
+                      "memory-utilization": 1,
+                      "name": "McastCommon",
+                      "pid": "925",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "390",
+                    "state": {
+                      "args": [
+                        "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/secure.new . \u0026\u0026 sync \u0026\u0026 ( mv /mnt/flash/persist/secure /mnt/flash/persist/secure.old; mv /mnt/flash/persist/secure.new /mnt/flash/persist/secure; sync ) \u0026\u0026 ( scrub --no-signature /mnt/flash/persist/secure.old; rm /mnt/flash/persist/secure.old ) || logger -t SetupPersist Failed to update /mnt/flash/persist/secure --daemon --logfile=/var/log/inotifyrun-secure.log --pidfile=/var/run/inotifyrun-secure.pid /persist/secure"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "5169152",
+                      "memory-utilization": 0,
+                      "name": "python",
+                      "pid": "390",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "1471",
+                    "state": {
+                      "args": [
+                        "-n 0 --retry --follow=name --pid=1469 /var/log/eos-console"
+                      ],
+                      "cpu-usage-system": "3166",
+                      "cpu-usage-user": "581",
+                      "cpu-utilization": 0,
+                      "memory-usage": "589824",
+                      "memory-utilization": 0,
+                      "name": "tail",
+                      "pid": "1471",
+                      "start-time": "1622215703635663872"
+                    }
+                  },
+                  {
+                    "pid": "376",
+                    "state": {
+                      "args": [
+                        "-m -r -e modify -e create -e delete -e attrib -e move ."
+                      ],
+                      "cpu-usage-system": "30",
+                      "cpu-usage-user": "13",
+                      "cpu-utilization": 0,
+                      "memory-usage": "602112",
+                      "memory-utilization": 0,
+                      "name": "inotifywait",
+                      "pid": "376",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "534",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "59508",
+                      "cpu-usage-user": "114729",
+                      "cpu-utilization": 0,
+                      "memory-usage": "331501568",
+                      "memory-utilization": 8,
+                      "name": "ConfigAgent",
+                      "pid": "534",
+                      "start-time": "1622215645635663872"
+                    }
+                  },
+                  {
+                    "pid": "1051",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "34477",
+                      "cpu-usage-user": "51161",
+                      "cpu-utilization": 0,
+                      "memory-usage": "106369024",
+                      "memory-utilization": 2,
+                      "name": "Rib",
+                      "pid": "1051",
+                      "start-time": "1622215692635663872"
+                    }
+                  },
+                  {
+                    "pid": "375",
+                    "state": {
+                      "args": [
+                        "/usr/bin/inotifyrun -c pax -x sv4cpio -O -w -f /mnt/flash/persist/sys.new . \u0026\u0026 mv /mnt/flash/persist/sys.new /mnt/flash/persist/sys || logger -t SetupPersist Failed to update /mnt/flash/persist/sys --daemon --logfile=/var/log/inotifyrun-sys.log --pidfile=/var/run/inotifyrun-sys.pid /persist/sys"
+                      ],
+                      "cpu-usage-system": "237",
+                      "cpu-usage-user": "103",
+                      "cpu-utilization": 0,
+                      "memory-usage": "5050368",
+                      "memory-utilization": 0,
+                      "name": "python",
+                      "pid": "375",
+                      "start-time": "1622215618635663872"
+                    }
+                  },
+                  {
+                    "pid": "230",
+                    "state": {
+                      "args": [
+                        "-n"
+                      ],
+                      "cpu-usage-system": "121",
+                      "cpu-usage-user": "169",
+                      "cpu-utilization": 0,
+                      "memory-usage": "5382144",
+                      "memory-utilization": 0,
+                      "name": "rsyslogd",
+                      "pid": "230",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "233",
+                    "state": {
+                      "args": [
+                        "--system --address=systemd: --nofork --nopidfile --systemd-activation"
+                      ],
+                      "cpu-usage-system": "2",
+                      "cpu-usage-user": "10",
+                      "cpu-utilization": 0,
+                      "memory-usage": "9428992",
+                      "memory-utilization": 0,
+                      "name": "dbus-daemon",
+                      "pid": "233",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "961",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Acl --dlopen procmgr /usr/bin/Acl"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1548288",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "961",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "1470",
+                    "state": {
+                      "args": [
+                        "-c /usr/bin/tail -n 0 --retry --follow=name --pid=1469 /var/log/eos-console | sed 's/\\(.*\\)/\\1\\r/'"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2473984",
+                      "memory-utilization": 0,
+                      "name": "sh",
+                      "pid": "1470",
+                      "start-time": "1622215703635663872"
+                    }
+                  },
+                  {
+                    "pid": "1",
+                    "state": {
+                      "args": [
+                        "systemd.setenv=INTFTYPE=eth systemd.setenv=ETBA=4 systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1 systemd.setenv=CEOS=1 systemd.setenv=EOS_PLATFORM=ceoslab systemd.setenv=container=docker systemd.setenv=MAPETH0=1 MGMT_INTF=eth0"
+                      ],
+                      "cpu-usage-system": "14444",
+                      "cpu-usage-user": "5894",
+                      "cpu-utilization": 0,
+                      "memory-usage": "4837376",
+                      "memory-utilization": 0,
+                      "name": "systemd",
+                      "pid": "1",
+                      "start-time": "1622215611635663872"
+                    }
+                  },
+                  {
+                    "pid": "1472",
+                    "state": {
+                      "args": [
+                        "s/\\(.*\\)/\\1\\r/"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1748992",
+                      "memory-utilization": 0,
+                      "name": "sed",
+                      "pid": "1472",
+                      "start-time": "1622215703635663872"
+                    }
+                  },
+                  {
+                    "pid": "953",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "14921",
+                      "cpu-usage-user": "24838",
+                      "cpu-utilization": 0,
+                      "memory-usage": "82567168",
+                      "memory-utilization": 2,
+                      "name": "StpTxRx",
+                      "pid": "953",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "540",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1515",
+                      "cpu-usage-user": "1666",
+                      "cpu-utilization": 0,
+                      "memory-usage": "80396288",
+                      "memory-utilization": 1,
+                      "name": "StageMgr",
+                      "pid": "540",
+                      "start-time": "1622215645635663872"
+                    }
+                  },
+                  {
+                    "pid": "989",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "989",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "985",
+                    "state": {
+                      "args": [
+                        "--agenttitle=L2Rib --dlopen procmgr /usr/bin/L2Rib"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1564672",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "985",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "450",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "12652544",
+                      "memory-utilization": 0,
+                      "name": "netnsd-watcher",
+                      "pid": "450",
+                      "start-time": "1622215643635663872"
+                    }
+                  },
+                  {
+                    "pid": "978",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "978",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "511",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1478",
+                      "cpu-usage-user": "1659",
+                      "cpu-utilization": 0,
+                      "memory-usage": "92073984",
+                      "memory-utilization": 2,
+                      "name": "Fru",
+                      "pid": "511",
+                      "start-time": "1622215644635663872"
+                    }
+                  },
+                  {
+                    "pid": "928",
+                    "state": {
+                      "args": [
+                        "--agenttitle=OpenConfig"
+                      ],
+                      "cpu-usage-system": "72139",
+                      "cpu-usage-user": "232952",
+                      "cpu-utilization": 1,
+                      "memory-usage": "142307328",
+                      "memory-utilization": 3,
+                      "name": "OpenConfig",
+                      "pid": "928",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "937",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "937",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "922",
+                    "state": {
+                      "args": [
+                        "--agenttitle=Lldp --dlopen procmgr /usr/bin/Lldp"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "1613824",
+                      "memory-utilization": 0,
+                      "name": "netns",
+                      "pid": "922",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "986",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1578",
+                      "cpu-usage-user": "1738",
+                      "cpu-utilization": 0,
+                      "memory-usage": "69849088",
+                      "memory-utilization": 1,
+                      "name": "ReloadCauseAgen",
+                      "pid": "986",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "528",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1736",
+                      "cpu-usage-user": "2075",
+                      "cpu-utilization": 0,
+                      "memory-usage": "104476672",
+                      "memory-utilization": 2,
+                      "name": "Launcher",
+                      "pid": "528",
+                      "start-time": "1622215645635663872"
+                    }
+                  },
+                  {
+                    "pid": "1000",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "1000",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "616",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "17492",
+                      "cpu-usage-user": "4887",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2531328",
+                      "memory-utilization": 0,
+                      "name": "EosOomAdjust",
+                      "pid": "616",
+                      "start-time": "1622215646635663872"
+                    }
+                  },
+                  {
+                    "pid": "923",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "923",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "1469",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "65536",
+                      "memory-utilization": 0,
+                      "name": "conlogd",
+                      "pid": "1469",
+                      "start-time": "1622215703635663872"
+                    }
+                  },
+                  {
+                    "pid": "965",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "965",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "996",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1683",
+                      "cpu-usage-user": "1812",
+                      "cpu-utilization": 0,
+                      "memory-usage": "78594048",
+                      "memory-utilization": 1,
+                      "name": "TopoAgent",
+                      "pid": "996",
+                      "start-time": "1622215689635663872"
+                    }
+                  },
+                  {
+                    "pid": "973",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1395",
+                      "cpu-usage-user": "3031",
+                      "cpu-utilization": 0,
+                      "memory-usage": "71913472",
+                      "memory-utilization": 1,
+                      "name": "KernelNetworkIn",
+                      "pid": "973",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "952",
+                    "state": {
+                      "args": [
+                        " -d -i --dlopen -p -f  -l libLoadDynamicLibs.so procmgr libProcMgrSetup.so --daemonize"
+                      ],
+                      "cpu-usage-system": "0",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "10809344",
+                      "memory-utilization": 0,
+                      "name": "netnsd-session",
+                      "pid": "952",
+                      "start-time": "1622215688635663872"
+                    }
+                  },
+                  {
+                    "pid": "232",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "63",
+                      "cpu-usage-user": "30",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2740224",
+                      "memory-utilization": 0,
+                      "name": "systemd-logind",
+                      "pid": "232",
+                      "start-time": "1622215615635663872"
+                    }
+                  },
+                  {
+                    "pid": "760747",
+                    "state": {
+                      "args": [
+                        ""
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2764800",
+                      "memory-utilization": 0,
+                      "name": "bash",
+                      "pid": "760747",
+                      "start-time": "1623004570635663872"
+                    }
+                  },
+                  {
+                    "pid": "760756",
+                    "state": {
+                      "args": [
+                        "       /usr/bin/Cli"
+                      ],
+                      "cpu-usage-system": "126",
+                      "cpu-usage-user": "185",
+                      "cpu-utilization": 0,
+                      "memory-usage": "13238272",
+                      "memory-utilization": 0,
+                      "name": "CliShell",
+                      "pid": "760756",
+                      "start-time": "1623004573635663872"
+                    }
+                  },
+                  {
+                    "pid": "760774",
+                    "state": {
+                      "args": [
+                        "-l"
+                      ],
+                      "cpu-usage-system": "1",
+                      "cpu-usage-user": "0",
+                      "cpu-utilization": 0,
+                      "memory-usage": "2875392",
+                      "memory-utilization": 0,
+                      "name": "bash",
+                      "pid": "760774",
+                      "start-time": "1623004586635663872"
+                    }
+                  }
+                ]
+              },
+              "ssh-server": {
+                "config": {
+                  "enable": true,
+                  "session-limit": 50,
+                  "timeout": 0
+                },
+                "state": {
+                  "enable": true,
+                  "session-limit": 50,
+                  "timeout": 0
+                }
+              },
+              "state": {
+                "boot-time": "1614091865635663872",
+                "current-datetime": "2021-03-05T14:34:17Z+00:00",
+                "hostname": "localhost"
+              }
+            }
+          }
+        }
+      }
+    ]
+  }
+]
diff --git a/test/integration/cliIntegration_test.go b/test/integration/cliIntegration_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..26ddc13a2afc4404a0ee62470c205006f5a58961
--- /dev/null
+++ b/test/integration/cliIntegration_test.go
@@ -0,0 +1,200 @@
+package integration
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"os"
+	"testing"
+)
+
+func TestMain(m *testing.M) {
+	testSetupIntegration()
+	os.Exit(m.Run())
+}
+
+func TestCapabilities(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type args struct {
+		a string
+		u string
+		p string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				a: testAddress,
+				u: testUsername,
+				p: testPassword,
+			},
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			args: args{
+				a: unreachable,
+				u: testUsername,
+				p: testPassword,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := cli.Capabilities(tt.args.a, tt.args.u, tt.args.p); (err != nil) != tt.wantErr {
+				t.Errorf("Capabilities() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestGet(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type args struct {
+		a    string
+		u    string
+		p    string
+		args []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				a:    testAddress,
+				u:    testUsername,
+				p:    testPassword,
+				args: defaultPath,
+			},
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			args: args{
+				a:    unreachable,
+				u:    testUsername,
+				p:    testPassword,
+				args: defaultPath,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if _, err := cli.Get(tt.args.a, tt.args.u, tt.args.p, tt.args.args...); (err != nil) != tt.wantErr {
+				t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestHttpGet(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type args struct {
+		apiEndpoint string
+		f           string
+		args        []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				apiEndpoint: testAPIEndpoint,
+				f:           "init",
+				args:        nil,
+			},
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			args: args{
+				apiEndpoint: "http://" + unreachable,
+				f:           "init",
+				args:        nil,
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := cli.HTTPGet(tt.args.apiEndpoint, tt.args.f, tt.args.args...); (err != nil) != tt.wantErr {
+				t.Errorf("HttpGet() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestSet(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type args struct {
+		a    string
+		u    string
+		p    string
+		typ  string
+		args []string
+	}
+	tests := []struct {
+		name    string
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			args: args{
+				a:    testAddress,
+				u:    testUsername,
+				p:    testPassword,
+				typ:  "update",
+				args: []string{"/system/config/hostname", "ceos3000"},
+			},
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			args: args{
+				a:    unreachable,
+				u:    testUsername,
+				p:    testPassword,
+				typ:  "update",
+				args: []string{"/system/config/hostname", "ceos3000"},
+			},
+			wantErr: true,
+		},
+		{
+			name: "invalid path",
+			args: args{
+				a:    testAddress,
+				u:    testUsername,
+				p:    testPassword,
+				typ:  "update",
+				args: []string{"invalid/path", "ceos3000"},
+			},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if err := cli.Set(tt.args.a, tt.args.u, tt.args.p, tt.args.typ, tt.args.args...); (err != nil) != tt.wantErr {
+				t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
diff --git a/test/integration/cmdIntegration_test.go b/test/integration/cmdIntegration_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..d3327abb85848d115ab6d7be1b2639748358300a
--- /dev/null
+++ b/test/integration/cmdIntegration_test.go
@@ -0,0 +1,170 @@
+package integration
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/cli"
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util/proto"
+	guuid "github.com/google/uuid"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	log "github.com/sirupsen/logrus"
+	"github.com/spf13/viper"
+	pb "google.golang.org/protobuf/proto"
+	"os"
+	"testing"
+)
+
+const unreachable = "203.0.113.10:6030"
+
+var testAddress = "141.100.70.171:6030"
+var testAPIEndpoint = "http://141.100.70.171:8080"
+var testUsername = "admin"
+var testPassword = "arista"
+var defaultPath = []string{"/system/config/hostname"}
+var opt *nucleus.GnmiTransportOptions
+
+func testSetupIntegration() {
+	if os.Getenv("GOSDN_LOG") == "nolog" {
+		log.SetLevel(log.PanicLevel)
+	}
+
+	a := os.Getenv("GOSDN_TEST_ENDPOINT")
+	if a != "" {
+		testAddress = a
+	}
+	api := os.Getenv("GOSDN_TEST_API_ENDPOINT")
+	if api != "" {
+		testAPIEndpoint = api
+	}
+	u := os.Getenv("GOSDN_TEST_USER")
+	if u != "" {
+		testUsername = u
+	}
+	p := os.Getenv("GOSDN_TEST_PASSWORD")
+	if p != "" {
+		testPassword = p
+	}
+
+	gnmiMessages = map[string]pb.Message{
+		"../proto/cap-resp-arista-ceos":                  &gpb.CapabilityResponse{},
+		"../proto/req-full-node":                         &gpb.GetRequest{},
+		"../proto/req-full-node-arista-ceos":             &gpb.GetRequest{},
+		"../proto/req-interfaces-arista-ceos":            &gpb.GetRequest{},
+		"../proto/req-interfaces-interface-arista-ceos":  &gpb.GetRequest{},
+		"../proto/req-interfaces-wildcard":               &gpb.GetRequest{},
+		"../proto/resp-full-node":                        &gpb.GetResponse{},
+		"../proto/resp-full-node-arista-ceos":            &gpb.GetResponse{},
+		"../proto/resp-interfaces-arista-ceos":           &gpb.GetResponse{},
+		"../proto/resp-interfaces-interface-arista-ceos": &gpb.GetResponse{},
+		"../proto/resp-interfaces-wildcard":              &gpb.GetResponse{},
+		"../proto/resp-set-system-config-hostname":       &gpb.SetResponse{},
+	}
+	for k, v := range gnmiMessages {
+		if err := proto.Read(k, v); err != nil {
+			log.Fatalf("error parsing %v: %v", k, err)
+		}
+	}
+
+	opt = &nucleus.GnmiTransportOptions{
+		Config: gnmi.Config{
+			Addr:     testAddress,
+			Username: "admin",
+			Password: "arista",
+			Encoding: gpb.Encoding_JSON_IETF,
+		},
+		RespChan: make(chan *gpb.SubscribeResponse),
+	}
+}
+
+func TestCliIntegration(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	tests := []struct {
+		name    string
+		wantErr bool
+	}{
+		{
+			name:    "default",
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			defer viper.Reset()
+			if err := cli.HTTPGet(testAPIEndpoint, "init"); (err != nil) != tt.wantErr {
+				switch err.(type) {
+				case viper.ConfigFileNotFoundError:
+				default:
+					t.Errorf("gosdn cli init error = %v, wantErr %v", err, tt.wantErr)
+					return
+				}
+			}
+			cliPnd := viper.GetString("CLI_PND")
+			cliSbi := viper.GetString("CLI_SBI")
+
+			if err := cli.HTTPGet(
+				testAPIEndpoint,
+				"addDevice",
+				"address="+testAddress,
+				"password="+testPassword,
+				"username="+testUsername,
+				"sbi="+cliSbi,
+				"pnd="+cliPnd,
+			); (err != nil) != tt.wantErr {
+				t.Errorf("gosdn cli add-device error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			did := viper.GetString("LAST_DEVICE_UUID")
+
+			if err := cli.HTTPGet(
+				testAPIEndpoint,
+				"request",
+				"uuid="+did,
+				"sbi="+cliSbi,
+				"pnd="+cliPnd,
+				"path=/system/config/hostname",
+			); (err != nil) != tt.wantErr {
+				t.Errorf("gosdn cli request error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			if err := cli.HTTPGet(
+				testAPIEndpoint,
+				"getDevice",
+				"address="+testAddress,
+				"uuid="+did,
+				"sbi="+cliSbi,
+				"pnd="+cliPnd,
+			); (err != nil) != tt.wantErr {
+				t.Errorf("gosdn cli get-device error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			hostname := guuid.New().String()
+			if err := cli.HTTPGet(
+				testAPIEndpoint,
+				"set",
+				"address="+testAddress,
+				"uuid="+did,
+				"sbi="+cliSbi,
+				"pnd="+cliPnd,
+				"path=/system/config/hostname",
+				"value="+hostname,
+			); (err != nil) != tt.wantErr {
+				t.Errorf("gosdn cli set error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+
+			resp, err := cli.Get(testAddress, testUsername, testPassword, "/system/config/hostname")
+			if (err != nil) != tt.wantErr {
+				t.Errorf("cli.Get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			got := resp.Notification[0].Update[0].Val.GetStringVal()
+			if got != hostname {
+				t.Errorf("integration test failed = got: %v, want: %v", got, hostname)
+			}
+		})
+	}
+}
diff --git a/test/integration/nucleusIntegration_test.go b/test/integration/nucleusIntegration_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..816888d6f77f857225f34d22b794017efe641629
--- /dev/null
+++ b/test/integration/nucleusIntegration_test.go
@@ -0,0 +1,359 @@
+package integration
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/goarista/gnmi"
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus"
+	"context"
+	gpb "github.com/openconfig/gnmi/proto/gnmi"
+	pb "google.golang.org/protobuf/proto"
+	"reflect"
+	"sort"
+	"testing"
+	"time"
+)
+
+var gnmiMessages map[string]pb.Message
+
+func TestGnmi_SetIntegration(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type fields struct {
+		opt *nucleus.GnmiTransportOptions
+	}
+	type args struct {
+		ctx    context.Context
+		params []interface{}
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name: "destination unreachable",
+			fields: fields{opt: &nucleus.GnmiTransportOptions{
+				Config: gnmi.Config{
+					Addr: "203.0.113.10:6030",
+				},
+			},
+			},
+			args: args{
+				ctx:    context.Background(),
+				params: []interface{}{&gnmi.Operation{}},
+			},
+			want:    nil,
+			wantErr: true,
+		},
+		{
+			name:   "valid update",
+			fields: fields{opt: opt},
+			args: args{
+				ctx: context.Background(),
+				params: []interface{}{
+					&gnmi.Operation{
+						Type:   "update",
+						Origin: "",
+						Target: "",
+						Path: []string{
+							"system",
+							"config",
+							"hostname",
+						},
+						Val: "ceos3000",
+					},
+				},
+			},
+			want:    gnmiMessages["../proto/resp-set-system-config-hostname"],
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g, err := nucleus.NewGnmiTransport(tt.fields.opt)
+			if err != nil {
+				t.Errorf("NewGnmiTransport() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			resp, err := g.Set(tt.args.ctx, tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Set() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			got, ok := resp.(*gpb.SetResponse)
+			if !ok {
+				t.Errorf("want: %v, got %v, error: %v", reflect.TypeOf(&gpb.SetResponse{}), reflect.TypeOf(resp), &nucleus.ErrInvalidTypeAssertion{})
+			}
+			if err != nil && tt.wantErr {
+				return
+			} else if got.Prefix.Target != testAddress ||
+				got.Response[0].Op != gpb.UpdateResult_UPDATE {
+				t.Errorf("Set() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestGnmi_GetIntegration(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+
+	paths := []string{
+		"/interfaces/interface",
+		"system/config/hostname",
+	}
+	type fields struct {
+		opt *nucleus.GnmiTransportOptions
+	}
+	type args struct {
+		ctx    context.Context
+		params []string
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name:   "default",
+			fields: fields{opt: opt},
+			args: args{
+				ctx:    context.Background(),
+				params: paths[:1],
+			},
+			want:    gnmiMessages["../proto/resp-interfaces-arista-ceos"],
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			fields: fields{opt: &nucleus.GnmiTransportOptions{
+				Config: gnmi.Config{
+					Addr: "203.0.113.10:6030",
+				},
+			},
+			},
+			args: args{
+				ctx:    context.Background(),
+				params: paths,
+			},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g, err := nucleus.NewGnmiTransport(tt.fields.opt)
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			got, err := g.Get(tt.args.ctx, tt.args.params...)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if reflect.TypeOf(got) != reflect.TypeOf(tt.want) {
+				t.Errorf("Get() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+func TestGnmi_SubscribeIntegration(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+
+	type fields struct {
+		opt *nucleus.GnmiTransportOptions
+	}
+	type args struct {
+		ctx  context.Context
+		opts *gnmi.SubscribeOptions
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		wantErr bool
+	}{
+		{
+			name: "default",
+			fields: fields{
+				opt: &nucleus.GnmiTransportOptions{
+					Config:   opt.Config,
+					RespChan: make(chan *gpb.SubscribeResponse),
+				},
+			},
+			args: args{
+				ctx: context.Background(),
+				opts: &gnmi.SubscribeOptions{
+					Mode:              "stream",
+					StreamMode:        "sample",
+					SampleInterval:    uint64(1 * time.Second),
+					HeartbeatInterval: uint64(100 * time.Millisecond),
+					Paths: gnmi.SplitPaths([]string{
+						"/interfaces/interface/name",
+						"/system/config/hostname",
+					}),
+					Target: testAddress,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "wrong path",
+			fields: fields{
+				opt: &nucleus.GnmiTransportOptions{
+					Config:   opt.Config,
+					RespChan: make(chan *gpb.SubscribeResponse),
+				},
+			},
+			args: args{
+				opts: &gnmi.SubscribeOptions{
+					Mode:              "stream",
+					StreamMode:        "sample",
+					SampleInterval:    uint64(1 * time.Second),
+					HeartbeatInterval: uint64(100 * time.Millisecond),
+					Paths: gnmi.SplitPaths([]string{
+						"interfaces/interface/name",
+						"ystem/config/hostname",
+					}),
+					Target: testAddress,
+				},
+			},
+			wantErr: true,
+		},
+		{
+			name: "destination unreachable",
+			fields: fields{
+				opt: &nucleus.GnmiTransportOptions{
+					Config: gnmi.Config{
+						Addr: "203.0.113.10:6030",
+					},
+					RespChan: make(chan *gpb.SubscribeResponse),
+				},
+			},
+			args: args{
+				opts: &gnmi.SubscribeOptions{},
+			},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var wantErr = tt.wantErr
+			g, err := nucleus.NewGnmiTransport(tt.fields.opt)
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			ctx := context.WithValue(context.Background(), nucleus.CtxKeyOpts, tt.args.opts) //nolint
+			ctx, cancel := context.WithCancel(ctx)
+			go func() {
+				subErr := g.Subscribe(ctx)
+				if (subErr != nil) != wantErr {
+					if !wantErr && subErr != nil {
+						if subErr.Error() != "rpc error: code = Canceled desc = context canceled" {
+							t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr)
+						}
+					}
+				}
+			}()
+			time.Sleep(time.Second * 3)
+			cancel()
+			time.Sleep(time.Second * 1)
+		})
+	}
+}
+
+func TestGnmi_CapabilitiesIntegration(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping integration test")
+	}
+	type fields struct {
+		opt *nucleus.GnmiTransportOptions
+	}
+	type args struct {
+		ctx context.Context
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		args    args
+		want    interface{}
+		wantErr bool
+	}{
+		{
+			name:    "supported models",
+			fields:  fields{opt: opt},
+			args:    args{ctx: context.Background()},
+			want:    gnmiMessages["../proto/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).SupportedModels,
+			wantErr: false,
+		},
+		{
+			name:    "supported encodings",
+			fields:  fields{opt: opt},
+			args:    args{ctx: context.Background()},
+			want:    gnmiMessages["../proto/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).SupportedEncodings,
+			wantErr: false,
+		},
+		{
+			name:    "gnmi version",
+			fields:  fields{opt: opt},
+			args:    args{ctx: context.Background()},
+			want:    gnmiMessages["../proto/cap-resp-arista-ceos"].(*gpb.CapabilityResponse).GNMIVersion,
+			wantErr: false,
+		},
+		{
+			name: "destination unreachable",
+			fields: fields{opt: &nucleus.GnmiTransportOptions{
+				Config: gnmi.Config{
+					Addr: "203.0.113.10:6030",
+				},
+			},
+			},
+			args:    args{ctx: context.Background()},
+			want:    nil,
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			g, err := nucleus.NewGnmiTransport(tt.fields.opt)
+			if err != nil {
+				t.Error(err)
+				return
+			}
+			resp, err := g.Capabilities(tt.args.ctx)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Capabilities() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			var got interface{}
+			switch tt.name {
+			case "supported encodings":
+				got = resp.(*gpb.CapabilityResponse).SupportedEncodings
+			case "supported models":
+				t.Skip("test causes false negative")
+				got = resp.(*gpb.CapabilityResponse).SupportedModels
+				sort.Slice(got.([]*gpb.ModelData), func(i, j int) bool {
+					return got.([]*gpb.ModelData)[i].Name < got.([]*gpb.ModelData)[j].Name
+				})
+				sort.Slice(tt.want.([]*gpb.ModelData), func(i, j int) bool {
+					return tt.want.([]*gpb.ModelData)[i].Name < tt.want.([]*gpb.ModelData)[j].Name
+				})
+			case "gnmi version":
+				got = resp.(*gpb.CapabilityResponse).GNMIVersion
+			default:
+			}
+			if !reflect.DeepEqual(got, tt.want) {
+				t.Errorf("Type() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
diff --git a/test/proto/cap-resp-arista-ceos b/test/proto/cap-resp-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..009569457324faf59d7bf00bb1915f2f3ccc2ec2
--- /dev/null
+++ b/test/proto/cap-resp-arista-ceos
@@ -0,0 +1,298 @@
+
+<
+arista-exp-eos-vxlan$Arista Networks <http://arista.com/>
+B
+ietf-netconf2IETF NETCONF (Network Configuration) Working Group
+<
+arista-rpol-augments$Arista Networks <http://arista.com/>
+C
+arista-exp-eos-igmpsnooping$Arista Networks <http://arista.com/>
+8
+openconfig-vlan-typesOpenConfig working group3.1.0
+?
+openconfig-system-managementOpenConfig working group0.3.0
+8
+arista-eos-types$Arista Networks <http://arista.com/>
+<
+openconfig-openflow-typesOpenConfig working group0.1.2
+7
+openconfig-aaa-typesOpenConfig working group0.4.1
+9
+openconfig-srte-policyOpenConfig working group0.2.1
+9
+openconfig-relay-agentOpenConfig working group0.1.1
+C
+openconfig-hercules-qos!OpenConfig Hercules Working Group0.1.0
+1
+openconfig-extensionsOpenConfig working group
+/
+arista-mpls-deviationsArista Networks, Inc.
+<
+arista-vlan-augments$Arista Networks <http://arista.com/>
+:
+openconfig-platform-cpuOpenConfig working group0.1.1
+<
+openconfig-routing-policyOpenConfig working group3.1.1
+=
+openconfig-isis-lsdb-typesOpenConfig working group0.4.2
+3
+openconfig-if-ipOpenConfig working group3.0.0
+;
+arista-pim-augments$Arista Networks <http://arista.com/>
+4
+openconfig-if-poeOpenConfig working group0.1.1
+-
+arista-isis-augmentsArista Networks, Inc.
+8
+openconfig-ospf-typesOpenConfig working group0.1.3
+/
+arista-intf-deviationsArista Networks, Inc.
+5
+openconfig-mpls-srOpenConfig working group3.0.1
+:
+openconfig-packet-matchOpenConfig working group1.1.1
+8
+openconfig-inet-typesOpenConfig working group0.3.3
+9
+openconfig-if-ethernetOpenConfig working group2.8.1
+5
+openconfig-pf-srteOpenConfig working group0.2.0
+2
+openconfig-mplsOpenConfig working group3.1.0
+#
+
+arista-cliArista Networks, Inc.
+=
+openconfig-system-terminalOpenConfig working group0.3.1
+:
+openconfig-platform-psuOpenConfig working group0.2.1
+8
+openconfig-yang-typesOpenConfig working group0.2.1
+8
+openconfig-lldp-typesOpenConfig working group0.1.1
+7
+openconfig-if-tunnelOpenConfig working group0.1.1
+6
+openconfig-messagesOpenConfig working group0.0.1
+B
+openconfig-platform-transceiverOpenConfig working group0.7.1
+1
+openconfig-pimOpenConfig working group0.2.0
+@
+openconfig-packet-match-typesOpenConfig working group1.0.2
+C
+ openconfig-segment-routing-typesOpenConfig working group0.2.0
+:
+openconfig-policy-typesOpenConfig working group3.1.1
+/
+arista-lldp-deviationsArista Networks, Inc.
+B
+openconfig-network-instance-l3OpenConfig working group0.11.1
+E
+arista-exp-eos-qos-acl-config$Arista Networks <http://arista.com/>
+5
+openconfig-licenseOpenConfig working group0.2.0
+:
+openconfig-platform-fanOpenConfig working group0.1.1
+/
+arista-system-augmentsArista Networks, Inc.
+2
+openconfig-isisOpenConfig working group0.6.0
+H
+/arista-network-instance-notsupported-deviationsArista Networks, Inc.
+B
+)arista-interfaces-notsupported-deviationsArista Networks, Inc.
+<
+arista-mpls-augments$Arista Networks <http://arista.com/>
+3
+arista-openflow-deviationsArista Networks, Inc.
+7
+openconfig-platformOpenConfig working group0.12.2
+D
+arista-exp-eos-varp-net-inst$Arista Networks <http://arista.com/>
+9
+openconfig-ospf-policyOpenConfig working group0.1.3
+6
+openconfig-if-typesOpenConfig working group0.2.1
+:
+arista-exp-eos-qos$Arista Networks <http://arista.com/>
+2
+openconfig-igmpOpenConfig working group0.2.0
+)
+arista-gnoi-certArista Networks, Inc.
+/
+arista-isis-deviationsArista Networks, Inc.
+4
+openconfig-systemOpenConfig working group0.9.1
+>
+arista-vlan-deviations$Arista Networks <http://arista.com/>
+#
+vlan-translationArista Networks
+;
+openconfig-local-routingOpenConfig working group1.1.0
+@
+arista-exp-eos-varp-intf$Arista Networks <http://arista.com/>
+;
+arista-exp-eos-mlag$Arista Networks <http://arista.com/>
+8
+openconfig-igmp-typesOpenConfig working group0.1.1
+1
+openconfig-aftOpenConfig working group0.4.1
+-
+arista-srte-augmentsArista Networks, Inc.
+E
+arista-relay-agent-deviations$Arista Networks <http://arista.com/>
+7
+openconfig-mpls-rsvpOpenConfig working group3.0.2
+1
+openconfig-aaaOpenConfig working group0.4.3
+6
+arista-exp-eos$Arista Networks <http://arista.com/>
+H
+openconfig-hercules-platform!OpenConfig Hercules Working Group0.2.0
+.
+arista-acl-deviationsArista Networks, Inc.
+/
+arista-lacp-deviationsArista Networks, Inc.
+?
+ietf-interfaces,IETF NETMOD (Network Modeling) Working Group
+.
+arista-bgp-deviationsArista Networks, Inc.
+<
+openconfig-platform-typesOpenConfig working group1.0.0
+;
+"arista-acl-notsupported-deviationsArista Networks, Inc.
+3
+openconfig-typesOpenConfig working group0.6.0
+M
+ietf-yang-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group
+1
+openconfig-qosOpenConfig working group0.2.3
+.
+arista-bfd-deviationsArista Networks, Inc.
+@
+'arista-messages-notsupported-deviationsArista Networks, Inc.
+9
+openconfig-alarm-typesOpenConfig working group0.2.1
+<
+#arista-exp-eos-l2protocolforwardingArista Networks, Inc.
+6
+openconfig-openflowOpenConfig working group0.1.2
+>
+%arista-system-notsupported-deviationsArista Networks, Inc.
+7
+openconfig-pim-typesOpenConfig working group0.1.1
+2
+openconfig-vlanOpenConfig working group3.2.0
+F
+-arista-routing-policy-notsupported-deviationsArista Networks, Inc.
+7
+openconfig-aft-typesOpenConfig Working Group0.3.4
+,
+arista-aft-augmentsArista Networks, Inc.
+<
+arista-lacp-augments$Arista Networks <http://arista.com/>
+1
+openconfig-bfdOpenConfig working group0.2.1
+<
+openconfig-system-loggingOpenConfig working group0.3.1
+4
+openconfig-alarmsOpenConfig working group0.3.2
+8
+openconfig-isis-typesOpenConfig working group0.4.2
+?
+openconfig-platform-linecardOpenConfig working group0.1.2
+<
+#arista-lldp-notsupported-deviationsArista Networks, Inc.
+,
+arista-exp-eos-evpnArista Networks, Inc.
+5
+openconfig-rib-bgpOpenConfig working group0.7.0
+@
+'arista-platform-notsupported-deviationsArista Networks, Inc.
+@
+arista-exp-eos-multicast$Arista Networks <http://arista.com/>
+;
+"arista-bfd-notsupported-deviationsArista Networks, Inc.
+?
+openconfig-policy-forwardingOpenConfig working group0.2.1
+2
+openconfig-lacpOpenConfig working group1.1.1
+-
+arista-lldp-augmentsArista Networks, Inc.
+;
+arista-bfd-augments$Arista Networks <http://arista.com/>
+1
+openconfig-bgpOpenConfig working group6.0.0
+
+iana-if-typeIANA
+/
+arista-rpol-deviationsArista Networks, Inc.
+;
+openconfig-rib-bgp-typesOpenConfig working group0.5.0
+M
+ietf-inet-types:IETF NETMOD (NETCONF Data Modeling Language) Working Group
+8
+openconfig-bgp-policyOpenConfig working group6.0.1
+<
+arista-intf-augments$Arista Networks <http://arista.com/>
+8
+arista-local-routing-deviationsArista Networks, Inc.
+8
+openconfig-interfacesOpenConfig working group2.4.3
+:
+openconfig-if-aggregateOpenConfig working group2.4.3
+/
+arista-srte-deviationsArista Networks, Inc.
+A
+arista-exp-eos-qos-config$Arista Networks <http://arista.com/>
+2
+openconfig-lldpOpenConfig working group0.2.1
+J
+openconfig-hercules-interfaces!OpenConfig Hercules Working Group0.2.0
+6
+openconfig-mpls-ldpOpenConfig working group3.0.2
+8
+openconfig-mpls-typesOpenConfig working group3.2.0
+M
+ietf-netconf-monitoring2IETF NETCONF (Network Configuration) Working Group
+7
+openconfig-bgp-typesOpenConfig working group5.2.0
+<
+#arista-lacp-notsupported-deviationsArista Networks, Inc.
+E
+,arista-local-routing-notsupported-deviationsArista Networks, Inc.
+,
+arista-bgp-augmentsArista Networks, Inc.
+2
+arista-netinst-deviationsArista Networks, Inc.
+;
+"arista-bgp-notsupported-deviationsArista Networks, Inc.
+D
+!openconfig-network-instance-typesOpenConfig working group0.8.2
+1
+openconfig-aclOpenConfig working group1.1.1
+7
+openconfig-qos-typesOpenConfig working group0.2.1
+5
+openconfig-procmonOpenConfig working group0.4.0
+,
+arista-qos-augmentsArista Networks, Inc.
+;
+openconfig-platform-portOpenConfig working group0.3.3
+4
+openconfig-ospfv2OpenConfig working group0.2.2
+1
+arista-system-deviationsArista Networks, Inc.
+>
+openconfig-transport-typesOpenConfig working group0.11.0
+?
+openconfig-network-instanceOpenConfig working group0.14.0
++
+arista-rpc-netconfArista Networks, Inc.
+=
+openconfig-segment-routingOpenConfig working group0.3.0
+;
+"arista-qos-notsupported-deviationsArista Networks, Inc.
+C
+arista-exp-eos-vxlan-config$Arista Networks <http://arista.com/>�0.7.0
\ No newline at end of file
diff --git a/test/proto/req-full-node b/test/proto/req-full-node
new file mode 100644
index 0000000000000000000000000000000000000000..087f7d8275a07a95d6809081bab6ccecfa81a9f1
--- /dev/null
+++ b/test/proto/req-full-node
@@ -0,0 +1,7 @@
+2
+
+interfaces
+	interface
+
+interfaces
+	interface(
\ No newline at end of file
diff --git a/test/proto/req-full-node-arista-ceos b/test/proto/req-full-node-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..6223295e2984b8002ea5573e8fbbecb77ba9dc6d
Binary files /dev/null and b/test/proto/req-full-node-arista-ceos differ
diff --git a/test/proto/req-interfaces-arista-ceos b/test/proto/req-interfaces-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..e444e33aa6d44fc9ca4538f5a030df6c8d88a708
--- /dev/null
+++ b/test/proto/req-interfaces-arista-ceos
@@ -0,0 +1,5 @@
+
+
+interfaces
+
+interfaces(
\ No newline at end of file
diff --git a/test/proto/req-interfaces-interface-arista-ceos b/test/proto/req-interfaces-interface-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..087f7d8275a07a95d6809081bab6ccecfa81a9f1
--- /dev/null
+++ b/test/proto/req-interfaces-interface-arista-ceos
@@ -0,0 +1,7 @@
+2
+
+interfaces
+	interface
+
+interfaces
+	interface(
\ No newline at end of file
diff --git a/test/proto/req-interfaces-wildcard b/test/proto/req-interfaces-wildcard
new file mode 100644
index 0000000000000000000000000000000000000000..bd113697d2f21f1dbd7a3a881c6ab70cd4ec4644
--- /dev/null
+++ b/test/proto/req-interfaces-wildcard
@@ -0,0 +1,12 @@
+c
+
+interfaces
+interface[name=*]
+state
+name
+
+interfaces
+	interface	
+name*
+state
+name(
\ No newline at end of file
diff --git a/test/proto/resp-full-node b/test/proto/resp-full-node
new file mode 100644
index 0000000000000000000000000000000000000000..4614be84e811d8a96624192f082c97ec9edf76be
--- /dev/null
+++ b/test/proto/resp-full-node
@@ -0,0 +1,7 @@
+
+�""�"
+0
+
+interfaces 
+	interface
+nameEthernet510�"Z�"{"openconfig-interfaces:config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:41","mac-address":"02:42:c0:a8:02:41","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_5GB","SPEED_25GB","SPEED_50GB","SPEED_100GB","SPEED_10MB","SPEED_100GB_2LANE","SPEED_100MB","SPEED_1GB","SPEED_2500MB","SPEED_400GB","SPEED_10GB","SPEED_40GB","SPEED_200GB_4LANE","SPEED_200GB_8LANE","SPEED_50GB_1LANE"]}},"openconfig-interfaces:hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"openconfig-interfaces:name":"Ethernet510","openconfig-interfaces:state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"294224","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1412","in-octets":"72226989","in-unicast-pkts":"642","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1612959137249521152","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-interfaces:subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":true,"mtu":1500},"state":{"dhcp-client":false,"enabled":true,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"addresses":{"address":[{"config":{"ip":"fdfd::ce05","prefix-length":64},"ip":"fdfd::ce05","state":{"ip":"fdfd::ce05","origin":"STATIC","prefix-length":64,"status":"PREFERRED"}}]},"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"neighbors":{"neighbor":[{"config":{"ip":"fdfd::1"},"ip":"fdfd::1","state":{"ip":"fdfd::1","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::7683:c2ff:fefe:86ad"},"ip":"fe80::7683:c2ff:fefe:86ad","state":{"ip":"fe80::7683:c2ff:fefe:86ad","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::c3:43ff:fec5:da0b"},"ip":"fe80::c3:43ff:fec5:da0b","state":{"ip":"fe80::c3:43ff:fec5:da0b","link-layer-address":"02:c3:43:c5:da:0b","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fdfd::28"},"ip":"fdfd::28","state":{"ip":"fdfd::28","link-layer-address":"02:c3:43:c5:da:0b","neighbor-state":"REACHABLE","origin":"DYNAMIC"}},{"config":{"ip":"fe80::1"},"ip":"fe80::1","state":{"ip":"fe80::1","link-layer-address":"74:83:c2:fe:86:ad","neighbor-state":"REACHABLE","origin":"DYNAMIC"}}]},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}
\ No newline at end of file
diff --git a/test/proto/resp-full-node-arista-ceos b/test/proto/resp-full-node-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..9bcd16e666a683a570c5141eb01b4ed16ad52b8b
Binary files /dev/null and b/test/proto/resp-full-node-arista-ceos differ
diff --git a/test/proto/resp-interfaces-arista-ceos b/test/proto/resp-interfaces-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..58e139172f4264b079f1f61ec7f27fe454129734
--- /dev/null
+++ b/test/proto/resp-interfaces-arista-ceos
@@ -0,0 +1,5 @@
+
+�"�
+
+
+interfaces�Z�{"openconfig-interfaces:interface":[{"config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"name":"Ethernet510","state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}]}
\ No newline at end of file
diff --git a/test/proto/resp-interfaces-interface-arista-ceos b/test/proto/resp-interfaces-interface-arista-ceos
new file mode 100644
index 0000000000000000000000000000000000000000..05f0804b1153e5982ff5d5e4d4a32d9d6d6be7d0
--- /dev/null
+++ b/test/proto/resp-interfaces-interface-arista-ceos
@@ -0,0 +1,7 @@
+
+�"�
+0
+
+interfaces 
+	interface
+nameEthernet510�Z�{"openconfig-interfaces:config":{"description":"","enabled":true,"arista-intf-augments:load-interval":300,"loopback-mode":false,"mtu":0,"name":"Ethernet510","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-if-ethernet:ethernet":{"config":{"arista-intf-augments:fec-encoding":{"disabled":false,"fire-code":false,"reed-solomon":false,"reed-solomon544":false},"openconfig-hercules-interfaces:forwarding-viable":true,"mac-address":"00:00:00:00:00:00","port-speed":"SPEED_UNKNOWN","arista-intf-augments:sfp-1000base-t":false},"arista-intf-augments:pfc":{"priorities":{"priority":[{"index":0,"state":{"in-frames":"0","index":0,"out-frames":"0"}},{"index":1,"state":{"in-frames":"0","index":1,"out-frames":"0"}},{"index":2,"state":{"in-frames":"0","index":2,"out-frames":"0"}},{"index":3,"state":{"in-frames":"0","index":3,"out-frames":"0"}},{"index":4,"state":{"in-frames":"0","index":4,"out-frames":"0"}},{"index":5,"state":{"in-frames":"0","index":5,"out-frames":"0"}},{"index":6,"state":{"in-frames":"0","index":6,"out-frames":"0"}},{"index":7,"state":{"in-frames":"0","index":7,"out-frames":"0"}}]}},"state":{"auto-negotiate":false,"counters":{"in-crc-errors":"0","in-fragment-frames":"0","in-jabber-frames":"0","in-mac-control-frames":"0","in-mac-pause-frames":"0","in-oversize-frames":"0","out-mac-control-frames":"0","out-mac-pause-frames":"0"},"duplex-mode":"FULL","enable-flow-control":false,"openconfig-hercules-interfaces:forwarding-viable":true,"hw-mac-address":"02:42:c0:a8:02:42","mac-address":"02:42:c0:a8:02:42","negotiated-port-speed":"SPEED_UNKNOWN","port-speed":"SPEED_UNKNOWN","arista-intf-augments:supported-speeds":["SPEED_200GB_8LANE","SPEED_100MB","SPEED_1GB","SPEED_10GB","SPEED_400GB","SPEED_40GB","SPEED_2500MB","SPEED_50GB","SPEED_50GB_1LANE","SPEED_25GB","SPEED_100GB","SPEED_100GB_2LANE","SPEED_10MB","SPEED_200GB_4LANE","SPEED_5GB"]}},"openconfig-interfaces:hold-time":{"config":{"down":0,"up":0},"state":{"down":0,"up":0}},"openconfig-interfaces:name":"Ethernet510","openconfig-interfaces:state":{"admin-status":"UP","counters":{"in-broadcast-pkts":"344691","in-discards":"0","in-errors":"0","in-fcs-errors":"0","in-multicast-pkts":"1","in-octets":"93260151","in-unicast-pkts":"0","out-broadcast-pkts":"0","out-discards":"0","out-errors":"0","out-multicast-pkts":"0","out-octets":"0","out-unicast-pkts":"0"},"description":"","enabled":true,"openconfig-platform-port:hardware-port":"Port510","ifindex":510,"arista-intf-augments:inactive":false,"last-change":"1614091948142304000","loopback-mode":false,"mtu":0,"name":"Ethernet510","oper-status":"UP","openconfig-vlan:tpid":"openconfig-vlan-types:TPID_0X8100","type":"iana-if-type:ethernetCsmacd"},"openconfig-interfaces:subinterfaces":{"subinterface":[{"config":{"description":"","enabled":true,"index":0},"index":0,"openconfig-if-ip:ipv4":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500},"unnumbered":{"config":{"enabled":false},"state":{"enabled":false}}},"openconfig-if-ip:ipv6":{"config":{"dhcp-client":false,"enabled":false,"mtu":1500},"state":{"dhcp-client":false,"enabled":false,"mtu":1500}},"state":{"counters":{"in-fcs-errors":"0"},"description":"","enabled":true,"index":0}}]}}
\ No newline at end of file
diff --git a/test/proto/resp-interfaces-wildcard b/test/proto/resp-interfaces-wildcard
new file mode 100644
index 0000000000000000000000000000000000000000..50cb9f4c7021af0340d92cde6f1320ffb066e68d
--- /dev/null
+++ b/test/proto/resp-interfaces-wildcard
@@ -0,0 +1,10 @@
+
+T"R
+A
+
+interfaces 
+	interface
+nameEthernet510
+state
+name
+Ethernet510
\ No newline at end of file
diff --git a/test/proto/resp-set-system-config-hostname b/test/proto/resp-set-system-config-hostname
new file mode 100644
index 0000000000000000000000000000000000000000..c656ee5bb56b47d1e306627823c577d1b51d6988
--- /dev/null
+++ b/test/proto/resp-set-system-config-hostname
@@ -0,0 +1,8 @@
+>:
+system
+config
+hostname
+system
+config
+
+hostname  �����ȶ
\ No newline at end of file
diff --git a/test/targets.go b/test/targets.go
new file mode 100644
index 0000000000000000000000000000000000000000..309b818471b71581a3efe2ffa2bf65baf0b639b0
--- /dev/null
+++ b/test/targets.go
@@ -0,0 +1,112 @@
+package test
+
+import (
+	"code.fbi.h-da.de/cocsn/gosdn/forks/google/gnmi"
+	oc "code.fbi.h-da.de/cocsn/yang-models/generated/arista"
+	pb "github.com/openconfig/gnmi/proto/gnmi"
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/util"
+	"github.com/openconfig/ygot/ygot"
+	log "github.com/sirupsen/logrus"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+	"net"
+	"reflect"
+)
+
+type server struct {
+	*gnmi.Server
+}
+
+func callback(newConfig ygot.ValidatedGoStruct) error {
+	// Apply the config to your device and return nil if success. return error if fails.
+	//
+	// Do something ...
+	return nil
+}
+
+func newServer(model *gnmi.Model, config []byte) (*server, error) {
+	s, err := gnmi.NewServer(model, config, callback)
+	if err != nil {
+		return nil, err
+	}
+	return &server{Server: s}, nil
+}
+
+/*
+TODO: Implement multiple server configurations
+// Get overrides the Get func of gnmi.Target to provide user auth.
+func (s *server) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
+	msg, ok := credentials.AuthorizeUser(ctx)
+	if !ok {
+		log.Infof("denied a Get request: %v", msg)
+		return nil, status.Error(codes.PermissionDenied, msg)
+	}
+	log.Infof("allowed a Get request: %v", msg)
+	return s.Server.Get(ctx, req)
+}
+
+// Set overrides the Set func of gnmi.Target to provide user auth.
+func (s *server) Set(ctx context.Context, req *pb.SetRequest) (*pb.SetResponse, error) {
+	msg, ok := credentials.AuthorizeUser(ctx)
+	if !ok {
+		log.Infof("denied a Set request: %v", msg)
+		return nil, status.Error(codes.PermissionDenied, msg)
+	}
+	log.Infof("allowed a Set request: %v", msg)
+	return s.Server.Set(ctx, req)
+}
+*/
+
+func GnmiTarget(stop chan bool, bindAddr string) error {
+	if bindAddr == "" {
+		bindAddr = "localhost:13371"
+	}
+
+	entries := make([]*yang.Entry, 0)
+	for _, e := range oc.SchemaTree {
+		entries = append(entries, e)
+	}
+
+	modelData, err := util.FindModelData(entries)
+	if err != nil {
+		log.Error(err)
+	}
+
+	// Google stuff from here
+	model := gnmi.NewModel(
+		modelData,
+		reflect.TypeOf((*oc.Device)(nil)),
+		oc.SchemaTree["Device"],
+		oc.Unmarshal,
+		oc.ΛEnum)
+
+	g := grpc.NewServer()
+
+	var configData []byte
+	s, err := newServer(model, configData)
+	if err != nil {
+		log.Errorf("error in creating gnmi target: %v", err)
+		return err
+	}
+	pb.RegisterGNMIServer(g, s)
+	reflection.Register(g)
+
+	log.Infof("starting to listen on %s", bindAddr)
+	listen, err := net.Listen("tcp", bindAddr)
+	if err != nil {
+		log.Errorf("failed to listen: %v", err)
+		return err
+	}
+
+	log.Info("starting to serve")
+	go func() {
+		<-stop
+		g.GracefulStop()
+	}()
+	if err := g.Serve(listen); err != nil {
+		log.Errorf("failed to serve: %v", err)
+		return err
+	}
+	return nil
+}
diff --git a/test/terraform/.docker/ca.pem b/test/terraform/.docker/ca.pem
new file mode 100644
index 0000000000000000000000000000000000000000..335627f7a9eaf379a5c7551d9567a8699da16a44
--- /dev/null
+++ b/test/terraform/.docker/ca.pem
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgIUBWq9uklhkW5VulP/hnERK3IgadswDQYJKoZIhvcNAQEL
+BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh
+bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzEwN1oXDTIyMDMwMjE0MzEwN1ow
+azELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
+dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRhbmV0
+LmZiaS5oLWRhLmRlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1tx8
+n9HeLdXWMprKS/+8qrC2YITG27BLGTNXPbunks7CyLhJo7G2DqFtYuhLqtBESVw0
+1MJIoGnHbi0cT7bUCRUmp3V+qUzKih5gcIndkwftEUh0IVGf+CuKAdV7l/W95pvY
+s8Qt8jn8FU7dQddUhdy3cQSsbIQU1cBHUNzE0RpaHnIv713eHSYhXDb/EuxlH8r+
+cavx89OAqouesMY7TVDTyHhwVefnDvSX4KsCbcK4DtwZA/jwyx/LaPs32vFwX+zw
+USH+twA37lbOrYNPgFKLX4gxJ33DvP61DZ/3Sn9YwJK1Jc5O5kRRHVFaSwSouAC5
+YOvRhnaRejrqpep9F8WX/feMSWEsa2LBjdJfWV7AXLNJAH1SbyUMlUM83bYvcYDM
+ecy6wor4CSWHKjHitcO9GLlJb6nnAT2eZxv5tX4FzmN1Wftzo6NMkaETeYft6tFC
+eoJ1beQpjkRB/O3DVN4m0KGtwUcIm3EB/gxMy5TuYvSimEQ/w4sXHpCwNFmu98Xz
+TjfCkNT7T9oJYBlltb1opEeT+UG2t6gqIbjyqia7FjTH/kGJrk2Y6ZHrnYfC/JAw
+nBPiEK7O5RkaKMx8ZeLlYcG+Er7zU6S7IP6Lysg8JA6Ay86ixstdEwU3JqdPe3E5
+ooaZRjH7gYj3A5R3wk59FyKs3eud/nrMJM8lQO8CAwEAAaNTMFEwHQYDVR0OBBYE
+FBMgzW9McSbOw2ECqj8xjRHaZdF+MB8GA1UdIwQYMBaAFBMgzW9McSbOw2ECqj8x
+jRHaZdF+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAB6eUXxJ
+rMVbSy1iskHV+c9WV5ZGIMwMgspir+U9/n8B+psONjWcQjWe4VFkvBlW82cEF3rY
+Rz2cy4e5qtNpctPZfvta1qNNVsGSVTHNXBFU4ZFikKHTzso9eYuGEO77lBhv5j8Y
+oPB/dPf2rXi6k+37MIbSHdAXHsNlGkYSkf+nvZ5h/kkUqKAAdy8fdcqeRlyGZblq
+Ype83FgE+VNXGenf+tGaiX+nfoPUc+2C8LxkQWzJ9SN2XLu9q8Tl7PzE6Zyq14lQ
+1H2rF++/CIbCpMy4/OOct+HvpCuAs53OD+g3fHsKAHgrrEp3WLn++uxlziPT87Sn
+ErpmdhmSwIsbRBiHQgVfJRSRKhvaq6HqOOD8KnEEF5gdr3CnGLsG6OsErv3M3soh
+hwVrEtzyle4chG2yi1P+szIDYRldbQX4p1BAHEAaV5DXkZMbgUWdtPxI3bumFyR4
+2DXFGFJIsiT8t6bIM1irBOMPiiST1bOqV1sm49RKQ7mer7K6P03kCvnhesk+/+Ak
+1486CazHC2G9xWlMXwAK8vh1SB0uz9n9vN1OInzjozopAW/jJH+n56wYiH8odeu+
+cPdmmGd8hlC8gT5NFfmJxCGZ1IlU9oj24aIanV8RRDQoieqcTiIc+XxjhodbvaQi
+H1G8DOOV2NajwyqtTyfsJOs1Yqhn2pRnYmv+
+-----END CERTIFICATE-----
diff --git a/test/terraform/.docker/cert.pem b/test/terraform/.docker/cert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..c9f5c48e93766f0e06d1953fbd5e3dff0bc2dd86
--- /dev/null
+++ b/test/terraform/.docker/cert.pem
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIFJDCCAwygAwIBAgIUWCLw3cqcoQ3g78lzu9SzfnD+GYYwDQYJKoZIhvcNAQEL
+BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh
+bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzUwOFoXDTIyMDMwMjE0MzUwOFow
+FDESMBAGA1UEAwwJdGVycmFmb3JtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEA3vemPQNkpinIXLWjfZz1S6bSgxEvv2CDO2qf+/agCqE1dP2cfHyuodTh
+D+sste8btSV1a8TiixJ+2U2sVykryYLWd27VUBvFYm6j/MIG9h17iOH2bALXuBU6
+PQ6K7fJwZgunOL0IK5lYLWbacA6CiF/4rwAsaeR1p5TLWz9/1ncLuwqYv8htvvsW
+LintokYX+7q2iU0uoOnKPNkMvSwYgZ4JR1XBXWxd9wrJEd7Q5MfqqPFP9uEBDeXl
++nxYrxiNAhvBAxoAV141hH/3nj6wMiReWDW0ZgRRHHiG+B8fZVSYrA6j8n6O2IB0
+wBwaem85Fa+NDMJ4GUWLS7HJsh3ld906FClrjCr30AeqES4UUTnLXwSRtyrxufTH
+oK7WAqp7MRusMxohVfAky6Uj0qKtlgJwNQoUjjnVjNTP8DrHkPoFeJ8x7gcpw/ue
+yylDyLRh8RSnrQrMOw/7iT6k/G2JAb/c3GupOfNCFhZ0gVbJd2cdFohqmCo0L8mV
+Rb38zDORyRBZccM0b8GHayLbefy2yYSHjLZaZJueAUwwPnn6QnOpDLqj+gpoLu/g
+6ah2O0PqpievKubUyNIRZct3A82JZ9usF2FD6MqkhFzx/4w9YaKUGSpT2khru8Hg
+AiGhdjV/pI603EKg3N6qQxvkmGPM4jkgNTAgNdVM7lovoKiOf18CAwEAAaMXMBUw
+EwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAE3SVAwei8Mk
+SzZsXCrgXaWdfaV3XnEJh8KPXdIXgNXXHYjJhdUssQz9X1dD3hzGlrME+aTRuVTS
+wcgfJOLZUovIk3955TM+rCs/L86DvxAwZ733mE0k9BmEaG5J+4ZdkezD0BxWsFxR
+i/IBcc7o03cx4Z7ocqGl4Z+sLsbG7Y3tXElILfk/6W3AbN/Yi52UCfkg3ugnr3q+
+hrv57fIE35WhXXld7jTf33WOc82JFMbJ1kwVMF9T6blny0RwN98PTzYwVy8Zofaa
+Cuun8VA7pYhiOD1Ej+LVytKBcsin79mNFyQO2ZO78ByE19vtgSWn6HD1LHlfJ7J6
+oKyLWWNk95EaFTY7Y+0vFbLbtXASCfvIb1QfFQ4xiIn/V9osOgUjgyPRvaE6GldG
+zAAbbBSaRtVTElV61cSqekubsqyuPM8p/G6Ai8M4ZVBtX0+wUQetC+jV6TOTcX54
+bVNf2YNz9iwvSzVU7hwtl7sQskmcoVxnIYIO0KIS6C/5LYGnN8z/gyb4lMxIHxF3
+PweMfPEUH1xG8Ob0IFOGli7mMIIoRmBBfEjI5VDbVso8Bm6EH+VXDqAO5hF7YRSO
+nHKZXqAowrXDtG9pBQvJJGdO3AOlwEF4lNWjvQSbThVw/9gnOTOFuI5AkHsQFgvN
+BakHe9onKWI9CIt4o3hra6Pi8DgZWYHF
+-----END CERTIFICATE-----
diff --git a/test/terraform/.docker/server-cert.pem b/test/terraform/.docker/server-cert.pem
new file mode 100644
index 0000000000000000000000000000000000000000..a5899ae7f8646bda3b1115d5e1763f43be7c52b0
--- /dev/null
+++ b/test/terraform/.docker/server-cert.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFajCCA1KgAwIBAgIUWCLw3cqcoQ3g78lzu9SzfnD+GYUwDQYJKoZIhvcNAQEL
+BQAwazELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
+GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEkMCIGA1UEAwwbcG9ydGFpbmVyLmRh
+bmV0LmZiaS5oLWRhLmRlMB4XDTIxMDMwMjE0MzMxMFoXDTIyMDMwMjE0MzMxMFow
+JjEkMCIGA1UEAwwbcG9ydGFpbmVyLmRhbmV0LmZiaS5oLWRhLmRlMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxD+yXHFK9796DnvnheJLf5Mc+h5Os8Bu
+NgCI/6lixs06EUso0w4Th/YHH3dHdLUVEXbOPpXHHbEP37/J6eJk019goSZnafQM
+4KS6X/sYid4GTLVjn/JrFvrMKmXfthMYB2i9afcoc8UI6qbDQ0JR6rsy0H5CRnrk
+mWT6fSA2wscKnDniQTlkpM6CpEeywGgD7Ph40hlsOyXFQDv9ORdLnmHaC1bqCedK
+UEmDI4RnoKv/aEspYHv+ooaPE0mX/wqkZkPK6PIR30OX7zrNH0wFYZNRtQVn0Y0G
+DUcFB1yjaiVQnbxwm8qtvIFWR1EAE8nWXm4ikP7GCOw5g0Idqz+woqDci0utVIh5
+E5IAvQpajEY8nFyWDVDOcgm2D2oJkuWU1hpD186hILr6ZjmIR/3ZrN9DiPXtK68+
+8/VBPzRjOtsgtx/9JYUVrVH1BoBkvRSKf6CcroNMqupsHeeR2EcFpFuLSVLYx039
+d8otyxD8R05uaPeDroCNh4RJ++fyVI/M5PijA6LOWgzJhc+iJRcRA/zflpKOUs2y
+W7hl1GUtyK8lwE3BozKcOgZ9kKWYB6Aw3kZNdwnQnnFvt/PK+SZsdd5ZaHErGW6h
+rQKAieL9w6Ls9SrsWmGocb++OvizgMMS0wMXlSGgkWNNny44IdQZWjc7TqN8uObe
+c/qSZ3lnWx8CAwEAAaNLMEkwMgYDVR0RBCswKYIbcG9ydGFpbmVyLmRhbmV0LmZi
+aS5oLWRhLmRlhwSNZEaqhwR/AAABMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqG
+SIb3DQEBCwUAA4ICAQC+c5hxSzmtS/BlOWHUZQIj9PKFTfMFdSau/rXGpZF1kSfr
+tvAjHgRxiQiZWDS3XN5UfA7YD3IDwjAL+WmA4V13K5JMjSUR5WPu0eMq/IGHLVMQ
+xaWAbcpRMzORTRfRWz2ecI4Zr4N8p8Rc5WnHzLoszAMXFrHmFAZOihFSOGSBHqxB
+ez4udZ0sa+ZErrPx60OdsO4UGGWxxqxlJtMFyJDyLAYyOF7hhapBvFvP0ELG8Ep3
+uI2mbrDd75o9dLNUyiH3M0mcOeldLdvwEvhCaZn2bIwQBwXMMFb9WW5wp0vOF/kA
+6uy/0Ix5Fmfx2ZUZrm28fLK0vd1277t7WXsKL9lojTgeP4UnlvahYkBLISZp8Az8
+g1T0kiIeOkqAnmEKBbSyNy/QvssCkA9C2r3P80O5Ry5orPujDHt6UlUyahDisBw2
+Cy3IfhIZbtvkTS6xTx7Ns2WC3euFFgcnmGbYWClJ3SjP8tJkjN6kBNEVC9FKKv58
+ug69HVRedU91iyXEToW93Myicv42AUojUB9NsGmTVbEvRszw03+rduERJjIevUG5
+miMAKMHy/2o7ZE/i8yBcTLnTfXCV/hr4qvBbhCVN/evnxVk8mdsrnaqJUX4ppN2r
+doJi9xROeWDpK9UfsxuBpY/GhPUimcMOlsTV9bGAhPmj9qy/ikJrgUlKxwf0+A==
+-----END CERTIFICATE-----
diff --git a/test/terraform/containers.tf b/test/terraform/containers.tf
new file mode 100644
index 0000000000000000000000000000000000000000..4149322318193d0644f0e8f3eefafff44681a2ec
--- /dev/null
+++ b/test/terraform/containers.tf
@@ -0,0 +1,56 @@
+resource "docker_container" "gosdn" {
+  depends_on = [
+    docker_container.ceos]
+  name = "contoller-${random_id.server.hex}"
+  image = docker_image.gosdn.name
+  restart = "always"
+
+  networks_advanced {
+    name = "bridge"
+  }
+
+  ports {
+    internal = 8080
+    external = 8080
+  }
+}
+
+# create arista container
+# namespace is french cheeses
+resource "docker_container" "ceos" {
+  name  = "ceos-${random_id.server.hex}"
+  image = docker_image.ceos.name
+  restart = "always"
+
+  ports {
+    internal = 6030
+    external = 6030
+  }
+
+  networks_advanced {
+    name = "bridge"
+  }
+
+  command = ["/sbin/init",
+    "systemd.setenv=INTFTYPE=eth",
+    "systemd.setenv=ETBA=4",
+    "systemd.setenv=SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1",
+    "systemd.setenv=CEOS=1",
+    "systemd.setenv=EOS_PLATFORM=ceoslab",
+    "systemd.setenv=container=docker",
+    "MGMT_INTF=eth0"]
+
+  env =     ["INTFTYPE=eth",
+    "ETBA=4",
+    "SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT=1",
+    "CEOS=1",
+    "EOS_PLATFORM=ceoslab",
+    "container=docker",
+    "MGMT_INTF=eth0"]
+  privileged = true
+
+  volumes {
+    host_path = "/usr/local/etc/terraform/arista"
+    container_path = "/mnt/flash"
+  }
+}
diff --git a/test/terraform/images.tf b/test/terraform/images.tf
new file mode 100644
index 0000000000000000000000000000000000000000..39d234b387f5b14a704a028b6b7f31f39a217218
--- /dev/null
+++ b/test/terraform/images.tf
@@ -0,0 +1,7 @@
+resource "docker_image" "gosdn" {
+  name = var.container_tag
+}
+
+resource "docker_image" "ceos" {
+  name = "registry.code.fbi.h-da.de/cocsn/gosdn/ceos:latest"
+}
\ No newline at end of file
diff --git a/test/terraform/main.tf b/test/terraform/main.tf
new file mode 100644
index 0000000000000000000000000000000000000000..1f228766349903fbad196dbd3b1df05324f8c70b
--- /dev/null
+++ b/test/terraform/main.tf
@@ -0,0 +1,9 @@
+terraform {
+  backend "http" {
+  }
+  required_providers {
+    docker = {
+      source = "kreuzwerker/docker"
+    }
+  }
+}
diff --git a/test/terraform/networks.tf b/test/terraform/networks.tf
new file mode 100644
index 0000000000000000000000000000000000000000..2372a310a9d9c239419a706a22ffc809fb05a64a
--- /dev/null
+++ b/test/terraform/networks.tf
@@ -0,0 +1,15 @@
+resource "docker_network" "danet_legacy" {
+  name = "legacy-${random_id.server.hex}"
+
+  ipam_config {
+    subnet = "172.100.100.0/24"
+  }
+}
+
+resource "docker_network" "danet" {
+  name = "danet-${random_id.server.hex}"
+  ipv6 = true
+  ipam_config {
+    subnet = "fdfe::/64"
+  }
+}
\ No newline at end of file
diff --git a/test/terraform/providers.tf b/test/terraform/providers.tf
new file mode 100644
index 0000000000000000000000000000000000000000..8da71dbfed7b68768fdae4985e95284f27212b9a
--- /dev/null
+++ b/test/terraform/providers.tf
@@ -0,0 +1,13 @@
+provider "docker" {
+  host = "tcp://141.100.70.171:2376"
+
+  ca_material   = var.tls_ca_cert
+  cert_material = var.tls_cert
+  key_material  = var.tls_key
+
+  registry_auth {
+    address = var.integration_registry
+    username = var.integration_username
+    password = var.integration_access_token
+  }
+}
\ No newline at end of file
diff --git a/test/terraform/resources.tf b/test/terraform/resources.tf
new file mode 100644
index 0000000000000000000000000000000000000000..9659f2d949aaa978b04167a7a62d1a0dcc6752eb
--- /dev/null
+++ b/test/terraform/resources.tf
@@ -0,0 +1,3 @@
+resource "random_id" "server" {
+  byte_length = 8
+}
diff --git a/test/terraform/variables.tf b/test/terraform/variables.tf
new file mode 100644
index 0000000000000000000000000000000000000000..beacac0158789901783dad04be71645d0cb2a697
--- /dev/null
+++ b/test/terraform/variables.tf
@@ -0,0 +1,32 @@
+variable "integration_registry" {
+  type = string
+}
+
+variable "integration_username" {
+  type = string
+}
+
+variable "integration_access_token" {
+  type = string
+}
+variable "tls_key" {
+  type = string
+}
+
+variable "tls_cert" {
+  type = string
+}
+
+variable "tls_ca_cert" {
+  type = string
+}
+
+variable "container_tag" {
+  type = string
+  default = "registry.code.fbi.h-da.de/cocsn/gosdn:latest"
+}
+
+variable "network_name" {
+  type = string
+  default = ""
+}
\ No newline at end of file
diff --git a/test/yang/test-module.go b/test/yang/test-module.go
new file mode 100644
index 0000000000000000000000000000000000000000..6d962be48d2728bc24285a89b8251d1cd380d600
--- /dev/null
+++ b/test/yang/test-module.go
@@ -0,0 +1,3 @@
+package yang
+
+//go:generate go run $GOPATH/src/github.com/openconfig/ygot/generator/generator.go -output_file ./yang.go -package_name=yang -generate_fakeroot -fakeroot_name=device test.yang
diff --git a/test/yang/test.yang b/test/yang/test.yang
new file mode 100644
index 0000000000000000000000000000000000000000..35254174203402213cb12bf196fdc20c061c2e6d
--- /dev/null
+++ b/test/yang/test.yang
@@ -0,0 +1,66 @@
+module test {
+    yang-version 1.1;
+    namespace "urn:cocsn:params:xml:ns:yang:test";
+    prefix coc;
+
+    organization
+    "Darmstadt University of Applied Sciences";
+
+    description
+    "This YANG module is used to test YANG libs";
+
+    revision "2021-03-22" {
+    description
+        "Initial Revision";
+    }
+
+    container container1 {
+        list list1 {
+            key "leaf1";
+            leaf leaf1 {
+                config false;
+                type string;
+                mandatory "true";
+                description
+                "leaf1";
+            }
+            leaf-list leaf-list1 {
+                config true;
+                type string;
+                description
+                "leaf-list1";
+            }
+            leaf leaf2 {
+                config true;
+                type string;
+                description
+                "leaf2";
+            }
+        }
+    }
+
+    container container2 {
+        list list1 {
+            key "leaf1";
+            leaf leaf1 {
+                config false;
+                type string;
+                mandatory "true";
+                description
+                "leaf1";
+            }
+            leaf-list leaf-list1 {
+                config true;
+                type string;
+                description
+                "leaf-list1";
+            }
+            leaf leaf2 {
+                config true;
+                type string;
+                description
+                "leaf2";
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/yang/yang.go b/test/yang/yang.go
new file mode 100644
index 0000000000000000000000000000000000000000..7801d549b1d569245936cbdddabf74d7bf215f4c
--- /dev/null
+++ b/test/yang/yang.go
@@ -0,0 +1,332 @@
+/*
+Package yang is a generated package which contains definitions
+of structs which represent a YANG schema. The generated schema can be
+compressed by a series of transformations (compression was false
+in this case).
+
+This package was generated by /Users/mk/go/pkg/mod/github.com/openconfig/ygot@v0.10.0/genutil/names.go
+using the following YANG input files:
+	- test.yang
+Imported modules were sourced from:
+*/
+package yang
+
+import (
+	"encoding/json"
+	"fmt"
+	"reflect"
+
+	"github.com/openconfig/goyang/pkg/yang"
+	"github.com/openconfig/ygot/ygot"
+	"github.com/openconfig/ygot/ytypes"
+)
+
+// Binary is a type that is used for fields that have a YANG type of
+// binary. It is used such that binary fields can be distinguished from
+// leaf-lists of uint8s (which are mapped to []uint8, equivalent to
+// []byte in reflection).
+type Binary []byte
+
+// YANGEmpty is a type that is used for fields that have a YANG type of
+// empty. It is used such that empty fields can be distinguished from boolean fields
+// in the generated code.
+type YANGEmpty bool
+
+var (
+	SchemaTree map[string]*yang.Entry
+)
+
+func init() {
+	var err error
+	if SchemaTree, err = UnzipSchema(); err != nil {
+		panic("schema error: " + err.Error())
+	}
+}
+
+// Schema returns the details of the generated schema.
+func Schema() (*ytypes.Schema, error) {
+	uzp, err := UnzipSchema()
+	if err != nil {
+		return nil, fmt.Errorf("cannot unzip schema, %v", err)
+	}
+
+	return &ytypes.Schema{
+		Root:       &Device{},
+		SchemaTree: uzp,
+		Unmarshal:  Unmarshal,
+	}, nil
+}
+
+// UnzipSchema unzips the zipped schema and returns a map of yang.Entry nodes,
+// keyed by the name of the struct that the yang.Entry describes the schema for.
+func UnzipSchema() (map[string]*yang.Entry, error) {
+	var schemaTree map[string]*yang.Entry
+	var err error
+	if schemaTree, err = ygot.GzipToSchema(ySchema); err != nil {
+		return nil, fmt.Errorf("could not unzip the schema; %v", err)
+	}
+	return schemaTree, nil
+}
+
+// Unmarshal unmarshals data, which must be RFC7951 JSON format, into
+// destStruct, which must be non-nil and the correct GoStruct type. It returns
+// an error if the destStruct is not found in the schema or the data cannot be
+// unmarshaled. The supplied options (opts) are used to control the behaviour
+// of the unmarshal function - for example, determining whether errors are
+// thrown for unknown fields in the input JSON.
+func Unmarshal(data []byte, destStruct ygot.GoStruct, opts ...ytypes.UnmarshalOpt) error {
+	tn := reflect.TypeOf(destStruct).Elem().Name()
+	schema, ok := SchemaTree[tn]
+	if !ok {
+		return fmt.Errorf("could not find schema for type %s", tn)
+	}
+	var jsonTree interface{}
+	if err := json.Unmarshal([]byte(data), &jsonTree); err != nil {
+		return err
+	}
+	return ytypes.Unmarshal(schema, destStruct, jsonTree, opts...)
+}
+
+// Device represents the /device YANG schema element.
+type Device struct {
+	Container1 *Test_Container1 `path:"container1" module:"test"`
+	Container2 *Test_Container2 `path:"container2" module:"test"`
+}
+
+// IsYANGGoStruct ensures that Device implements the yang.GoStruct
+// interface. This allows functions that need to handle this struct to
+// identify it as being generated by ygen.
+func (*Device) IsYANGGoStruct() {}
+
+// Validate validates s against the YANG schema corresponding to its type.
+func (t *Device) Validate(opts ...ygot.ValidationOption) error {
+	if err := ytypes.Validate(SchemaTree["Device"], t, opts...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// ΛEnumTypeMap returns a map, keyed by YANG schema path, of the enumerated types
+// that are included in the generated code.
+func (t *Device) ΛEnumTypeMap() map[string][]reflect.Type { return ΛEnumTypes }
+
+// Test_Container1 represents the /test/container1 YANG schema element.
+type Test_Container1 struct {
+	List1 map[string]*Test_Container1_List1 `path:"list1" module:"test"`
+}
+
+// IsYANGGoStruct ensures that Test_Container1 implements the yang.GoStruct
+// interface. This allows functions that need to handle this struct to
+// identify it as being generated by ygen.
+func (*Test_Container1) IsYANGGoStruct() {}
+
+// NewList1 creates a new entry in the List1 list of the
+// Test_Container1 struct. The keys of the list are populated from the input
+// arguments.
+func (t *Test_Container1) NewList1(Leaf1 string) (*Test_Container1_List1, error) {
+
+	// Initialise the list within the receiver struct if it has not already been
+	// created.
+	if t.List1 == nil {
+		t.List1 = make(map[string]*Test_Container1_List1)
+	}
+
+	key := Leaf1
+
+	// Ensure that this key has not already been used in the
+	// list. Keyed YANG lists do not allow duplicate keys to
+	// be created.
+	if _, ok := t.List1[key]; ok {
+		return nil, fmt.Errorf("duplicate key %v for list List1", key)
+	}
+
+	t.List1[key] = &Test_Container1_List1{
+		Leaf1: &Leaf1,
+	}
+
+	return t.List1[key], nil
+}
+
+// Validate validates s against the YANG schema corresponding to its type.
+func (t *Test_Container1) Validate(opts ...ygot.ValidationOption) error {
+	if err := ytypes.Validate(SchemaTree["Test_Container1"], t, opts...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// ΛEnumTypeMap returns a map, keyed by YANG schema path, of the enumerated types
+// that are included in the generated code.
+func (t *Test_Container1) ΛEnumTypeMap() map[string][]reflect.Type { return ΛEnumTypes }
+
+// Test_Container1_List1 represents the /test/container1/list1 YANG schema element.
+type Test_Container1_List1 struct {
+	LeafList1 []string `path:"leaf-list1" module:"test"`
+	Leaf1     *string  `path:"leaf1" module:"test"`
+	Leaf2     *string  `path:"leaf2" module:"test"`
+}
+
+// IsYANGGoStruct ensures that Test_Container1_List1 implements the yang.GoStruct
+// interface. This allows functions that need to handle this struct to
+// identify it as being generated by ygen.
+func (*Test_Container1_List1) IsYANGGoStruct() {}
+
+// ΛListKeyMap returns the keys of the Test_Container1_List1 struct, which is a YANG list entry.
+func (t *Test_Container1_List1) ΛListKeyMap() (map[string]interface{}, error) {
+	if t.Leaf1 == nil {
+		return nil, fmt.Errorf("nil value for key Leaf1")
+	}
+
+	return map[string]interface{}{
+		"leaf1": *t.Leaf1,
+	}, nil
+}
+
+// Validate validates s against the YANG schema corresponding to its type.
+func (t *Test_Container1_List1) Validate(opts ...ygot.ValidationOption) error {
+	if err := ytypes.Validate(SchemaTree["Test_Container1_List1"], t, opts...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// ΛEnumTypeMap returns a map, keyed by YANG schema path, of the enumerated types
+// that are included in the generated code.
+func (t *Test_Container1_List1) ΛEnumTypeMap() map[string][]reflect.Type { return ΛEnumTypes }
+
+// Test_Container2 represents the /test/container2 YANG schema element.
+type Test_Container2 struct {
+	List1 map[string]*Test_Container2_List1 `path:"list1" module:"test"`
+}
+
+// IsYANGGoStruct ensures that Test_Container2 implements the yang.GoStruct
+// interface. This allows functions that need to handle this struct to
+// identify it as being generated by ygen.
+func (*Test_Container2) IsYANGGoStruct() {}
+
+// NewList1 creates a new entry in the List1 list of the
+// Test_Container2 struct. The keys of the list are populated from the input
+// arguments.
+func (t *Test_Container2) NewList1(Leaf1 string) (*Test_Container2_List1, error) {
+
+	// Initialise the list within the receiver struct if it has not already been
+	// created.
+	if t.List1 == nil {
+		t.List1 = make(map[string]*Test_Container2_List1)
+	}
+
+	key := Leaf1
+
+	// Ensure that this key has not already been used in the
+	// list. Keyed YANG lists do not allow duplicate keys to
+	// be created.
+	if _, ok := t.List1[key]; ok {
+		return nil, fmt.Errorf("duplicate key %v for list List1", key)
+	}
+
+	t.List1[key] = &Test_Container2_List1{
+		Leaf1: &Leaf1,
+	}
+
+	return t.List1[key], nil
+}
+
+// Validate validates s against the YANG schema corresponding to its type.
+func (t *Test_Container2) Validate(opts ...ygot.ValidationOption) error {
+	if err := ytypes.Validate(SchemaTree["Test_Container2"], t, opts...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// ΛEnumTypeMap returns a map, keyed by YANG schema path, of the enumerated types
+// that are included in the generated code.
+func (t *Test_Container2) ΛEnumTypeMap() map[string][]reflect.Type { return ΛEnumTypes }
+
+// Test_Container2_List1 represents the /test/container2/list1 YANG schema element.
+type Test_Container2_List1 struct {
+	LeafList1 []string `path:"leaf-list1" module:"test"`
+	Leaf1     *string  `path:"leaf1" module:"test"`
+	Leaf2     *string  `path:"leaf2" module:"test"`
+}
+
+// IsYANGGoStruct ensures that Test_Container2_List1 implements the yang.GoStruct
+// interface. This allows functions that need to handle this struct to
+// identify it as being generated by ygen.
+func (*Test_Container2_List1) IsYANGGoStruct() {}
+
+// ΛListKeyMap returns the keys of the Test_Container2_List1 struct, which is a YANG list entry.
+func (t *Test_Container2_List1) ΛListKeyMap() (map[string]interface{}, error) {
+	if t.Leaf1 == nil {
+		return nil, fmt.Errorf("nil value for key Leaf1")
+	}
+
+	return map[string]interface{}{
+		"leaf1": *t.Leaf1,
+	}, nil
+}
+
+// Validate validates s against the YANG schema corresponding to its type.
+func (t *Test_Container2_List1) Validate(opts ...ygot.ValidationOption) error {
+	if err := ytypes.Validate(SchemaTree["Test_Container2_List1"], t, opts...); err != nil {
+		return err
+	}
+	return nil
+}
+
+// ΛEnumTypeMap returns a map, keyed by YANG schema path, of the enumerated types
+// that are included in the generated code.
+func (t *Test_Container2_List1) ΛEnumTypeMap() map[string][]reflect.Type { return ΛEnumTypes }
+
+var (
+	// ySchema is a byte slice contain a gzip compressed representation of the
+	// YANG schema from which the Go code was generated. When uncompressed the
+	// contents of the byte slice is a JSON document containing an object, keyed
+	// on the name of the generated struct, and containing the JSON marshalled
+	// contents of a goyang yang.Entry struct, which defines the schema for the
+	// fields within the struct.
+	ySchema = []byte{
+		0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdf, 0x6f, 0xda, 0x30,
+		0x10, 0x7e, 0xcf, 0x5f, 0x61, 0xf9, 0x99, 0x09, 0xe2, 0x41, 0xe9, 0xf2, 0xc6, 0xda, 0x4d, 0x93,
+		0xda, 0x6e, 0xd3, 0xd6, 0xf7, 0xca, 0x4a, 0x0e, 0x6a, 0x0d, 0x6c, 0x64, 0x3b, 0x5b, 0xa3, 0x89,
+		0xff, 0x7d, 0x22, 0xa1, 0xf9, 0x45, 0x12, 0xdb, 0x30, 0x69, 0x4c, 0xf2, 0x23, 0xf6, 0x5d, 0xee,
+		0xbb, 0xfb, 0xee, 0x72, 0xf9, 0xc4, 0xef, 0x00, 0x21, 0x84, 0xf0, 0x67, 0xba, 0x01, 0x1c, 0x21,
+		0x9c, 0xc0, 0x4f, 0x16, 0x03, 0x1e, 0x15, 0xa7, 0x77, 0x8c, 0x27, 0x38, 0x42, 0xe1, 0xe1, 0xe7,
+		0x8d, 0xe0, 0x4b, 0xb6, 0xc2, 0x11, 0x9a, 0x1c, 0x0e, 0x6e, 0x99, 0xc4, 0x11, 0x2a, 0x1e, 0x91,
+		0x1f, 0xc4, 0x82, 0x6b, 0xca, 0x38, 0xc8, 0xb0, 0x71, 0xde, 0x08, 0x51, 0xb3, 0x19, 0x35, 0x2d,
+		0x9a, 0xe1, 0xca, 0xe3, 0x76, 0xd8, 0xf2, 0xe2, 0xab, 0x84, 0x25, 0x7b, 0x39, 0x8a, 0xd4, 0x8a,
+		0x16, 0xb7, 0xc2, 0xe4, 0xd7, 0xdf, 0x45, 0x2a, 0x63, 0xe8, 0x74, 0x2d, 0xa0, 0x40, 0xf6, 0x4b,
+		0xc8, 0x3d, 0x1a, 0xbc, 0x2d, 0xa2, 0x8c, 0xba, 0x0d, 0x3f, 0x51, 0xb5, 0x90, 0xab, 0x74, 0x03,
+		0x5c, 0xe3, 0x08, 0x69, 0x99, 0x42, 0x8f, 0x61, 0xcd, 0x2a, 0x07, 0x75, 0x64, 0xb5, 0x6b, 0x9c,
+		0xec, 0x5a, 0xb9, 0xb6, 0x4b, 0x5d, 0x5e, 0xac, 0x99, 0xd2, 0x61, 0x7f, 0x22, 0xaf, 0x75, 0x28,
+		0xcc, 0x7a, 0xb0, 0x75, 0x17, 0xde, 0x48, 0x80, 0x0d, 0x11, 0x96, 0x84, 0xd8, 0x12, 0xe3, 0x4c,
+		0x90, 0x33, 0x51, 0xf6, 0x84, 0x75, 0x13, 0xd7, 0x43, 0xa0, 0x91, 0xc8, 0x8a, 0x50, 0xa0, 0xcb,
+		0x37, 0xc3, 0xac, 0x1e, 0xb3, 0x5b, 0xf9, 0x18, 0xb2, 0x3a, 0x50, 0x3d, 0x31, 0x98, 0x95, 0x94,
+		0x87, 0x06, 0x43, 0x0b, 0xea, 0x1d, 0x5b, 0xc0, 0xb5, 0x15, 0x4e, 0x6e, 0x89, 0x93, 0x5b, 0xc3,
+		0xbd, 0x45, 0x86, 0x5b, 0xc5, 0xd0, 0x32, 0x65, 0xb8, 0xc7, 0x6c, 0x0b, 0x6e, 0x95, 0x56, 0x5a,
+		0x32, 0xbe, 0xb2, 0x29, 0xf6, 0xeb, 0x2b, 0xe0, 0xfa, 0x2c, 0x84, 0xf7, 0x4c, 0xe9, 0x85, 0xd6,
+		0xd2, 0x0e, 0xe5, 0x03, 0xe3, 0x1f, 0xd6, 0xb0, 0x2f, 0xa0, 0x32, 0xb7, 0x64, 0xe1, 0x41, 0x5f,
+		0x6a, 0x1e, 0xe1, 0xf5, 0x74, 0x7a, 0x35, 0x9f, 0x4e, 0x27, 0xf3, 0xb7, 0xf3, 0xc9, 0xbb, 0xd9,
+		0x2c, 0xbc, 0x0a, 0x67, 0x16, 0x0f, 0xf9, 0x22, 0x13, 0x90, 0x90, 0xbc, 0xcf, 0x70, 0x84, 0x78,
+		0xba, 0x5e, 0x07, 0xa7, 0x31, 0x36, 0x50, 0x8b, 0x7c, 0x1e, 0x1d, 0xc7, 0xf7, 0xaf, 0x4f, 0x2e,
+		0xf1, 0x93, 0x7b, 0x31, 0x93, 0xfb, 0x40, 0x79, 0x42, 0xb5, 0x90, 0x99, 0xc5, 0x1b, 0xf5, 0x02,
+		0xa6, 0xfc, 0xe4, 0x9e, 0x27, 0x6e, 0x3d, 0x4f, 0xfc, 0xb6, 0xf2, 0xdb, 0xea, 0x9f, 0xf4, 0xb1,
+		0xd3, 0x27, 0xdb, 0x1d, 0x64, 0xa6, 0xb7, 0xb4, 0xdd, 0xe6, 0xb3, 0xdf, 0x78, 0x67, 0x6d, 0x3a,
+		0xbb, 0x0d, 0xd7, 0x97, 0xed, 0x82, 0x73, 0xa1, 0xa9, 0x66, 0x82, 0x0f, 0xe7, 0xa2, 0xe2, 0x67,
+		0xd8, 0xd0, 0x2d, 0xd5, 0xcf, 0xfb, 0xe2, 0x8c, 0x35, 0x28, 0x3d, 0xae, 0xb4, 0xdd, 0xd8, 0xf4,
+		0x35, 0xba, 0x67, 0x3b, 0x8d, 0x35, 0x3f, 0x70, 0xff, 0x08, 0x4a, 0x3f, 0xdd, 0x94, 0xee, 0x4f,
+		0xf7, 0xb9, 0x7b, 0x60, 0x47, 0xde, 0xb0, 0x74, 0x32, 0x24, 0x64, 0x48, 0xa4, 0x4b, 0x3d, 0x0e,
+		0x42, 0x6f, 0x82, 0xae, 0xa0, 0xd5, 0x60, 0x55, 0x1a, 0x98, 0x58, 0xe8, 0x64, 0xe2, 0x75, 0xb2,
+		0xd7, 0xc9, 0x5e, 0x27, 0x7b, 0x9d, 0xec, 0xbf, 0x3c, 0xbc, 0x4e, 0xf6, 0x3a, 0xd9, 0xeb, 0x64,
+		0xaf, 0x93, 0xbd, 0x4e, 0xf6, 0xdb, 0xca, 0x6f, 0x2b, 0xaf, 0x93, 0xff, 0x7b, 0x9d, 0x4c, 0xce,
+		0xd3, 0xc9, 0xe4, 0x62, 0x74, 0x32, 0x71, 0xd5, 0xc9, 0xa4, 0x57, 0x27, 0x07, 0x35, 0x70, 0x7d,
+		0xa0, 0x30, 0x53, 0x1f, 0xe9, 0x0f, 0xf8, 0x26, 0xc4, 0xf1, 0x70, 0xb7, 0x81, 0xe2, 0xfa, 0x55,
+		0x03, 0xd1, 0x6d, 0xf1, 0x6f, 0x77, 0x11, 0x30, 0xd8, 0xfd, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01,
+		0x00, 0x00, 0xff, 0xff, 0x0c, 0xf4, 0xf2, 0x38, 0x0c, 0x1f, 0x00, 0x00,
+	}
+)
+
+// ΛEnumTypes is a map, keyed by a YANG schema path, of the enumerated types that
+// correspond with the leaf. The type is represented as a reflect.Type. The naming
+// of the map ensures that there are no clashes with valid YANG identifiers.
+var ΛEnumTypes = map[string][]reflect.Type{}